From d9649564199a7220e70716aa0999c6fddb0efadc Mon Sep 17 00:00:00 2001 From: Joseph Spiros Date: Thu, 4 Sep 2003 01:36:01 +0000 Subject: [PATCH] Adding HotKeys to ITKit... This is the new HotKey code by Quentin of RogueAmoeba, added to ITKit with his permission. Also added support for non-modifier FKeys as global HotKeys. --- EffectSupport.txt | 3 +- English.lproj/ITKeyCodes.plist | 103 +++++++ English.lproj/ITKeyComboPanel.nib/classes.nib | 18 ++ English.lproj/ITKeyComboPanel.nib/info.nib | 26 ++ English.lproj/ITKeyComboPanel.nib/objects.nib | Bin 0 -> 2486 bytes .../ITKeyComboPanel.nib/objects.nib~ | Bin 0 -> 2486 bytes English.lproj/Localizable.strings | 75 +++++ French.lproj/ITKeyCodes.plist | 103 +++++++ French.lproj/ITKeyComboPanel.nib/classes.nib | 18 ++ French.lproj/ITKeyComboPanel.nib/info.nib | 26 ++ .../ITKeyComboPanel.nib/keyedobjects.nib | Bin 0 -> 6271 bytes .../ITKeyComboPanel.nib/keyedobjects.nib~ | Bin 0 -> 6271 bytes French.lproj/Localizable.strings | Bin 0 -> 6468 bytes German.lproj/ITKeyCodes.plist | 103 +++++++ German.lproj/ITKeyComboPanel.nib/classes.nib | 18 ++ German.lproj/ITKeyComboPanel.nib/info.nib | 26 ++ German.lproj/ITKeyComboPanel.nib/objects.nib | Bin 0 -> 2514 bytes German.lproj/ITKeyComboPanel.nib/objects.nib~ | Bin 0 -> 2514 bytes German.lproj/Localizable.strings | 39 +++ Graphics/ITKeyboardIcon.tiff | Bin 0 -> 2646 bytes Graphics/URLTextViewHand.tiff | Bin 0 -> 464 bytes ITHotKey.h | 35 +++ ITHotKey.m | 91 ++++++ ITHotKeyCenter.h | 27 ++ ITHotKeyCenter.m | 265 ++++++++++++++++++ ITKeyBroadcaster.h | 19 ++ ITKeyBroadcaster.m | 73 +++++ ITKeyCombo.h | 38 +++ ITKeyCombo.m | 177 ++++++++++++ ITKeyComboPanel.h | 40 +++ ITKeyComboPanel.m | 157 +++++++++++ ITKit.h | 5 + Japanese.lproj/ITKeyCodes.plist | 103 +++++++ .../ITKeyComboPanel.nib/classes.nib | 18 ++ Japanese.lproj/ITKeyComboPanel.nib/info.nib | 26 ++ .../ITKeyComboPanel.nib/objects.nib | Bin 0 -> 2486 bytes Japanese.lproj/Localizable.strings | Bin 0 -> 5096 bytes Showcase/English.lproj/InfoPlist.strings | Bin 540 -> 277 bytes Showcase/main.m | 2 +- 39 files changed, 1631 insertions(+), 3 deletions(-) create mode 100755 English.lproj/ITKeyCodes.plist create mode 100755 English.lproj/ITKeyComboPanel.nib/classes.nib create mode 100755 English.lproj/ITKeyComboPanel.nib/info.nib create mode 100755 English.lproj/ITKeyComboPanel.nib/objects.nib create mode 100755 English.lproj/ITKeyComboPanel.nib/objects.nib~ create mode 100755 English.lproj/Localizable.strings create mode 100755 French.lproj/ITKeyCodes.plist create mode 100755 French.lproj/ITKeyComboPanel.nib/classes.nib create mode 100755 French.lproj/ITKeyComboPanel.nib/info.nib create mode 100755 French.lproj/ITKeyComboPanel.nib/keyedobjects.nib create mode 100755 French.lproj/ITKeyComboPanel.nib/keyedobjects.nib~ create mode 100755 French.lproj/Localizable.strings create mode 100755 German.lproj/ITKeyCodes.plist create mode 100755 German.lproj/ITKeyComboPanel.nib/classes.nib create mode 100755 German.lproj/ITKeyComboPanel.nib/info.nib create mode 100755 German.lproj/ITKeyComboPanel.nib/objects.nib create mode 100755 German.lproj/ITKeyComboPanel.nib/objects.nib~ create mode 100755 German.lproj/Localizable.strings create mode 100755 Graphics/ITKeyboardIcon.tiff create mode 100755 Graphics/URLTextViewHand.tiff create mode 100755 ITHotKey.h create mode 100755 ITHotKey.m create mode 100755 ITHotKeyCenter.h create mode 100755 ITHotKeyCenter.m create mode 100755 ITKeyBroadcaster.h create mode 100755 ITKeyBroadcaster.m create mode 100755 ITKeyCombo.h create mode 100755 ITKeyCombo.m create mode 100755 ITKeyComboPanel.h create mode 100755 ITKeyComboPanel.m create mode 100755 Japanese.lproj/ITKeyCodes.plist create mode 100755 Japanese.lproj/ITKeyComboPanel.nib/classes.nib create mode 100755 Japanese.lproj/ITKeyComboPanel.nib/info.nib create mode 100755 Japanese.lproj/ITKeyComboPanel.nib/objects.nib create mode 100755 Japanese.lproj/Localizable.strings diff --git a/EffectSupport.txt b/EffectSupport.txt index d380500..ca86e87 100755 --- a/EffectSupport.txt +++ b/EffectSupport.txt @@ -1,4 +1,4 @@ -POSITIONS: +þÿPOSITIONS: +-------------------+ | A B C | @@ -32,4 +32,3 @@ Pos. | Possible Effects + = Maybe (Future) H | 0 1 2 - + I | 0 1 2 3 4 - diff --git a/English.lproj/ITKeyCodes.plist b/English.lproj/ITKeyCodes.plist new file mode 100755 index 0000000..40d44b6 --- /dev/null +++ b/English.lproj/ITKeyCodes.plist @@ -0,0 +1,103 @@ +{ + 0 = "A"; + 1 = "S"; + 2 = "D"; + 3 = "F"; + 4 = "H"; + 5 = "G"; + 6 = "Z"; + 7 = "X"; + 8 = "C"; + 9 = "V"; + 10 = "$"; + 11 = "B"; + 12 = "Q"; + 13 = "W"; + 14 = "E"; + 15 = "R"; + 16 = "Y"; + 17 = "T"; + 18 = "1"; + 19 = "2"; + 20 = "3"; + 21 = "4"; + 22 = "6"; + 23 = "5"; + 24 = "="; + 25 = "9"; + 26 = "7"; + 27 = "-"; + 28 = "8"; + 29 = "0"; + 30 = "\]"; + 31 = "O"; + 32 = "U"; + 33 = "\["; + 34 = "I"; + 35 = "P"; + 36 = "Return"; + 37 = "L"; + 38 = "J"; + 39 = "\'"; + 40 = "K"; + 41 = ";"; + 42 = "\\"; + 43 = ","; + 44 = "\/"; + 45 = "N"; + 46 = "M"; + 47 = "."; + 48 = "Tab"; + 49 = "Space"; + 50 = "\`"; + 51 = "Delete"; + 53 = "ESC"; + 55 = "Command"; + 56 = "Shift"; + 57 = "Caps Lock"; + 58 = "Option"; + 59 = "Control"; + 65 = "Pad ."; + 67 = "Pad *"; + 69 = "Pad +"; + 71 = "Clear"; + 75 = "Pad /"; + 76 = "Pad Enter"; + 78 = "Pad -"; + 81 = "Pad ="; + 82 = "Pad 0"; + 83 = "Pad 1"; + 84 = "Pad 2"; + 85 = "Pad 3"; + 86 = "Pad 4"; + 87 = "Pad 5"; + 88 = "Pad 6"; + 89 = "Pad 7"; + 91 = "Pad 8"; + 92 = "Pad 9"; + 96 = "F5"; + 97 = "F6"; + 98 = "F7"; + 99 = "F3"; + 100 = "F8"; + 101 = "F9"; + 103 = "F11"; + 105 = "F13"; + 107 = "F14"; + 109 = "F10"; + 111 = "F12"; + 113 = "F15"; + 114 = "Ins"; + 115 = "Home"; + 116 = "Page Up"; + 117 = "Del"; + 118 = "F4"; + 119 = "End"; + 120 = "F2"; + 121 = "Page Down"; + 122 = "F1"; + 123 = "Left Arrow"; + 124 = "Right Arrow"; + 125 = "Down Arrow"; + 126 = "Up Arrow"; +} \ No newline at end of file diff --git a/English.lproj/ITKeyComboPanel.nib/classes.nib b/English.lproj/ITKeyComboPanel.nib/classes.nib new file mode 100755 index 0000000..0ab0cc6 --- /dev/null +++ b/English.lproj/ITKeyComboPanel.nib/classes.nib @@ -0,0 +1,18 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = ITKeyBroadcaster; LANGUAGE = ObjC; SUPERCLASS = NSButton; }, + { + ACTIONS = {cancel = id; clear = id; ok = id; }; + CLASS = ITKeyComboPanel; + LANGUAGE = ObjC; + OUTLETS = { + mComboField = NSTextField; + mKeyBcaster = ITKeyBroadcaster; + mTitleField = NSTextField; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/English.lproj/ITKeyComboPanel.nib/info.nib b/English.lproj/ITKeyComboPanel.nib/info.nib new file mode 100755 index 0000000..d6ed0ab --- /dev/null +++ b/English.lproj/ITKeyComboPanel.nib/info.nib @@ -0,0 +1,26 @@ + + + + + IBDocumentLocation + 109 47 356 240 0 0 1280 1002 + IBFramework Version + 291.0 + IBGroupedObjects + + 10 + + 22 + 27 + + + IBLastGroupID + 11 + IBOpenObjects + + 19 + + IBSystem Version + 6L60 + + diff --git a/English.lproj/ITKeyComboPanel.nib/objects.nib b/English.lproj/ITKeyComboPanel.nib/objects.nib new file mode 100755 index 0000000000000000000000000000000000000000..570f426881cd0102568c60ca205c143b901fa73f GIT binary patch literal 2486 zcmZ`*-*4Mg6uwT<^fzm@wy-e?!v?5>tKMK`P218NH8mXf^0#uq@2>Qb9p=p^oYiaL`)q zMhJYZI4nkhK3+5oqM>hjm@G6C-RVh*2&KfP{}EMDVn|@#_w2pFVmQyoRa&b>l0?H+ypBnRrHRUyK{+p)x854bF3Rn7Bim&wVLBx;X`D-$i0rKvx;8Yaz z0XaUS<3d4{MGcq4dAukpKy+1;8G_<0(Z|G>V-`U0IzVvttPjBnAA0yaBrtBuk(o>QNd7@FBXWv{*23js@DI_?5)>SoB^!OhdD?U!Ol& zzady`9NqW{w)F+uSdgu)w-M~IDrG8+0kLQcEBV7qfYYUeDBTGli3E^zLAi^(-p5+W z*j__-?}N!rW^jLQ(@$~pU~T~^M!V4Tg_bFAUtTwVEZ2EHxnL!-a-krVp!Br7{eN_Yz3dGbzYm$j>4#7IK z2fzig&@Xn!mpT|(S^zt1LX(q+4IpD&R_5n)Qq(g0XesQcZYSI3FaFHP3e0lt71!Qz zZPyR=V^zzLQVQqtS=qp*@VH8QRh3;CzFa9n=oK^EO#M6e%@SkuI$wnd&{-AUAy7ho@=kW_M>I{q3d+pkHB7=Z_Rd~ zzyHFs>}{9<`E3f!sAaFi6kLNoZ{7scFb-})%ielwKddjaDMpP~3*vN119ICd{wr|H z!1@jhn)c3Ewg=(6;;*lRoOwU2n=Q(ot&_xJ^G=S9yu=50Uk{VRIAFL@8&@SGv<(P3}v msJAS5jc2{pBi_oObH)+uod>M``=;XDg9#lJphWa}%lZ!ihurZ1 literal 0 HcmV?d00001 diff --git a/English.lproj/ITKeyComboPanel.nib/objects.nib~ b/English.lproj/ITKeyComboPanel.nib/objects.nib~ new file mode 100755 index 0000000000000000000000000000000000000000..645b6c35a2d972dbc1c39bd3322c221db14d0325 GIT binary patch literal 2486 zcmZ`*-*4Mg6uwT<^fzm@wy-e?!v?5>t1#?2hTIL9) zok=M{bkiW(Fs0F?^pT2-(1Tr+N7f}HzNJSYWqxX>ktqy$*mWA0~Dk!KX)KDz~4%(~T z2!XFK!I?f@qN~_gKlIYm3l}Zrn7_gvJuG7wZUR7DVF$?{2L|C$yVo&JxDzbS~qBq=Q z5a8&!Ai#kjz)1*3LtjE`LYNAYulGVgEGPs7vCH&_mj6Ou&t>rca?}4hbN%L1u0<2F zt^mEjxtrXx^;`S=sWN|9Q(EKZziFDEvCvnRaHXH6_)7mCMEnSzza~Q&An)F4oQh%r zAjfA6oX?B0sN8H4PFt>mdqg`nFLd%rDFRz$!3GrlpfwIovExm zhb2-l6dVSDs#beJvgC|Pf?5O}VT|TV#M3e57H70=o6 z94`p-g6K&})a^okYk31V6LYXPCn0F2l9rfjby z&a5WR*)GSI+8+v*kJ4o>TW6-*eVI=h3qB&~v+;M_{ilu;#eX z-+$rR&Nj?|{5Az<)OOZk3a-I`H*bPz7&mT0+u3?*KddjaDMpP~^Wt<-2XZ?r!7Fgf z!1@jhn)c4vjt}GJ9br55{mY}k(ckVOXs@{)jIO}Cq?&GA$?&7Yw*WCL^ne#zuoTSo zS2ld+N|?-#F{=N)vCf9=3YX-@RGm#l6%ES(BXU*l#=Sw~zSYQ-0^D|M&%e=SAN?=5Igm|10{tFZmDO@ZBN*(P4k< msJ|@u^=JLnBmT;ud&U)M``=;XDg9!r^ph%2)+x`!JOx*?m literal 0 HcmV?d00001 diff --git a/English.lproj/Localizable.strings b/English.lproj/Localizable.strings new file mode 100755 index 0000000..57d9d74 --- /dev/null +++ b/English.lproj/Localizable.strings @@ -0,0 +1,75 @@ +/* AppleScript Error Alert */ +"%@\nFound at character index, length: %d, %d" = "%@\nFound at character index, length: %d, %d"; +"AppleScript Error %@" = "AppleScript Error %@"; + +/* File Size Abbrev. */ +"b" = "b"; +"GB" = "GB"; +"KB" = "KB"; +"MB" = "MB"; + +/* General Error Alert */ +"Details..." = "Details..."; +"Error" = "Error"; +"Exception Details" = "Exception Details"; +"Name: %@\nReason: %@\nStack Trace:\n%@\n\nInfo:\n%@\n" = "Name: %@\nReason: %@\nStack Trace:\n%@\n\nInfo:\n%@\n"; + +/* Hot Keys: Key Combo text for 'empty' combo */ +"(None)" = "(None)"; + +/* Isis: Alert Body */ +"The latest version of %@ is %@. Choose \"More Info\" to open a web page from which you can download or get information about this new version." = "The latest version of %@ is %@. Choose \"More Info\" to open a web page from which you can download or get information about this new version."; + +/* Isis: Alert Title */ +"A new version of %@ is now available." = "A new version of %@ is now available."; +"You're currently using the most up-to-date version of %@." = "You're currently using the most up-to-date version of %@."; + +/* Isis: Button */ +"Download now" = "Download now"; +"More Info..." = "More Info..."; +"Update Later" = "Update Later"; + +/* Isis: Error Msg */ +"Software Update Failed: Couldn't load remote version info" = "Software Update Failed: Couldn't load remote version info"; +"Software Update Failed: Failed to find bundle with given identifier" = "Software Update Failed: Failed to find bundle with given identifier"; + +/* Noise Alert + AppleScript Error Alert + General Error Alert + Trash Alert + Isis: Button */ +"OK" = "OK"; + +/* Noise Alert */ +"Do Not Adjust Your Speakers" = "Do Not Adjust Your Speakers"; +"Purchase" = "Purchase"; +"You are using an UNREGISTERED copy of %@. Because of this, the quality of the audio being hijacked will now begin deteriorating noticeably. Nothing is wrong with your speakers - you simply need to register to retain completely full-quality audio" = "You are using an UNREGISTERED copy of %@. Because of this, the quality of the audio being hijacked will now begin deteriorating noticeably. Nothing is wrong with your speakers - you simply need to register to retain completely full-quality audio"; + +/* Registration Status */ +"Be sure to enter your name and code exactly as they were sent to you." = "Be sure to enter your name and code exactly as they were sent to you."; +"Thanks for registering!" = "Thanks for registering!"; + +/* Timers: */ +"Everyday" = "Everyday"; +"Weekdays" = "Weekdays"; +"Weekends" = "Weekends"; + +/* Timers: Abbrev. */ +"Fr" = "Fr"; +"Mo" = "Mo"; +"Sa" = "Sa"; +"Su" = "Su"; +"Th" = "Th"; +"Tu" = "Tu"; +"We" = "We"; + +/* Timers: No Days Selected */ +"Never" = "Never"; + +/* Track Time Formatter: Time data is not avaliable */ +"N/A" = "N/A"; + +/* Trash Alert */ +"This copy of %@ appears to be in the Trash" = "This copy of %@ appears to be in the Trash"; +"You probably want to be running some other copy of %@, and not this one." = "You probably want to be running some other copy of %@, and not this one."; + diff --git a/French.lproj/ITKeyCodes.plist b/French.lproj/ITKeyCodes.plist new file mode 100755 index 0000000..40d44b6 --- /dev/null +++ b/French.lproj/ITKeyCodes.plist @@ -0,0 +1,103 @@ +{ + 0 = "A"; + 1 = "S"; + 2 = "D"; + 3 = "F"; + 4 = "H"; + 5 = "G"; + 6 = "Z"; + 7 = "X"; + 8 = "C"; + 9 = "V"; + 10 = "$"; + 11 = "B"; + 12 = "Q"; + 13 = "W"; + 14 = "E"; + 15 = "R"; + 16 = "Y"; + 17 = "T"; + 18 = "1"; + 19 = "2"; + 20 = "3"; + 21 = "4"; + 22 = "6"; + 23 = "5"; + 24 = "="; + 25 = "9"; + 26 = "7"; + 27 = "-"; + 28 = "8"; + 29 = "0"; + 30 = "\]"; + 31 = "O"; + 32 = "U"; + 33 = "\["; + 34 = "I"; + 35 = "P"; + 36 = "Return"; + 37 = "L"; + 38 = "J"; + 39 = "\'"; + 40 = "K"; + 41 = ";"; + 42 = "\\"; + 43 = ","; + 44 = "\/"; + 45 = "N"; + 46 = "M"; + 47 = "."; + 48 = "Tab"; + 49 = "Space"; + 50 = "\`"; + 51 = "Delete"; + 53 = "ESC"; + 55 = "Command"; + 56 = "Shift"; + 57 = "Caps Lock"; + 58 = "Option"; + 59 = "Control"; + 65 = "Pad ."; + 67 = "Pad *"; + 69 = "Pad +"; + 71 = "Clear"; + 75 = "Pad /"; + 76 = "Pad Enter"; + 78 = "Pad -"; + 81 = "Pad ="; + 82 = "Pad 0"; + 83 = "Pad 1"; + 84 = "Pad 2"; + 85 = "Pad 3"; + 86 = "Pad 4"; + 87 = "Pad 5"; + 88 = "Pad 6"; + 89 = "Pad 7"; + 91 = "Pad 8"; + 92 = "Pad 9"; + 96 = "F5"; + 97 = "F6"; + 98 = "F7"; + 99 = "F3"; + 100 = "F8"; + 101 = "F9"; + 103 = "F11"; + 105 = "F13"; + 107 = "F14"; + 109 = "F10"; + 111 = "F12"; + 113 = "F15"; + 114 = "Ins"; + 115 = "Home"; + 116 = "Page Up"; + 117 = "Del"; + 118 = "F4"; + 119 = "End"; + 120 = "F2"; + 121 = "Page Down"; + 122 = "F1"; + 123 = "Left Arrow"; + 124 = "Right Arrow"; + 125 = "Down Arrow"; + 126 = "Up Arrow"; +} \ No newline at end of file diff --git a/French.lproj/ITKeyComboPanel.nib/classes.nib b/French.lproj/ITKeyComboPanel.nib/classes.nib new file mode 100755 index 0000000..0ab0cc6 --- /dev/null +++ b/French.lproj/ITKeyComboPanel.nib/classes.nib @@ -0,0 +1,18 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = ITKeyBroadcaster; LANGUAGE = ObjC; SUPERCLASS = NSButton; }, + { + ACTIONS = {cancel = id; clear = id; ok = id; }; + CLASS = ITKeyComboPanel; + LANGUAGE = ObjC; + OUTLETS = { + mComboField = NSTextField; + mKeyBcaster = ITKeyBroadcaster; + mTitleField = NSTextField; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/French.lproj/ITKeyComboPanel.nib/info.nib b/French.lproj/ITKeyComboPanel.nib/info.nib new file mode 100755 index 0000000..28d44b9 --- /dev/null +++ b/French.lproj/ITKeyComboPanel.nib/info.nib @@ -0,0 +1,26 @@ + + + + + IBDocumentLocation + 109 47 356 240 0 0 1280 1002 + IBFramework Version + 291.0 + IBGroupedObjects + + 11 + + 22 + 27 + + + IBLastGroupID + 12 + IBOpenObjects + + 19 + + IBSystem Version + 6L60 + + diff --git a/French.lproj/ITKeyComboPanel.nib/keyedobjects.nib b/French.lproj/ITKeyComboPanel.nib/keyedobjects.nib new file mode 100755 index 0000000000000000000000000000000000000000..70e77b22cfa4d58477da0bb252bf16a662de024f GIT binary patch literal 6271 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 MU!C@w{O_6YUqdZP;{X5v literal 0 HcmV?d00001 diff --git a/French.lproj/ITKeyComboPanel.nib/keyedobjects.nib~ b/French.lproj/ITKeyComboPanel.nib/keyedobjects.nib~ new file mode 100755 index 0000000000000000000000000000000000000000..682f3a964973623b0e7d3d0bbefa62d797352827 GIT binary patch literal 6271 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 N|J7-~$^V}5{{>piN%#N& literal 0 HcmV?d00001 diff --git a/French.lproj/Localizable.strings b/French.lproj/Localizable.strings new file mode 100755 index 0000000000000000000000000000000000000000..a0a322f8f4f3745c73299eb544d884b50a45fd21 GIT binary patch literal 6468 zcmbW5-A-Fq5QXX{0Y} zm>=iyhuXK2?xp+bNqU=xX;W)1_21XJUS4sK-sx(r?}6^w*OF9L9H!sXce+E`Fdb|5 zUHV@4_cg~j|M&F&qrT;Yt|V~ARr;jyo~~MwTu%5?^M@Mir`5T0M){me&0l6c=1=<} zTk|z2U~$pT_=MbL`@M%VR;GAwN=NK(3GYGrkgwWlUmvWvN{=)X81Gl-jdX2Yx6;#U zd`sBG%!|g%i)v=4F|+e!CbZhp*+YHt+Nm_Kb<4fKuC)`b#g+@{%%@F$RTKgio ztgo>QTQ(Fc2Reml97x}xv}&GO_BYRSBoJ%O{ULc*dY?(MW5H3pr~95P;hcKBlkGT2 z?{zwHNKCVn$d3%*dRyNk?QYH#4R$jyfpvFpUA#YbTa+ZB?qigaGJG?rg^g+TpqUYNx1|Foga_&Ii zVIHq@U|Tv2rh3%e@>FvA(y(MeR}4X}oC+(nyU5yI>1v#1I4(xg7xs9fU*!6lOnRpM zBYiHil(*84*f(E<<sa5E#i;G69}xrE6X9>;GJL$63OW_S%!zl01-o?=*j-v0x?k z_H}#3HBqMm+&NPBPZLymOF8s9&L@D?!aat@KBhj^{YTwy=&|p6J8% zFv|ro+p!4muZiKV5S(NrN))%V{6${Gn%USz6a0;ZW?13^Y-^vto??5K-iy56&t3)# zqNT_-L;sqQSQWCy2w!qN%yyBTU`-4k>zX)a-I;bdJ1>Run#M=^?aKn=I~$9|?%Jw1 z`D{Ey7EoP?N5_Nv32M1L1c#%O*#SGhHvTzrnJ=H_lhK|`4vt&beKVu&rNZ#th0z){ zXP$LtYv!^%i*@$RYhhb3CGSCZoEgkr(~hG3M4FeJpc0R@Yq`xE*~8|j9pQ~%!}5+S zKhi1JSqh$R>aeMCcQpN6SEwhK@=#y+txmlYEJzd)CyOH@Sg~OGG3WlFe(l}x^w~5j zoY^P&M3{lP2IFHdY*8YF*kHFi#6{d2oJFO%n+@P_>LM{uF3jf8e?_fEF>29~U}5-SBI)?qSxvU0LsL)q%f9pM ztcE@9A$zHoLw!DFeyj6xS2NE4`Wa+Jd-yEtx$9^y-9_x$$|!-(ZJlnccF%W_(VmyJ zoqg|qYB6uTRG(Gi*>`taSh5e^Y32S3q}syjL|B_=&C|qvN0CVX`aXO8qB?O`5#Rf= z$2>|khGD6^{F5)R?V6;JIYb$pj~uhkt9z1V+S3dT7V>&)Mg?;Xsp|z^heLML zo}Mzc)H!$5S#RXKbR!&X(IxTp7?tQZt--fs3Dv5sgaeR3 z{R7v1$&5Niw{@afdi_JKp!GNXc#Ylz8`I#=9+fs`Q+&4@`8LZKdC`_U>oFAB~9^Vm`QqaX+D9i@SPc z*e1(55>nW|mSzzx7?w!5t#Xt9U~k{TO~mv|eRGJjj*f-j&dLmP{f7@G6$MvVx^;KV5Ma1$O!wzY9w zvTK+}Zxk!Mn+X>0W~LvC-`E#V_}CP9W1%_hn~LLiv|_BN8)%pHDE54ohDK#RhR7%6 z)b*~L;{tiEnx)chNN2`xbVg6Vg;}~^q8pshJvzQpp?=ZKp)B*>x&l7WyE!kkcZY`; ziBRmNqPcQ~9IWYUPtjt2<~F;Qz0up0g+=C@>SUe}%FNG-lF+FmEz6AWtZgT+iua}K zvL*K5>$2y0bxyajXD7=pwwFD4{dV6`&ERId1-c#Wz(aoPO9hP_-PNeQTjW32KI0!= zT$#QhjrVMR=LV0Ev70*0oara_aqjjbp71T)0DHTtl0#&VpQ7mo;wie;>v3vVIPFS< z^*O6yq1g_w$N*`d=;~HF4!>!kzPLMc44O0OB>Wzz^ev^=EGRwGx_Coj`L3Q(9m#fg zgFeR{mpLN3Yq$>oIPQ@$o_0QdjxG!lecQQKjI<_t7uXLe;92WGRxHuEN8iJ{Onb|H z4*48azljT#JUBQ!1=ku$7_IrXl^8Kzi@UerE% N4I{OdSupTg`4@!REjs`J literal 0 HcmV?d00001 diff --git a/German.lproj/ITKeyCodes.plist b/German.lproj/ITKeyCodes.plist new file mode 100755 index 0000000..40d44b6 --- /dev/null +++ b/German.lproj/ITKeyCodes.plist @@ -0,0 +1,103 @@ +{ + 0 = "A"; + 1 = "S"; + 2 = "D"; + 3 = "F"; + 4 = "H"; + 5 = "G"; + 6 = "Z"; + 7 = "X"; + 8 = "C"; + 9 = "V"; + 10 = "$"; + 11 = "B"; + 12 = "Q"; + 13 = "W"; + 14 = "E"; + 15 = "R"; + 16 = "Y"; + 17 = "T"; + 18 = "1"; + 19 = "2"; + 20 = "3"; + 21 = "4"; + 22 = "6"; + 23 = "5"; + 24 = "="; + 25 = "9"; + 26 = "7"; + 27 = "-"; + 28 = "8"; + 29 = "0"; + 30 = "\]"; + 31 = "O"; + 32 = "U"; + 33 = "\["; + 34 = "I"; + 35 = "P"; + 36 = "Return"; + 37 = "L"; + 38 = "J"; + 39 = "\'"; + 40 = "K"; + 41 = ";"; + 42 = "\\"; + 43 = ","; + 44 = "\/"; + 45 = "N"; + 46 = "M"; + 47 = "."; + 48 = "Tab"; + 49 = "Space"; + 50 = "\`"; + 51 = "Delete"; + 53 = "ESC"; + 55 = "Command"; + 56 = "Shift"; + 57 = "Caps Lock"; + 58 = "Option"; + 59 = "Control"; + 65 = "Pad ."; + 67 = "Pad *"; + 69 = "Pad +"; + 71 = "Clear"; + 75 = "Pad /"; + 76 = "Pad Enter"; + 78 = "Pad -"; + 81 = "Pad ="; + 82 = "Pad 0"; + 83 = "Pad 1"; + 84 = "Pad 2"; + 85 = "Pad 3"; + 86 = "Pad 4"; + 87 = "Pad 5"; + 88 = "Pad 6"; + 89 = "Pad 7"; + 91 = "Pad 8"; + 92 = "Pad 9"; + 96 = "F5"; + 97 = "F6"; + 98 = "F7"; + 99 = "F3"; + 100 = "F8"; + 101 = "F9"; + 103 = "F11"; + 105 = "F13"; + 107 = "F14"; + 109 = "F10"; + 111 = "F12"; + 113 = "F15"; + 114 = "Ins"; + 115 = "Home"; + 116 = "Page Up"; + 117 = "Del"; + 118 = "F4"; + 119 = "End"; + 120 = "F2"; + 121 = "Page Down"; + 122 = "F1"; + 123 = "Left Arrow"; + 124 = "Right Arrow"; + 125 = "Down Arrow"; + 126 = "Up Arrow"; +} \ No newline at end of file diff --git a/German.lproj/ITKeyComboPanel.nib/classes.nib b/German.lproj/ITKeyComboPanel.nib/classes.nib new file mode 100755 index 0000000..0ab0cc6 --- /dev/null +++ b/German.lproj/ITKeyComboPanel.nib/classes.nib @@ -0,0 +1,18 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = ITKeyBroadcaster; LANGUAGE = ObjC; SUPERCLASS = NSButton; }, + { + ACTIONS = {cancel = id; clear = id; ok = id; }; + CLASS = ITKeyComboPanel; + LANGUAGE = ObjC; + OUTLETS = { + mComboField = NSTextField; + mKeyBcaster = ITKeyBroadcaster; + mTitleField = NSTextField; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/German.lproj/ITKeyComboPanel.nib/info.nib b/German.lproj/ITKeyComboPanel.nib/info.nib new file mode 100755 index 0000000..b48acd3 --- /dev/null +++ b/German.lproj/ITKeyComboPanel.nib/info.nib @@ -0,0 +1,26 @@ + + + + + IBDocumentLocation + 79 31 356 240 0 0 1024 746 + IBFramework Version + 313.0 + IBGroupedObjects + + 10 + + 22 + 27 + + + IBLastGroupID + 11 + IBOpenObjects + + 19 + + IBSystem Version + 6L60 + + diff --git a/German.lproj/ITKeyComboPanel.nib/objects.nib b/German.lproj/ITKeyComboPanel.nib/objects.nib new file mode 100755 index 0000000000000000000000000000000000000000..b88f6468c23c7fe60f9a2311947d3d4d8502c424 GIT binary patch literal 2514 zcmZ`*-EZ4e6u(Z=?{;fhTiBRHfWhcsEBgRV6=GS6N~>+@gabSvq&d!QXX^N7jzii< zha3L^QEJ67SyQzNEi2mEO-NLeShXQdmMS_V9wzaCcp2h}Co~Z1IM>%rQW&o4*!Sa{ z-#Nc?e%FyMV=jx+IYY-%#ti>Tg&3uDM?##4Po_S>vhj{&NGAH3()NVNM^LHEmyG6f z2FdWjp$ZMf*j8938oHuQ3l%E7x^p6V3eSy_Op2V9G^|=Biwa7&%@@Y=hCwt$X-7gF zC7PiVb%@f|g!qAi3-HvH5Z}YOEYZ?fN0lqEeSDBW)EB}yAE>cB}ZVU7T~!AS14o(w*`dQy}VE^u|La#2{d8~cU#!R z-IlV;CurN$R4gXTG6FXY=_pp!lMuV26eGeWj7AtbnA@2U15`mes?{)nu=utyh<2dj z?4vCo9eq>&xD_F^2mUu7qthslWTc=plF++Ihr0&P7%U4@JyeiUO{k$-1OQr#T?heI z79nIRiD!*51*_@ZU-)sd*i3X^G|?}E5Cq)oK|~Z;jv;}C05IztSuAf;+6~#04TWgz zz3TuVG8z|RYd;XiTxvQJF0{W!ro#D*6=e29PBq=}HgK!l*$|<5t-z)354K&t5Qv zbNg8(o!h?+?6m+K3X*&H9sSNNc?N4yQNd9LG^*h|jwU6@qc#I=q-YYOCOUQJmOj$? zQp^H)uK~Pc$2h!w9Nzy`(LoeP1c0aOaND7hcqZ1aqdE!QGH=Hw9zHv9pmw#HsNP@= zs~^7Z8%ESkMpGm9Gw++I*vAU6*!RTPBSGv>{U^wg220*`^xeHJ<4rXnq@Gj*x3)Nk zWU!hIO`d9)TK~F1^YU`3#@K@T1<4y#rCd%dNZBmb4=_D@5%%`_3KrLil$IF_y47&M zxj6{sFxbB>uE2StS$K9ge7B+E_*?fMF9(%H>8`C>oybVjSR{E}#$iypYPAQnPf9C< zmof+vhY5}DFJ%h3r{3s*AF6&!Z?FNK4Vovy1Bmbh$X&HMkPycd6>Cxk=gy{xq^FZ0 z{Fc=}8;v3q{dW^>`C&aY1R8*txGjR8UdWTL`=HD|+@XpM=Ar$4T&&l3_$l*!OhAqJ zVoJk`qM#6{2b2&flOTYsnrO+FSNP@f3ThUpvWfoaRsop09ax>&pqo2RrcyeV&tt7Y zu(O@u+mJbz9XNpeLq$uILK0`Ps$^hOcvPW1io%W(E&#F+df5!U!l4y^pG9by$HosY zpe@1@Z@DFbM%XrhA37+T-$T)2d=&3+U`Sp)wLH~ zd(CyaYzNH3p~uNRY}pUty@flmS;Yotpk=Sa3mmCI71$fi`;J<+2k*dqUBZu8_7V&= z9|xAb+Pn!?EWkTBfYS&(&oc|GGWO@9lLZax+g@WsO-2txgZ%U@g8L<>o%IUTQbI`u zCpP?O@SQ+(6MgTu5uf5?eU+7U<{?aGMpyy=x#F! zhYN+mA)QR;;hT!!lypcYnc+_V7;^?dR}|+NujP=}HtdBDdL2i+N6&fdd%eG--sTJ5 z(x5jlc#FHeg#pj)_t22H@x13f>pghgd$`M6+vBZ1?HqLkd*cVz)x8sOAHkRoeO(~> HjAi`;E41rS literal 0 HcmV?d00001 diff --git a/German.lproj/ITKeyComboPanel.nib/objects.nib~ b/German.lproj/ITKeyComboPanel.nib/objects.nib~ new file mode 100755 index 0000000000000000000000000000000000000000..b8cc980ec52b284004c4479301e87022cb51047a GIT binary patch literal 2514 zcmZ`*-EZ4e6u-_#zq_@pEo@98z+iN+m3@Gw3b8anrPa2y!T}x-(j4ceGj;6DaY*~< zaN|E9O05_sYpPbEWkp-N35jYFt2U&`QbmWv!z3OMFGD=>ga$$#=lZ%y3d2<$`+l7B zJLh-K?>f}2&*yMDuWMMy8o^%)7bS%3O7N4hsnjP})ZYD!|*uq#r*Hr}((wX4n zs-kPEJWNPig8x9mMR@8?@bBS#PF2!aL)8koSSj0x^hDvx_!mQRwxA0s8INh2Fc0S1 z6FhsY+MN_@IKju%xkDE#j*T30$>yl3MR+d56$lvIZ4M!NuPj!|^v^V50*xBn-7uZF z8?HEPg0yEc(Woej2;5MlaV*PY5W6ImLfjUNhA29i+nwNjRDL>YwIF~n*|u?rcCcz6 zAmNXWzbSs)h7j5Z|67mI8B{Zl$9faX#+LV%S< z2$@RaIelEha(eF>WCt=L~1o;*2`sxcNEH?Tv;YTF&gE-5ac|r$|~?wZzDmPgIcYPpU>+! zYr^9m9pJ?Tadt*i3rgBsYLXlEAPHnL9B0z!w$+=kvXicC&fh>VX;#XF8>OLs-V)nl zPcni~GO``lG7Aatv%;eIPhG$45mV|o$?%6yV@bg@h-+R1Yos%umn6zs)Ij(4awW4A zeN3)Epx&)auG;&7reh}=O#_Uk37|wqpTb=SvP2|Y=>=LSH3(|ltk@OuRRiku1%o?x zkXF*UgFC=p^T8oMxkum8?%Wb*u@d1W9HBrX3NGMCQh+=vv(QG8B2a1~nLD?%(XN-G zCct|Q;GHFc)9_%11gDSV*NU5kkBKtc5LC{vr~uaS6hkd^ViV& zVe7u3MBSt`HDf>fzJW^pv;a%}PmDd}$NtoRf*ftK87cTubVWltd#4NEvR3Rytpjn^L$ar<*;^$>e-91x6f0sn5GJ8k+PtfP4`<{ zLr@Mw13TjKoj03>Wp~qa8z@b@b^q~-Us;6g*{;>etT2OlwV;VO2ufG0^@8>ZX-Q?J z41&a9LZf?2sY32+G&69vH=_Clh zX%5UqA_ztP-9+1dXb%m81|TYKOW>yu^5p40D6C;;jKB?QXEaUiP(TK41>ewn<2n)#}1pg($K04DDQ)?n7}=FYKHO2guLtTYL> zcM^OXGUw0(2ata#DQUHs#MzuI=-A*MRY|WT(W8V3fXD@2HUh6OXr@zPMISix((omkP-N;&fPH3j|MU-We|V`YiZHiaI8(oavke|V=X(D^UzvztVPFK zckFJ<2D5PJF>;TZ)vX8a=uv2ppT0$KzhrmNUV&OlNGbos zh93pK6I9JW-+OJurr212b#;S!2&%KAw1EFywdrfSC@3P9{h>8F)F#SU(7X{s20RB- z1zpAtuD|^wG}-csX=aaf##$;3!fP=zd_lsmxrwP>ERuV{%RUrcQz@3>BcZ2 z{q%!p0?WCEH$YAeL(wEvRZdDdItxx{fxpoe6Y@A60UeI3qAEzNu845{`&!cBIQY#_U1R70G_a4IgpaN8I3HxAU0$=s9;|zx#K@-Fm@Y z9rcWJM?IOsY9E*f?>pLgA7-3PC`5BIq1``ops?c+9QZT>*Jx^FV(AsE-7uZyZS HYnuN6rw!|6 literal 0 HcmV?d00001 diff --git a/German.lproj/Localizable.strings b/German.lproj/Localizable.strings new file mode 100755 index 0000000..0e7f77c --- /dev/null +++ b/German.lproj/Localizable.strings @@ -0,0 +1,39 @@ +"%@\nFound at character index, length: %d, %d" = "%@\nFound at character index, length: %d, %d"; +"(None)" = "(Keine)"; +"A new version of %@ is now available." = "Eine neue Version von%@ ist verf\U00fcgbar."; +"AppleScript Error %@" = "AppleScript Fehler %@"; +"Be sure to enter your name and code exactly as they were sent to you." = "Geben Sie Namen und Code exakt so ein, wie er Ihnen zugeschickt wurde."; +"Details..." = "Details..."; +"Do Not Adjust Your Speakers" = "Passen Sie nicht Ihre Lautsprecher an"; +"Download now" = "Jetzt herunterladen"; +Error = Fehler; +Everyday = "T\U00e4glich"; +"Exception Details" = Ausnahmedetails; +Fr = Fr; +GB = GB; +KB = KB; +MB = MB; +Mo = Mo; +"More Info..." = "Mehr Info..."; +"N/A" = "N/V"; +"Name: %@\nReason: %@\nStack Trace:\n%@\n\nInfo:\n%@\n" = "Name: %@\nReason: %@\nStack Trace:\n%@\n\nInfo:\n%@\n"; +Never = Nie; +OK = OK; +Purchase = Kaufen; +Sa = Sa; +"Software Update Failed: Couldn't load remote version info" = "Software Aktualisierung fehlgeschlagen: Konnte Remote Version nicht auslesen"; +"Software Update Failed: Failed to find bundle with given identifier" = "Software Aktualisierung fehlgeschlagen: Konnte Bundle mit \U00fcbermitteltem Identifier nicht finden"; +Su = So; +Th = Do; +"Thanks for registering!" = "Danke f\U00fcr die Registrierung"; +"The latest version of %@ is %@. Choose \"More Info\" to open a web page from which you can download or get information about this new version." = "Die letzte Version von %@ ist %@. W\U00e4hlen Sie \"Mehr Info\", um zu einer Webseite zu gelangen von der Sie diese Version herunterladen k\U00f6nnen."; +"This copy of %@ appears to be in the Trash" = "Diese Kopie von %@ scheint im Papierkorb zu liegen."; +Tu = Di; +"Update Later" = "Sp\U00e4ter aktualisieren"; +We = Mi; +Weekdays = Wochentags; +Weekends = "Am Wochenende"; +"You are using an UNREGISTERED copy of %@. Because of this, the quality of the audio being hijacked will now begin deteriorating noticeably. Nothing is wrong with your speakers - you simply need to register to retain completely full-quality audio" = "Sie benutzen eine UNREGISTRIERTE Version von %@. Deshalb wird sich die Qualit\U00e4t des \U00fcbernommenen Audiomaterials jetzt h\U00f6rbar verschlechtern. Ihre Lautsprecher sind in Ordnung - Sie m\U00fcssen nur die Software registrieren, um die volle Qualit\U00e4t zur\U00fcck zu bekommen."; +"You probably want to be running some other copy of %@, and not this one." = "Sie m\U00f6chten sicherlich eine andere Version von %@ laufen lassen und nicht diese."; +"You're currently using the most up-to-date version of %@." = "Sie benutzen zur Zeit die aktuellste Version von %@."; +b = B; diff --git a/Graphics/ITKeyboardIcon.tiff b/Graphics/ITKeyboardIcon.tiff new file mode 100755 index 0000000000000000000000000000000000000000..b979bda51541c4313e4b51d602abdd01e0c6a7cc GIT binary patch literal 2646 zcmds3dr*{B6hGf0>)Mn_Dl|T(oyJDgG(&BitPIPT5J}B(w0|00cbZ8-VlmN-G5=7M zB6O9&QkgPJQxPd4e2hbCnpMKo@WkZ)bIgk5_m-Zv#7XTpkc%aYwMluX%>T9RCp zQk+~gg*^E^$|cDgQi`V(rIw@=r4~;w8MD+fI2_H|(Zd^{qaC-inlNi?ID^!n1s6R2 zP-~kv=nZ-T{!qyHC-_7DkSCz*3Yz_1y((ZCq%y=zufZkX?bKGjEp5Bo9(qH?&#XKI zU&w%QOC2ab13`F0M?$mqGhAEWd>B4G$O(i9x|yfFD_6%<+D)ypDW4G9Xg`Gw&C)}x zr8tU!5r6_^>5zh~p`;EPF!gQl!%N9WXvc5Z2F)(_Y{n7pe6+OF<}syf+Oji)fkPwHD?n=Jj^IBZ6O8Oy0}Ml0{5m0U@RD{Mg{&(eqk^tgbZNq;fkM{K4x z!i`!4jWhTfpW_SW@|eC&^liiy6E0J_jH|?T*okjYhj*Ck4`VItE448Ns5K0H#oiiu z_A)dv{xUA%Vizh&K`TB%B{HxJ-?IL%#@iTHqK(aC##a2!j8}1zrvUz9?0Nd15A%!U zDu<6%oLGTPX8)&+H5j^48=r@LhK@swYbKWBIJ2E)>{*-(!+Gxh^{+I=! zPVh84smD+Fk+cp!5EQTH#80rVW;8IrdVfHfu^4^dl6W^3p~h(7z3SB7Y^itEf-|g; zt1pA~WqELwUWhG51#9ocZr-4}#XY1Iq`OIXknZGL+fKTj_wy;Xl9qE0Z$h4u0jVc8 zV_T?-5j*gqu^Atr80&bq>#zo^c}Mx=`9=ZvZmc)9;A3MKGneaSD1eNR7)jlP8rH5f zs!6L@ow9kBJ*-~AN)^2EO2+J^tr}mNUNzK?`b-AP-SS9WVL7c;wCp3@Pr9EO_nBBt z+JS0+fU(u|tz_0GYGtC_%THi`d0d>9<<@tj*IL(hVPRN~ zCA9uwJ*TS0b?R-R4dA3rAKPASV3&MQ8x)ZzJ|cETw|5npp$X)t!k)eIM zIBki~PMU1#Ba)txos~2ran9^HFWGz6@l{#*Iv*BEbGR}Sr%g*y;Ta1voQhw+d?(Eg zq<*Bzb-nGTyJ$ydRyMs35r@okx*X)^h_5Zq&ZJ(OO}XFP`KG);$@6E%aOLgX&-4%N=r{q mvp+g&yt4eyOUyjUvY?$ZJO3Lr+CT08DDur;c#6*x-6-powiZA`8#6L-kdyAv|2guUhenE z(x{q?)*$X%UHcf$OhOU=C||847?c?*Ni#u#nhE7R|- zJ2}GmqU60|-ic>2H%0l*J1y>X?Y4=L^S8;bwnAL zoh{qlY5Dr@E + +#import "ITKeyCombo.h" + +@interface ITHotKey : NSObject +{ + NSString* mName; + ITKeyCombo* mKeyCombo; + id mTarget; + SEL mAction; +} + +- (id)init; + +- (void)setName: (NSString*)name; +- (NSString*)name; + +- (void)setKeyCombo: (ITKeyCombo*)combo; +- (ITKeyCombo*)keyCombo; + +- (void)setTarget: (id)target; +- (id)target; +- (void)setAction: (SEL)action; +- (SEL)action; + +- (void)invoke; + +@end diff --git a/ITHotKey.m b/ITHotKey.m new file mode 100755 index 0000000..bf411f9 --- /dev/null +++ b/ITHotKey.m @@ -0,0 +1,91 @@ +// +// ITHotKey.m +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import "ITHotKey.h" + +#import "ITHotKeyCenter.h" +#import "ITKeyCombo.h" + +@implementation ITHotKey + +- (id)init +{ + self = [super init]; + + if( self ) + { + [self setKeyCombo: [ITKeyCombo clearKeyCombo]]; + } + + return self; +} + +- (void)dealloc +{ + [mName release]; + [mKeyCombo release]; + + [super dealloc]; +} + +- (NSString*)description +{ + return [NSString stringWithFormat: @"<%@: %@>", NSStringFromClass( [self class] ), [self keyCombo]]; +} + +#pragma mark - + +- (void)setKeyCombo: (ITKeyCombo*)combo +{ + [combo retain]; + [mKeyCombo release]; + mKeyCombo = combo; +} + +- (ITKeyCombo*)keyCombo +{ + return mKeyCombo; +} + +- (void)setName: (NSString*)name +{ + [name retain]; + [mName release]; + mName = name; +} + +- (NSString*)name +{ + return mName; +} + +- (void)setTarget: (id)target +{ + mTarget = target; +} + +- (id)target +{ + return mTarget; +} + +- (void)setAction: (SEL)action +{ + mAction = action; +} + +- (SEL)action +{ + return mAction; +} + +- (void)invoke +{ + [mTarget performSelector: mAction withObject: self]; +} + +@end diff --git a/ITHotKeyCenter.h b/ITHotKeyCenter.h new file mode 100755 index 0000000..e984bc5 --- /dev/null +++ b/ITHotKeyCenter.h @@ -0,0 +1,27 @@ +// +// ITHotKeyCenter.h +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import + +@class ITHotKey; + +@interface ITHotKeyCenter : NSObject +{ + NSMutableDictionary* mHotKeys; //Keys are NSValue of EventHotKeyRef + BOOL mEventHandlerInstalled; +} + ++ (id)sharedCenter; + +- (BOOL)registerHotKey: (ITHotKey*)hotKey; +- (void)unregisterHotKey: (ITHotKey*)hotKey; + +- (NSArray*)allHotKeys; + +- (void)sendEvent: (NSEvent*)event; + +@end diff --git a/ITHotKeyCenter.m b/ITHotKeyCenter.m new file mode 100755 index 0000000..ad9c31d --- /dev/null +++ b/ITHotKeyCenter.m @@ -0,0 +1,265 @@ +// +// ITHotKeyCenter.m +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import "ITHotKeyCenter.h" +#import "ITHotKey.h" +#import "ITKeyCombo.h" +#import + +#if __PROTEIN__ +#import "NSObjectAdditions.h" +#endif + +@interface ITHotKeyCenter (Private) +- (BOOL)_hasCarbonEventSupport; + +- (ITHotKey*)_hotKeyForCarbonHotKey: (EventHotKeyRef)carbonHotKey; +- (EventHotKeyRef)_carbonHotKeyForHotKey: (ITHotKey*)hotKey; + +- (void)_updateEventHandler; +- (void)_hotKeyDown: (ITHotKey*)hotKey; +- (void)_hotKeyUp: (ITHotKey*)hotKey; +static OSStatus hotKeyEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void* refCon ); +@end + +@implementation ITHotKeyCenter + +static id _sharedHotKeyCenter = nil; + ++ (id)sharedCenter +{ + if( _sharedHotKeyCenter == nil ) + { + _sharedHotKeyCenter = [[self alloc] init]; + #if __PROTEIN__ + [_sharedHotKeyCenter releaseOnTerminate]; + #endif + } + + return _sharedHotKeyCenter; +} + +- (id)init +{ + self = [super init]; + + if( self ) + { + mHotKeys = [[NSMutableDictionary alloc] init]; + } + + return self; +} + +- (void)dealloc +{ + [mHotKeys release]; + [super dealloc]; +} + +#pragma mark - + +- (BOOL)registerHotKey: (ITHotKey*)hotKey +{ + OSStatus err; + EventHotKeyID hotKeyID; + EventHotKeyRef carbonHotKey; + NSValue* key; + + if( [[self allHotKeys] containsObject: hotKey] == YES ) + [self unregisterHotKey: hotKey]; + + if( [[hotKey keyCombo] isValidHotKeyCombo] == NO ) + return YES; + + hotKeyID.signature = 'PTHk'; + hotKeyID.id = (long)hotKey; + + err = RegisterEventHotKey( [[hotKey keyCombo] keyCode], + [[hotKey keyCombo] modifiers], + hotKeyID, + GetEventDispatcherTarget(), + nil, + &carbonHotKey ); + + if( err ) + return NO; + + key = [NSValue valueWithPointer: carbonHotKey]; + [mHotKeys setObject: hotKey forKey: key]; + + [self _updateEventHandler]; + + return YES; +} + +- (void)unregisterHotKey: (ITHotKey*)hotKey +{ + OSStatus err; + EventHotKeyRef carbonHotKey; + NSValue* key; + + if( [[self allHotKeys] containsObject: hotKey] == NO ) + return; + + carbonHotKey = [self _carbonHotKeyForHotKey: hotKey]; + NSAssert( carbonHotKey != nil, @"" ); + + err = UnregisterEventHotKey( carbonHotKey ); + //Watch as we ignore 'err': + + key = [NSValue valueWithPointer: carbonHotKey]; + [mHotKeys removeObjectForKey: key]; + + [self _updateEventHandler]; + + //See that? Completely ignored +} + +- (NSArray*)allHotKeys +{ + return [mHotKeys allValues]; +} + +#pragma mark - + +- (BOOL)_hasCarbonEventSupport +{ + return floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_1; +} + +- (ITHotKey*)_hotKeyForCarbonHotKey: (EventHotKeyRef)carbonHotKey +{ + NSValue* key = [NSValue valueWithPointer: carbonHotKey]; + return [mHotKeys objectForKey: key]; +} + +- (EventHotKeyRef)_carbonHotKeyForHotKey: (ITHotKey*)hotKey +{ + NSArray* values; + NSValue* value; + + values = [mHotKeys allKeysForObject: hotKey]; + NSAssert( [values count] == 1, @"Failed to find Carbon Hotkey for ITHotKey" ); + + value = [values lastObject]; + + return (EventHotKeyRef)[value pointerValue]; +} + +- (void)_updateEventHandler +{ + if( [self _hasCarbonEventSupport] == NO ) //Don't use event handler on these systems + return; + + if( [mHotKeys count] && mEventHandlerInstalled == NO ) + { + EventTypeSpec eventSpec[2] = { + { kEventClassKeyboard, kEventHotKeyPressed }, + { kEventClassKeyboard, kEventHotKeyReleased } + }; + + InstallEventHandler( GetEventDispatcherTarget(), + (EventHandlerProcPtr)hotKeyEventHandler, + 2, eventSpec, nil, nil); + + mEventHandlerInstalled = YES; + } +} + +- (void)_hotKeyDown: (ITHotKey*)hotKey +{ + [hotKey invoke]; +} + +- (void)_hotKeyUp: (ITHotKey*)hotKey +{ +} + +- (void)sendEvent: (NSEvent*)event +{ + long subType; + EventHotKeyRef carbonHotKey; + + //We only have to intercept sendEvent to do hot keys on old system versions + if( [self _hasCarbonEventSupport] ) + return; + + if( [event type] == NSSystemDefined ) + { + subType = [event subtype]; + + if( subType == 6 ) //6 is hot key down + { + carbonHotKey= (EventHotKeyRef)[event data1]; //data1 is our hot key ref + if( carbonHotKey != nil ) + { + ITHotKey* hotKey = [self _hotKeyForCarbonHotKey: carbonHotKey]; + [self _hotKeyDown: hotKey]; + } + } + else if( subType == 9 ) //9 is hot key up + { + carbonHotKey= (EventHotKeyRef)[event data1]; + if( carbonHotKey != nil ) + { + ITHotKey* hotKey = [self _hotKeyForCarbonHotKey: carbonHotKey]; + [self _hotKeyUp: hotKey]; + } + } + } +} + +- (OSStatus)sendCarbonEvent: (EventRef)event +{ + OSStatus err; + EventHotKeyID hotKeyID; + ITHotKey* hotKey; + + NSAssert( [self _hasCarbonEventSupport], @"" ); + NSAssert( GetEventClass( event ) == kEventClassKeyboard, @"Unknown event class" ); + + err = GetEventParameter( event, + kEventParamDirectObject, + typeEventHotKeyID, + nil, + sizeof(EventHotKeyID), + nil, + &hotKeyID ); + if( err ) + return err; + + + NSAssert( hotKeyID.signature == 'PTHk', @"Invalid hot key id" ); + NSAssert( hotKeyID.id != nil, @"Invalid hot key id" ); + + hotKey = (ITHotKey*)hotKeyID.id; + + switch( GetEventKind( event ) ) + { + case kEventHotKeyPressed: + [self _hotKeyDown: hotKey]; + break; + + case kEventHotKeyReleased: + [self _hotKeyUp: hotKey]; + break; + + default: + NSAssert( 0, @"Unknown event kind" ); + break; + } + + return noErr; +} + +static OSStatus hotKeyEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void* refCon ) +{ + return [[ITHotKeyCenter sharedCenter] sendCarbonEvent: inEvent]; +} + +@end diff --git a/ITKeyBroadcaster.h b/ITKeyBroadcaster.h new file mode 100755 index 0000000..9e30ed4 --- /dev/null +++ b/ITKeyBroadcaster.h @@ -0,0 +1,19 @@ +// +// ITKeyBroadcaster.h +// +// Created by Quentin Carnicelli on Sun Aug 03 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import + + +@interface ITKeyBroadcaster : NSButton +{ +} + ++ (long)cocoaModifiersAsCarbonModifiers: (long)cocoaModifiers; + +@end + +__private_extern__ NSString* ITKeyBroadcasterKeyEvent; //keys: keyCombo as ITKeyCombo \ No newline at end of file diff --git a/ITKeyBroadcaster.m b/ITKeyBroadcaster.m new file mode 100755 index 0000000..b09ea9a --- /dev/null +++ b/ITKeyBroadcaster.m @@ -0,0 +1,73 @@ +// +// ITKeyBroadcaster.m +// +// Created by Quentin Carnicelli on Sun Aug 03 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import "ITKeyBroadcaster.h" +#import "ITKeyCombo.h" +#import + +NSString* ITKeyBroadcasterKeyEvent = @"ITKeyBroadcasterKeyEvent"; + +@implementation ITKeyBroadcaster + +- (void)_bcastKeyCode: (short)keyCode modifiers: (long)modifiers +{ + ITKeyCombo* keyCombo = [ITKeyCombo keyComboWithKeyCode: keyCode modifiers: modifiers]; + NSDictionary* userInfo = [NSDictionary dictionaryWithObject: keyCombo forKey:@"keyCombo"]; + + [[NSNotificationCenter defaultCenter] + postNotificationName: ITKeyBroadcasterKeyEvent + object: self + userInfo: userInfo]; +} + +- (void)_bcastEvent: (NSEvent*)event +{ + short keyCode; + long modifiers; + + keyCode = [event keyCode]; + modifiers = [event modifierFlags]; + modifiers = [[self class] cocoaModifiersAsCarbonModifiers: modifiers]; + + [self _bcastKeyCode: keyCode modifiers: modifiers]; +} + +- (void)keyDown: (NSEvent*)event +{ + [self _bcastEvent: event]; +} + +- (BOOL)performKeyEquivalent: (NSEvent*)event +{ + [self _bcastEvent: event]; + return YES; +} + ++ (long)cocoaModifiersAsCarbonModifiers: (long)cocoaModifiers +{ + static long cocoaToCarbon[6][2] = + { + { NSCommandKeyMask, cmdKey}, + { NSAlternateKeyMask, optionKey}, + { NSControlKeyMask, controlKey}, + { NSShiftKeyMask, shiftKey}, + { NSFunctionKeyMask, rightControlKey}, + //{ NSAlphaShiftKeyMask, alphaLock }, //Ignore this? + }; + + long carbonModifiers = 0; + int i; + + for( i = 0 ; i < 6; i++ ) + if( cocoaModifiers & cocoaToCarbon[i][0] ) + carbonModifiers += cocoaToCarbon[i][1]; + + return carbonModifiers; +} + + +@end diff --git a/ITKeyCombo.h b/ITKeyCombo.h new file mode 100755 index 0000000..e6d1be0 --- /dev/null +++ b/ITKeyCombo.h @@ -0,0 +1,38 @@ +// +// ITKeyCombo.h +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import + + +@interface ITKeyCombo : NSObject +{ + int mKeyCode; + int mModifiers; +} + ++ (id)clearKeyCombo; ++ (id)keyComboWithKeyCode: (int)keyCode modifiers: (int)modifiers; +- (id)initWithKeyCode: (int)keyCode modifiers: (int)modifiers; + +- (id)initWithPlistRepresentation: (id)plist; +- (id)plistRepresentation; + +- (BOOL)isEqual: (ITKeyCombo*)combo; + +- (int)keyCode; +- (int)modifiers; + +- (BOOL)isClearCombo; +- (BOOL)isValidHotKeyCombo; + +@end + +@interface ITKeyCombo (UserDisplayAdditions) + +- (NSString*)description; + +@end \ No newline at end of file diff --git a/ITKeyCombo.m b/ITKeyCombo.m new file mode 100755 index 0000000..1a70528 --- /dev/null +++ b/ITKeyCombo.m @@ -0,0 +1,177 @@ +// +// ITKeyCombo.m +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import "ITKeyCombo.h" + +#import + +@implementation ITKeyCombo + ++ (id)clearKeyCombo +{ + return [self keyComboWithKeyCode: -1 modifiers: -1]; +} + ++ (id)keyComboWithKeyCode: (int)keyCode modifiers: (int)modifiers +{ + return [[[self alloc] initWithKeyCode: keyCode modifiers: modifiers] autorelease]; +} + +- (id)initWithKeyCode: (int)keyCode modifiers: (int)modifiers +{ + self = [super init]; + + if( self ) + { + mKeyCode = keyCode; + mModifiers = modifiers; + } + + return self; +} + +- (id)initWithPlistRepresentation: (id)plist +{ + int keyCode, modifiers; + + keyCode = [[plist objectForKey: @"keyCode"] intValue]; + if( keyCode <= 0 ) keyCode = -1; + + modifiers = [[plist objectForKey: @"modifiers"] intValue]; + if( modifiers <= 0 ) modifiers = -1; + + return [self initWithKeyCode: keyCode modifiers: modifiers]; +} + +- (id)plistRepresentation +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt: [self keyCode]], @"keyCode", + [NSNumber numberWithInt: [self modifiers]], @"modifiers", + nil]; +} + +- (id)copyWithZone:(NSZone*)zone; +{ + return [self retain]; +} + +- (BOOL)isEqual: (ITKeyCombo*)combo +{ + return [self keyCode] == [combo keyCode] && + [self modifiers] == [combo modifiers]; +} + +#pragma mark - + +- (int)keyCode +{ + return mKeyCode; +} + +- (int)modifiers +{ + return mModifiers; +} + +- (BOOL)isValidHotKeyCombo +{ + return mKeyCode >= 0 && mModifiers > 0; +} + +- (BOOL)isClearCombo +{ + return mKeyCode == -1 && mModifiers == -1; +} + +@end + +#pragma mark - + +@implementation ITKeyCombo (UserDisplayAdditions) + ++ (NSDictionary*)_keyCodesDictionary +{ + static NSDictionary* keyCodes = nil; + + if( keyCodes == nil ) + { + NSString* path; + NSString* contents; + + path = [[NSBundle bundleForClass: self] pathForResource: @"ITKeyCodes" ofType: @"plist"]; + contents = [NSString stringWithContentsOfFile: path]; + keyCodes = [[contents propertyList] retain]; + } + + return keyCodes; +} + ++ (NSString*)_stringForModifiers: (long)modifiers +{ + static long modToChar[4][2] = + { + { cmdKey, 0x23180000 }, + { optionKey, 0x23250000 }, + { controlKey, 0x005E0000 }, + { shiftKey, 0x21e70000 } + }; + + NSString* str = nil; + NSString* charStr; + long i; + + str = [NSString string]; + + for( i = 0; i < 4; i++ ) + { + if( modifiers & modToChar[i][0] ) + { + charStr = [NSString stringWithCharacters: (const unichar*)&modToChar[i][1] length: 1]; + str = [str stringByAppendingString: charStr]; + } + } + + if( !str ) + str = @""; + + return str; +} + ++ (NSString*)_stringForKeyCode: (short)keyCode +{ + NSDictionary* dict; + id key; + NSString* str; + + dict = [self _keyCodesDictionary]; + key = [NSString stringWithFormat: @"%d", keyCode]; + str = [dict objectForKey: key]; + + if( !str ) + str = [NSString stringWithFormat: @"%X", keyCode]; + + return str; +} + +- (NSString*)description +{ + NSString* desc; + + if( [self isValidHotKeyCombo] ) //This might have to change + { + desc = [NSString stringWithFormat: @"%@%@", + [[self class] _stringForModifiers: [self modifiers]], + [[self class] _stringForKeyCode: [self keyCode]]]; + } + else + desc = NSLocalizedString( @"(None)", @"Hot Keys: Key Combo text for 'empty' combo" ); + + return desc; +} + +@end \ No newline at end of file diff --git a/ITKeyComboPanel.h b/ITKeyComboPanel.h new file mode 100755 index 0000000..fbe18aa --- /dev/null +++ b/ITKeyComboPanel.h @@ -0,0 +1,40 @@ +// +// ITKeyComboPanel.h + +// +// Created by Quentin Carnicelli on Sun Aug 03 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import + +@class ITKeyBroadcaster; +@class ITKeyCombo; +@class ITHotKey; + +@interface ITKeyComboPanel : NSWindowController +{ + IBOutlet NSTextField* mTitleField; + IBOutlet NSTextField* mComboField; + IBOutlet ITKeyBroadcaster* mKeyBcaster; + + NSString* mTitleFormat; + NSString* mKeyName; + ITKeyCombo* mKeyCombo; +} + ++ (id)sharedPanel; + +- (int)runModal; +- (void)runModalForHotKey: (ITHotKey*)hotKey; + +- (void)setKeyCombo: (ITKeyCombo*)combo; +- (ITKeyCombo*)keyCombo; + +- (void)setKeyBindingName: (NSString*)name; +- (NSString*)keyBindingName; + +- (IBAction)ok: (id)sender; +- (IBAction)cancel: (id)sender; +- (IBAction)clear: (id)sender; +@end diff --git a/ITKeyComboPanel.m b/ITKeyComboPanel.m new file mode 100755 index 0000000..e10ffc0 --- /dev/null +++ b/ITKeyComboPanel.m @@ -0,0 +1,157 @@ +// +// ITKeyComboPanel.m +// +// Created by Quentin Carnicelli on Sun Aug 03 2003. +// Copyright (c) 2003 iThink Software. All rights reserved. +// + +#import "ITKeyComboPanel.h" + +#import "ITHotKey.h" +#import "ITKeyCombo.h" +#import "ITKeyBroadcaster.h" +#import "ITHotKeyCenter.h" + +#if __PROTEIN__ +#import "NSObjectAdditions.h" +#endif + +@implementation ITKeyComboPanel + +static id _sharedKeyComboPanel = nil; + ++ (id)sharedPanel +{ + if( _sharedKeyComboPanel == nil ) + { + _sharedKeyComboPanel = [[self alloc] init]; + + #if __PROTEIN__ + [_sharedKeyComboPanel releaseOnTerminate]; + #endif + } + + return _sharedKeyComboPanel; +} + +- (id)init +{ + return [self initWithWindowNibName: @"ITKeyComboPanel"]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver: self]; + [mKeyName release]; + [mTitleFormat release]; + + [super dealloc]; +} + +- (void)windowDidLoad +{ + mTitleFormat = [[mTitleField stringValue] retain]; + + [[NSNotificationCenter defaultCenter] + addObserver: self + selector: @selector( noteKeyBroadcast: ) + name: ITKeyBroadcasterKeyEvent + object: mKeyBcaster]; +} + +- (void)_refreshContents +{ + if( mComboField ) + [mComboField setStringValue: [mKeyCombo description]]; + + if( mTitleField ) + [mTitleField setStringValue: [NSString stringWithFormat: mTitleFormat, mKeyName]]; +} + +- (int)runModal +{ + int resultCode; + + [self window]; //Force us to load + + [self _refreshContents]; + [[self window] center]; + [self showWindow: self]; + resultCode = [[NSApplication sharedApplication] runModalForWindow: [self window]]; + [self close]; + + return resultCode; +} + +- (void)runModalForHotKey: (ITHotKey*)hotKey +{ + int resultCode; + + [self setKeyBindingName: [hotKey name]]; + [self setKeyCombo: [hotKey keyCombo]]; + + resultCode = [self runModal]; + + if( resultCode == NSOKButton ) + { + [hotKey setKeyCombo: [self keyCombo]]; + [[ITHotKeyCenter sharedCenter] registerHotKey: hotKey]; + } +} + +#pragma mark - + +- (void)setKeyCombo: (ITKeyCombo*)combo +{ + [combo retain]; + [mKeyCombo release]; + mKeyCombo = combo; + [self _refreshContents]; +} + +- (ITKeyCombo*)keyCombo +{ + return mKeyCombo; +} + +- (void)setKeyBindingName: (NSString*)name +{ + [name retain]; + [mKeyName release]; + mKeyName = name; + [self _refreshContents]; +} + +- (NSString*)keyBindingName +{ + return mKeyName; +} + +#pragma mark - + +- (IBAction)ok: (id)sender +{ + [[NSApplication sharedApplication] stopModalWithCode: NSOKButton]; +} + +- (IBAction)cancel: (id)sender +{ + [[NSApplication sharedApplication] stopModalWithCode: NSCancelButton]; +} + +- (IBAction)clear: (id)sender +{ + [self setKeyCombo: [ITKeyCombo clearKeyCombo]]; + [[NSApplication sharedApplication] stopModalWithCode: NSOKButton]; +} + +- (void)noteKeyBroadcast: (NSNotification*)note +{ + ITKeyCombo* keyCombo; + + keyCombo = [[note userInfo] objectForKey: @"keyCombo"]; + + [self setKeyCombo: keyCombo]; +} + +@end diff --git a/ITKit.h b/ITKit.h index 5b8f165..8279c53 100755 --- a/ITKit.h +++ b/ITKit.h @@ -13,6 +13,11 @@ #import +#import +#import +#import +#import +#import #import #import #import diff --git a/Japanese.lproj/ITKeyCodes.plist b/Japanese.lproj/ITKeyCodes.plist new file mode 100755 index 0000000..40d44b6 --- /dev/null +++ b/Japanese.lproj/ITKeyCodes.plist @@ -0,0 +1,103 @@ +{ + 0 = "A"; + 1 = "S"; + 2 = "D"; + 3 = "F"; + 4 = "H"; + 5 = "G"; + 6 = "Z"; + 7 = "X"; + 8 = "C"; + 9 = "V"; + 10 = "$"; + 11 = "B"; + 12 = "Q"; + 13 = "W"; + 14 = "E"; + 15 = "R"; + 16 = "Y"; + 17 = "T"; + 18 = "1"; + 19 = "2"; + 20 = "3"; + 21 = "4"; + 22 = "6"; + 23 = "5"; + 24 = "="; + 25 = "9"; + 26 = "7"; + 27 = "-"; + 28 = "8"; + 29 = "0"; + 30 = "\]"; + 31 = "O"; + 32 = "U"; + 33 = "\["; + 34 = "I"; + 35 = "P"; + 36 = "Return"; + 37 = "L"; + 38 = "J"; + 39 = "\'"; + 40 = "K"; + 41 = ";"; + 42 = "\\"; + 43 = ","; + 44 = "\/"; + 45 = "N"; + 46 = "M"; + 47 = "."; + 48 = "Tab"; + 49 = "Space"; + 50 = "\`"; + 51 = "Delete"; + 53 = "ESC"; + 55 = "Command"; + 56 = "Shift"; + 57 = "Caps Lock"; + 58 = "Option"; + 59 = "Control"; + 65 = "Pad ."; + 67 = "Pad *"; + 69 = "Pad +"; + 71 = "Clear"; + 75 = "Pad /"; + 76 = "Pad Enter"; + 78 = "Pad -"; + 81 = "Pad ="; + 82 = "Pad 0"; + 83 = "Pad 1"; + 84 = "Pad 2"; + 85 = "Pad 3"; + 86 = "Pad 4"; + 87 = "Pad 5"; + 88 = "Pad 6"; + 89 = "Pad 7"; + 91 = "Pad 8"; + 92 = "Pad 9"; + 96 = "F5"; + 97 = "F6"; + 98 = "F7"; + 99 = "F3"; + 100 = "F8"; + 101 = "F9"; + 103 = "F11"; + 105 = "F13"; + 107 = "F14"; + 109 = "F10"; + 111 = "F12"; + 113 = "F15"; + 114 = "Ins"; + 115 = "Home"; + 116 = "Page Up"; + 117 = "Del"; + 118 = "F4"; + 119 = "End"; + 120 = "F2"; + 121 = "Page Down"; + 122 = "F1"; + 123 = "Left Arrow"; + 124 = "Right Arrow"; + 125 = "Down Arrow"; + 126 = "Up Arrow"; +} \ No newline at end of file diff --git a/Japanese.lproj/ITKeyComboPanel.nib/classes.nib b/Japanese.lproj/ITKeyComboPanel.nib/classes.nib new file mode 100755 index 0000000..0ab0cc6 --- /dev/null +++ b/Japanese.lproj/ITKeyComboPanel.nib/classes.nib @@ -0,0 +1,18 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = ITKeyBroadcaster; LANGUAGE = ObjC; SUPERCLASS = NSButton; }, + { + ACTIONS = {cancel = id; clear = id; ok = id; }; + CLASS = ITKeyComboPanel; + LANGUAGE = ObjC; + OUTLETS = { + mComboField = NSTextField; + mKeyBcaster = ITKeyBroadcaster; + mTitleField = NSTextField; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Japanese.lproj/ITKeyComboPanel.nib/info.nib b/Japanese.lproj/ITKeyComboPanel.nib/info.nib new file mode 100755 index 0000000..d6ed0ab --- /dev/null +++ b/Japanese.lproj/ITKeyComboPanel.nib/info.nib @@ -0,0 +1,26 @@ + + + + + IBDocumentLocation + 109 47 356 240 0 0 1280 1002 + IBFramework Version + 291.0 + IBGroupedObjects + + 10 + + 22 + 27 + + + IBLastGroupID + 11 + IBOpenObjects + + 19 + + IBSystem Version + 6L60 + + diff --git a/Japanese.lproj/ITKeyComboPanel.nib/objects.nib b/Japanese.lproj/ITKeyComboPanel.nib/objects.nib new file mode 100755 index 0000000000000000000000000000000000000000..570f426881cd0102568c60ca205c143b901fa73f GIT binary patch literal 2486 zcmZ`*-*4Mg6uwT<^fzm@wy-e?!v?5>tKMK`P218NH8mXf^0#uq@2>Qb9p=p^oYiaL`)q zMhJYZI4nkhK3+5oqM>hjm@G6C-RVh*2&KfP{}EMDVn|@#_w2pFVmQyoRa&b>l0?H+ypBnRrHRUyK{+p)x854bF3Rn7Bim&wVLBx;X`D-$i0rKvx;8Yaz z0XaUS<3d4{MGcq4dAukpKy+1;8G_<0(Z|G>V-`U0IzVvttPjBnAA0yaBrtBuk(o>QNd7@FBXWv{*23js@DI_?5)>SoB^!OhdD?U!Ol& zzady`9NqW{w)F+uSdgu)w-M~IDrG8+0kLQcEBV7qfYYUeDBTGli3E^zLAi^(-p5+W z*j__-?}N!rW^jLQ(@$~pU~T~^M!V4Tg_bFAUtTwVEZ2EHxnL!-a-krVp!Br7{eN_Yz3dGbzYm$j>4#7IK z2fzig&@Xn!mpT|(S^zt1LX(q+4IpD&R_5n)Qq(g0XesQcZYSI3FaFHP3e0lt71!Qz zZPyR=V^zzLQVQqtS=qp*@VH8QRh3;CzFa9n=oK^EO#M6e%@SkuI$wnd&{-AUAy7ho@=kW_M>I{q3d+pkHB7=Z_Rd~ zzyHFs>}{9<`E3f!sAaFi6kLNoZ{7scFb-})%ielwKddjaDMpP~3*vN119ICd{wr|H z!1@jhn)c3Ewg=(6;;*lRoOwU2n=Q(ot&_xJ^G=S9yu=50Uk{VRIAFL@8&@SGv<(P3}v msJAS5jc2{pBi_oObH)+uod>M``=;XDg9#lJphWa}%lZ!ihurZ1 literal 0 HcmV?d00001 diff --git a/Japanese.lproj/Localizable.strings b/Japanese.lproj/Localizable.strings new file mode 100755 index 0000000000000000000000000000000000000000..96d8bbdcf0886ecf31cf6a2d0c416d1cb28c84c6 GIT binary patch literal 5096 zcmcIoOK6-`6u#}ENTDuW=)y4&npWGMh$}^C(mdKUk9KC_G_;z|WG0j6Oq|K&(W13( zG)=^sA{GU~2P%lD)P*fV1u0eqAD{?sM5TzWFX*tv3y((QG#dOu=-3 zrh?xr=+c&A$c$iA!gmOBo{NDiDRO4c+=Cgp6-*wxBj$e08?ncA{x;zEL45zu8y>J4 z+>GYbGLopy33*F?lPgw!Qj`1oz`7mKoZ7}<-BEMMj#^9xpAyD1W-E4_MKj(_9IKR_ zrqx^5neOba+R>Tr^i=KW%$KUu+Mk|DL%P*{-3Iz;&{CH&WacNd%CYie60Yg}5q3hV zz(!81b|7I0T#2<&AgBN-s&5HT0*R~B>b<>?aS~h=Q;N?x=4nXHJN)&8)o93!pS84X=a$3&HC-Sa|$$9x*uE^;XoNjc7@3Wnd zfpNJT`piQg>Z0SA*@3-DV5*2UM% znq*8;cEy)u7j7R7B=9psD>!5!TZHH&;+xo?fCng7*~&G8QOWX9zZYR&#{PEvC0`vg zGIrp65udWN^4}dR|=NUtd~RC43vVLcVEx zKY2LIwpm;Gm{jY9d8qeuU}TT)A9@;5+AQ~_d$ z*|N2@(@5qs7KawNBSC2d{`{e{iDH#my`d{_% z^>P_&7@BJDl!1;MX++K1=wf!tV?^{34WrmsB#**^qZoT0sij-*t+G=VWJv}W_r)8n zUU{1pE+YqAlI5903yXF1bJ%2EU?!t|qinw(Gk)rHM0L7HcdFBBLFsSQe>iHb&Sjgc zua{u;*y%%^3=v>-=GU{@8dk?%%+^O@uLV9BvpIw_%{HtK30r&8=qI$gg*Up4fKK3B z;OuQ6>uhcsNE$<)$h*87qG}I#muzKX*OH4QU%Ik4hZtWBDfMpVPmLl!uW2RghtzTS zq7&6Jfi9=r&e|X?dw?mM4Wqog73;0Ik#&%~=yBb3)r>v5%b1UXhTdZpU{;MNd5#>i z*kcXLfD=*9e9NjhhF$huIZ&_?GuGLKx_Ur*qMnE+-t`SZUc?LQt@0v0XY3=ja?GQ0 zI8X5=r6YQI4{N`!MA4066*%4-;wqW)XVN{dD|46#(F!fc*7eBxeU30;CbEQP5vsQzEc>*y$cVed)Q zyl{Exq7-NTTzC<=47ET0TH-cI4SXR-G3U9UZiOfvmttSP6#Dy4cB5Npm1CL%p$F`e zXo;_rG0QVA$@r#9)5*0!GS0{#`iM1F9^5*3ZsDkO2dCM?RQDEf&u-4Q+7oJbK5cOr zMIzBjPccF`QtN9*RJ%w1EC3UH3lNK%VQGKjDTePHR{1(rA28A!vWaDOj(P*5fSrT8 zOZj^>U%HYT;yp4Vr)*zU93PrH13UbL*(G?SYxV;2?|#;es_%;Of+VfA>7j1O(IH8B2$=<5y|!kBz1g$TChWfXeuymF z9&|YKuuvND93pP~%iM*4OM~q)bC6GI$`REgatRzdT-+n z$Q<%{?wf#%_BP>q{+4h(0WHGy)ScdXC0h4nrtL%ed{aoD1lGd!sqt`~{dTxMabK`r zPb*d!zHez+`Zj^ntn>Q+5oSTx8}(vUd(Du$R*LIxV7$23t9mtN{})q&hnXcc6Vc1g z#>}SN;oC@aqGnLnfisu84&0Y$n`w!3MMcrMUqNeE=!gfct2frFJG`I&gJKpZGF_~( z4(Myk#io0yvloc$gLe+-f;W?VAU_^{Ukbfj5QVL>C{H6I{GPiZsM&lMvLa*xoi*+m ze^Ion1SMdgfRC#u{9l4*7SQz3t}`zSvILE+Nt=kDNM& mY_UeVklPn9D#jZ_I&^c-%*MZyW$DV_VSCk-JOz!zO#3gZVZECG literal 0 HcmV?d00001 diff --git a/Showcase/English.lproj/InfoPlist.strings b/Showcase/English.lproj/InfoPlist.strings index e5fc941a7e627b6df2a0144f09826a0cfc7d19f3..b71aeb8839b2d8c465c7c006a47a7966a7707357 100755 GIT binary patch literal 277 zcmaiuK?{OF6ol{oiibxDwK_(Zgh~nzDc!ex>ce$ccAtg)`iv+eh>pX|H#30;dwmv? zZkWRbjU}xt=mKI@Xup+Y8EWh;c!A?Y>s6<6iHT?smf*(OjyOZhXxzoyO)G8q_^e9V zkSf2juN?^e=?Aw#evJM_CJ^biH&j*(voM?kWfiF!QeE&>81#qEB;9t6PzMybI7u9V J;q@qf(RTqWU12F*JNY`x)r#7Y94ny`Dj*y3nmFWb&D~Oz;}fM+x1disssd+;r>mYiI)Gk* zb2Wi~Pc~|E%J9rIf;}a>bf(0ZdaIz<)`p2On0bzRs -- 2.20.1