From d7d4aab3a1ebd7cf4fbae5a175718a21315e895c Mon Sep 17 00:00:00 2001 From: foosh Date: Sun, 26 Apr 2009 01:53:18 -0500 Subject: [PATCH] dictionary initialization (parsing) now done in separate thread --- PyCEDict.xcodeproj/foosh.mode1v3 | 92 +++++------ PyCEDict.xcodeproj/foosh.pbxuser | 169 +++++++++++++-------- PyDict.py | 54 ++++--- .../Contents/Resources/English.lproj/MainMenu.nib | Bin 26610 -> 26619 bytes .../PyCEDict.app/Contents/Resources/PyDict.py | 54 ++++--- .../PyCEDict.app/Contents/Resources/PyDict.pyc | Bin 3901 -> 4350 bytes .../Debug/PyCEDict.build/PyCEDict.dep | 4 +- .../PyCEDict.pbxindex/pbxindex.header | Bin 24 -> 24 bytes .../PyCEDict.pbxindex/strings.pbxstrings/control | Bin 1048596 -> 1048596 bytes .../PyCEDict.pbxindex/symbols0.pbxsymbols | Bin 2007472 -> 2007472 bytes 10 files changed, 230 insertions(+), 143 deletions(-) rewrite build/Debug/PyCEDict.app/Contents/Resources/English.lproj/MainMenu.nib (76%) rewrite build/Debug/PyCEDict.app/Contents/Resources/PyDict.pyc (77%) diff --git a/PyCEDict.xcodeproj/foosh.mode1v3 b/PyCEDict.xcodeproj/foosh.mode1v3 index 14ef0f8..2cfbd35 100644 --- a/PyCEDict.xcodeproj/foosh.mode1v3 +++ b/PyCEDict.xcodeproj/foosh.mode1v3 @@ -299,7 +299,7 @@ 186 RubberWindowFrame - 229 61 1136 801 0 0 1440 878 + 202 71 1136 801 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -329,16 +329,16 @@ _historyCapacity 0 bookmark - 853656B80FA306160061016C + 853822A00FA43C57001D2D52 history 858BD91B0FA1C68900A64CC4 858BD91C0FA1C68900A64CC4 858BD91D0FA1C68900A64CC4 858BD91E0FA1C68900A64CC4 - 858BD91F0FA1C68900A64CC4 - 853656B40FA303530061016C - 853656B50FA303530061016C + 853822200FA42AD5001D2D52 + 8538226D0FA434A4001D2D52 + 8538226E0FA434A4001D2D52 prevStack @@ -348,12 +348,14 @@ 858BD9240FA1C68900A64CC4 858BD9250FA1C68900A64CC4 858BD9260FA1C68900A64CC4 - 8536568B0FA2FB1B0061016C 8536568C0FA2FB1B0061016C - 8536569F0FA2FBDB0061016C - 853656AF0FA301040061016C - 853656B00FA301040061016C - 853656B60FA303530061016C + 8538220B0FA428AB001D2D52 + 8538220C0FA428AB001D2D52 + 8538220D0FA428AB001D2D52 + 8538221D0FA42AA6001D2D52 + 853822210FA42AD5001D2D52 + 8538226F0FA434A4001D2D52 + 853822700FA434A4001D2D52 SplitCount @@ -367,7 +369,7 @@ Frame {{0, 0}, {928, 657}} RubberWindowFrame - 229 61 1136 801 0 0 1440 878 + 202 71 1136 801 0 0 1440 878 Module PBXNavigatorGroup @@ -387,7 +389,7 @@ Frame {{0, 662}, {928, 98}} RubberWindowFrame - 229 61 1136 801 0 0 1440 878 + 202 71 1136 801 0 0 1440 878 Module XCDetailModule @@ -411,9 +413,9 @@ TableOfContents - 853656800FA2F6260061016C + 853821D60FA41A05001D2D52 1CE0B1FE06471DED0097A5F4 - 853656810FA2F6260061016C + 853821D70FA41A05001D2D52 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -547,15 +549,15 @@ 5 WindowOrderList - 853656960FA2FB1B0061016C - 853656970FA2FB1B0061016C - 1C78EAAD065D492600B07095 + 853821EC0FA42697001D2D52 + 853821ED0FA42697001D2D52 858BD92A0FA1C68900A64CC4 1CD10A99069EF8BA00B06720 + 1C78EAAD065D492600B07095 /Users/foosh/git/pycedict/PyCEDict.xcodeproj WindowString - 229 61 1136 801 0 0 1440 878 + 202 71 1136 801 0 0 1440 878 WindowToolsV3 @@ -632,7 +634,7 @@ TableOfContents 858BD92A0FA1C68900A64CC4 - 8536568E0FA2FB1B0061016C + 853821E80FA42697001D2D52 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -674,8 +676,8 @@ yes sizes - {{0, 0}, {316, 194}} - {{316, 0}, {378, 194}} + {{0, 0}, {467, 294}} + {{467, 0}, {558, 294}} VerticalSplitView @@ -690,8 +692,8 @@ yes sizes - {{0, 0}, {694, 194}} - {{0, 194}, {694, 187}} + {{0, 0}, {1025, 294}} + {{0, 294}, {1025, 271}} @@ -711,7 +713,7 @@ DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame - {{0, 0}, {694, 381}} + {{0, 0}, {1025, 565}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration @@ -721,24 +723,24 @@ Value 85 Summary - 148 + 328 Frame - {{316, 0}, {378, 194}} + {{467, 0}, {558, 294}} RubberWindowFrame - 181 413 694 422 0 0 1440 878 + 126 192 1025 606 0 0 1440 878 RubberWindowFrame - 181 413 694 422 0 0 1440 878 + 126 192 1025 606 0 0 1440 878 Module PBXDebugSessionModule Proportion - 381pt + 565pt Proportion - 381pt + 565pt Name @@ -752,18 +754,18 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 8536568F0FA2FB1B0061016C + 853821DD0FA42517001D2D52 1C162984064C10D400B95A72 - 853656900FA2FB1B0061016C - 853656910FA2FB1B0061016C - 853656920FA2FB1B0061016C - 853656930FA2FB1B0061016C - 853656940FA2FB1B0061016C + 853821DE0FA42517001D2D52 + 853821DF0FA42517001D2D52 + 853821E00FA42517001D2D52 + 853821E10FA42517001D2D52 + 853821E20FA42517001D2D52 ToolbarConfiguration xcode.toolbar.config.debugV3 WindowString - 181 413 694 422 0 0 1440 878 + 126 192 1025 606 0 0 1440 878 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible @@ -885,6 +887,8 @@ Dock + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -895,18 +899,18 @@ GeometryConfiguration Frame - {{0, 0}, {650, 209}} + {{0, 0}, {828, 441}} RubberWindowFrame - 181 585 650 250 0 0 1440 878 + 18 381 828 482 0 0 1440 878 Module PBXDebugCLIModule Proportion - 209pt + 441pt Proportion - 209pt + 441pt Name @@ -920,17 +924,17 @@ TableOfContents 1C78EAAD065D492600B07095 - 853656950FA2FB1B0061016C + 853821E90FA42697001D2D52 1C78EAAC065D492600B07095 ToolbarConfiguration xcode.toolbar.config.consoleV3 WindowString - 181 585 650 250 0 0 1440 878 + 18 381 828 482 0 0 1440 878 WindowToolGUID 1C78EAAD065D492600B07095 WindowToolIsVisible - + Identifier diff --git a/PyCEDict.xcodeproj/foosh.pbxuser b/PyCEDict.xcodeproj/foosh.pbxuser index 32dd73c..e807e71 100644 --- a/PyCEDict.xcodeproj/foosh.pbxuser +++ b/PyCEDict.xcodeproj/foosh.pbxuser @@ -11,6 +11,9 @@ activeBuildConfigurationName = Debug; activeExecutable = 855277CA0FA1B89D0062CA05 /* PyCEDict */; activeTarget = 8D1107260486CEB800E47090 /* PyCEDict */; + breakpoints = ( + 8538221A0FA42A8C001D2D52 /* main.m:14 */, + ); codeSenseManager = 855277D00FA1B89E0062CA05 /* Code sense */; executables = ( 855277CA0FA1B89D0062CA05 /* PyCEDict */, @@ -38,24 +41,26 @@ PBXFileDataSource_Target_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 262338083; - PBXWorkspaceStateSaveDate = 262338083; + PBXPerProjectTemplateStateSaveDate = 262412795; + PBXWorkspaceStateSaveDate = 262412795; }; perUserProjectItems = { - 8536568B0FA2FB1B0061016C /* PBXTextBookmark */ = 8536568B0FA2FB1B0061016C /* PBXTextBookmark */; 8536568C0FA2FB1B0061016C /* PBXTextBookmark */ = 8536568C0FA2FB1B0061016C /* PBXTextBookmark */; - 8536569F0FA2FBDB0061016C /* PBXTextBookmark */ = 8536569F0FA2FBDB0061016C /* PBXTextBookmark */; - 853656AF0FA301040061016C /* PBXTextBookmark */ = 853656AF0FA301040061016C /* PBXTextBookmark */; - 853656B00FA301040061016C /* PBXTextBookmark */ = 853656B00FA301040061016C /* PBXTextBookmark */; - 853656B40FA303530061016C /* PBXTextBookmark */ = 853656B40FA303530061016C /* PBXTextBookmark */; - 853656B50FA303530061016C /* PBXTextBookmark */ = 853656B50FA303530061016C /* PBXTextBookmark */; - 853656B60FA303530061016C /* PBXTextBookmark */ = 853656B60FA303530061016C /* PBXTextBookmark */; - 853656B80FA306160061016C /* PBXTextBookmark */ = 853656B80FA306160061016C /* PBXTextBookmark */; + 8538220B0FA428AB001D2D52 /* PBXTextBookmark */ = 8538220B0FA428AB001D2D52 /* PBXTextBookmark */; + 8538220C0FA428AB001D2D52 /* PBXTextBookmark */ = 8538220C0FA428AB001D2D52 /* PBXTextBookmark */; + 8538220D0FA428AB001D2D52 /* PBXTextBookmark */ = 8538220D0FA428AB001D2D52 /* PBXTextBookmark */; + 8538221D0FA42AA6001D2D52 /* PBXTextBookmark */ = 8538221D0FA42AA6001D2D52 /* PBXTextBookmark */; + 853822200FA42AD5001D2D52 /* PBXTextBookmark */ = 853822200FA42AD5001D2D52 /* PBXTextBookmark */; + 853822210FA42AD5001D2D52 /* PBXTextBookmark */ = 853822210FA42AD5001D2D52 /* PBXTextBookmark */; + 8538226D0FA434A4001D2D52 /* PBXTextBookmark */ = 8538226D0FA434A4001D2D52 /* PBXTextBookmark */; + 8538226E0FA434A4001D2D52 /* PBXTextBookmark */ = 8538226E0FA434A4001D2D52 /* PBXTextBookmark */; + 8538226F0FA434A4001D2D52 /* PBXTextBookmark */ = 8538226F0FA434A4001D2D52 /* PBXTextBookmark */; + 853822700FA434A4001D2D52 /* PBXTextBookmark */ = 853822700FA434A4001D2D52 /* PBXTextBookmark */; + 853822A00FA43C57001D2D52 /* PBXTextBookmark */ = 853822A00FA43C57001D2D52 /* PBXTextBookmark */; 858BD91B0FA1C68900A64CC4 /* PBXTextBookmark */ = 858BD91B0FA1C68900A64CC4 /* PBXTextBookmark */; 858BD91C0FA1C68900A64CC4 /* PlistBookmark */ = 858BD91C0FA1C68900A64CC4 /* PlistBookmark */; 858BD91D0FA1C68900A64CC4 /* PBXTextBookmark */ = 858BD91D0FA1C68900A64CC4 /* PBXTextBookmark */; 858BD91E0FA1C68900A64CC4 /* PBXTextBookmark */ = 858BD91E0FA1C68900A64CC4 /* PBXTextBookmark */; - 858BD91F0FA1C68900A64CC4 /* PBXTextBookmark */ = 858BD91F0FA1C68900A64CC4 /* PBXTextBookmark */; 858BD9210FA1C68900A64CC4 /* PBXTextBookmark */ = 858BD9210FA1C68900A64CC4 /* PBXTextBookmark */; 858BD9220FA1C68900A64CC4 /* PlistBookmark */ = 858BD9220FA1C68900A64CC4 /* PlistBookmark */; 858BD9230FA1C68900A64CC4 /* PBXTextBookmark */ = 858BD9230FA1C68900A64CC4 /* PBXTextBookmark */; @@ -70,8 +75,8 @@ 29B97316FDCFA39411CA2CEA /* main.m */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1320, 714}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 1529}"; + sepNavSelRange = "{1773, 0}"; + sepNavVisRange = "{1181, 803}"; }; }; 77631A3E0C0748CF005415CB /* main.py */ = { @@ -83,21 +88,11 @@ }; 7790198E0C07548A00326F66 /* PyCEDictAppDelegate.py */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {867, 625}}"; + sepNavIntBoundsRect = "{{0, 0}, {867, 602}}"; sepNavSelRange = "{633, 0}"; sepNavVisRange = "{0, 1031}"; }; }; - 8536568B0FA2FB1B0061016C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 85E9F4CC0E41388100163B86 /* PyDict.py */; - name = "PyDict.py: 76"; - rLen = 0; - rLoc = 2504; - rType = 0; - vrLen = 1592; - vrLoc = 1731; - }; 8536568C0FA2FB1B0061016C /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 7790198E0C07548A00326F66 /* PyCEDictAppDelegate.py */; @@ -108,37 +103,83 @@ vrLen = 1025; vrLoc = 0; }; - 8536569F0FA2FBDB0061016C /* PBXTextBookmark */ = { + 8538220B0FA428AB001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 85E9F4CC0E41388100163B86 /* PyDict.py */; - name = "PyDict.py: 127"; + name = "PyDict.py: 107"; + rLen = 0; + rLoc = 3699; + rType = 0; + vrLen = 1654; + vrLoc = 2287; + }; + 8538220C0FA428AB001D2D52 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 29B97316FDCFA39411CA2CEA /* main.m */; + name = "main.m: 44"; rLen = 0; - rLoc = 4892; + rLoc = 1773; rType = 0; - vrLen = 2169; - vrLoc = 2888; + vrLen = 1979; + vrLoc = 0; }; - 853656AF0FA301040061016C /* PBXTextBookmark */ = { + 8538220D0FA428AB001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 7790198E0C07548A00326F66 /* PyCEDictAppDelegate.py */; - name = "PyCEDictAppDelegate.py: 14"; + name = "PyCEDictAppDelegate.py: 23"; rLen = 0; - rLoc = 247; + rLoc = 633; rType = 0; - vrLen = 1037; + vrLen = 1031; vrLoc = 0; }; - 853656B00FA301040061016C /* PBXTextBookmark */ = { + 8538221A0FA42A8C001D2D52 /* main.m:14 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + countType = 0; + delayBeforeContinue = 0; + fileReference = 29B97316FDCFA39411CA2CEA /* main.m */; + functionName = "main()"; + hitCount = 0; + ignoreCount = 0; + lineNumber = 14; + modificationTime = 262421394.315101; + state = 2; + }; + 8538221D0FA42AA6001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 85E9F4CC0E41388100163B86 /* PyDict.py */; - name = "PyDict.py: 96"; + name = "PyDict.py: 43"; + rLen = 0; + rLoc = 1762; + rType = 0; + vrLen = 1603; + vrLoc = 682; + }; + 853822200FA42AD5001D2D52 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 29B97316FDCFA39411CA2CEA /* main.m */; + name = "main.m: 44"; + rLen = 0; + rLoc = 1773; + rType = 0; + vrLen = 1906; + vrLoc = 122; + }; + 853822210FA42AD5001D2D52 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 29B97316FDCFA39411CA2CEA /* main.m */; + name = "main.m: 44"; rLen = 0; - rLoc = 3152; + rLoc = 1773; rType = 0; - vrLen = 1912; - vrLoc = 2443; + vrLen = 1906; + vrLoc = 122; }; - 853656B40FA303530061016C /* PBXTextBookmark */ = { + 8538226D0FA434A4001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 7790198E0C07548A00326F66 /* PyCEDictAppDelegate.py */; name = "PyCEDictAppDelegate.py: 23"; @@ -148,17 +189,27 @@ vrLen = 1031; vrLoc = 0; }; - 853656B50FA303530061016C /* PBXTextBookmark */ = { + 8538226E0FA434A4001D2D52 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 85E9F4CC0E41388100163B86 /* PyDict.py */; + name = "PyDict.py: 103"; + rLen = 0; + rLoc = 3568; + rType = 0; + vrLen = 1605; + vrLoc = 2490; + }; + 8538226F0FA434A4001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 85E9F4CC0E41388100163B86 /* PyDict.py */; - name = "PyDict.py: 96"; + name = "PyDict.py: 103"; rLen = 0; - rLoc = 3152; + rLoc = 3568; rType = 0; - vrLen = 1912; - vrLoc = 2443; + vrLen = 1605; + vrLoc = 2490; }; - 853656B60FA303530061016C /* PBXTextBookmark */ = { + 853822700FA434A4001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 7790198E0C07548A00326F66 /* PyCEDictAppDelegate.py */; name = "PyCEDictAppDelegate.py: 23"; @@ -168,15 +219,15 @@ vrLen = 1031; vrLoc = 0; }; - 853656B80FA306160061016C /* PBXTextBookmark */ = { + 853822A00FA43C57001D2D52 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 85E9F4CC0E41388100163B86 /* PyDict.py */; - name = "PyDict.py: 89"; + name = "PyDict.py: 97"; rLen = 0; - rLoc = 2906; + rLoc = 3018; rType = 0; - vrLen = 1754; - vrLoc = 2316; + vrLen = 1556; + vrLoc = 0; }; 855277CA0FA1B89D0062CA05 /* PyCEDict */ = { isa = PBXExecutable; @@ -203,6 +254,8 @@ }; sourceDirectories = ( ); + variableFormatDictionary = { + }; }; 855277CF0FA1B89E0062CA05 /* Source Control */ = { isa = PBXSourceControlManager; @@ -256,16 +309,6 @@ vrLen = 444; vrLoc = 0; }; - 858BD91F0FA1C68900A64CC4 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 29B97316FDCFA39411CA2CEA /* main.m */; - name = "main.m: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 1529; - vrLoc = 0; - }; 858BD9210FA1C68900A64CC4 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 089C165DFE840E0CC02AAC07 /* English */; @@ -329,9 +372,9 @@ }; 85E9F4CC0E41388100163B86 /* PyDict.py */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {867, 1918}}"; - sepNavSelRange = "{2906, 0}"; - sepNavVisRange = "{2316, 1754}"; + sepNavIntBoundsRect = "{{0, 0}, {867, 2268}}"; + sepNavSelRange = "{3018, 0}"; + sepNavVisRange = "{0, 1556}"; }; }; 85E9F5020E417E4F00163B86 /* cedict.u8 */ = { diff --git a/PyDict.py b/PyDict.py index 71b3bbb..276f22f 100755 --- a/PyDict.py +++ b/PyDict.py @@ -23,6 +23,21 @@ class PyDict (NSObject): board = objc.ivar(u"board") userDefaultsDict = objc.ivar(u"userDefaultsDict") winCon = objc.ivar(u"winCon") + t = objc.ivar(u"t") + + def init(self): + self = super(PyDict, self).init() + if self is None: return None + NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(1.0, self, 'setTextOutput:', None, True) + self.foundMatches = "" + + # Process the CEDICT file data to build our dictionaries + # We'll do this in a separate thread so as not to delay UI boot speed + t = NSThread.alloc().initWithTarget_selector_object_(self, self.buildDictionaries, None) + t.start() + + NSLog("Initialization completed") + return self # Load and read the cedict file linewise, in a unicode format, into a list of definitions: try: @@ -36,17 +51,9 @@ class PyDict (NSObject): # Making some dictionaries tradDict = {} simpDict = {} + - # Here we build up the Python dictionaries to be used for fast searching. - # Each line (definition) in the cedict has the following format: - # [traditional form] [simplified form] /definitions/ - # ...hence the use of indices [0] and [1] after splitting lines by whitespace - for line in dict: - tokens = line.split() - tradDict[tokens[0]] = line - simpDict[tokens[1]] = line - NSLog("Finished building dictionaries") - + # Make a pasteboard object with which to monitor the system pasteboard for changes board = NSPasteboard.generalPasteboard() @@ -72,13 +79,7 @@ class PyDict (NSObject): # init the counter to None so we pick up whatever is already on the clipboard at app launch boardChangeCount = None - def init(self): - self = super(PyDict, self).init() - if self is None: return None - NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(1.0, self, 'setTextOutput:', None, True) - self.foundMatches = "" - NSLog("Initialization completed") - return self + #ATTN @@ -92,6 +93,25 @@ class PyDict (NSObject): NSLog("value is now:") NSLog(str(self.userDefaults.objectForKey_("windowOnTop"))) + + def buildDictionaries(self): + + # New thread, needs it's own autoreleasepool + pool = NSAutoreleasePool.alloc().init() + + # Here we build up the Python dictionaries to be used for fast searching. + # Each line (definition) in the cedict has the following format: + # [traditional form] [simplified form] /definitions/ + # ...hence the use of indices [0] and [1] after splitting lines by whitespace + for line in self.dict: + tokens = line.split() + self.tradDict[tokens[0]] = line + self.simpDict[tokens[1]] = line + NSLog("Finished building dictionaries") + + # Release the pool + pool.drain() + def setTextOutput_(self): if self.board.changeCount() != self.boardChangeCount: # if new data is on the clipboard diff --git a/build/Debug/PyCEDict.app/Contents/Resources/English.lproj/MainMenu.nib b/build/Debug/PyCEDict.app/Contents/Resources/English.lproj/MainMenu.nib dissimilarity index 76% index 9c7007722b6d330e2583e11fdbf0f10c4773d948..5b4e798724d16c58dce3287b7f426a1f83d6216e 100644 GIT binary patch delta 16423 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 Uab$5!v7}gCoWNckA_3|D3&K&QMF0Q* diff --git a/build/Debug/PyCEDict.app/Contents/Resources/PyDict.py b/build/Debug/PyCEDict.app/Contents/Resources/PyDict.py index 71b3bbb..45ddfcd 100755 --- a/build/Debug/PyCEDict.app/Contents/Resources/PyDict.py +++ b/build/Debug/PyCEDict.app/Contents/Resources/PyDict.py @@ -23,6 +23,21 @@ class PyDict (NSObject): board = objc.ivar(u"board") userDefaultsDict = objc.ivar(u"userDefaultsDict") winCon = objc.ivar(u"winCon") + t = objc.ivar(u"t") + + def init(self): + self = super(PyDict, self).init() + if self is None: return None + NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(1.0, self, 'setTextOutput:', None, True) + self.foundMatches = "" + + # Process the CEDICT file data to build our dictionaries + # We'll do this in a separate thread so as not to delay UI boot speed + t = NSThread.alloc().initWithTarget_selector_object_(self, buildDictionaries, None) + t.start() + + NSLog("Initialization completed") + return self # Load and read the cedict file linewise, in a unicode format, into a list of definitions: try: @@ -36,17 +51,9 @@ class PyDict (NSObject): # Making some dictionaries tradDict = {} simpDict = {} + - # Here we build up the Python dictionaries to be used for fast searching. - # Each line (definition) in the cedict has the following format: - # [traditional form] [simplified form] /definitions/ - # ...hence the use of indices [0] and [1] after splitting lines by whitespace - for line in dict: - tokens = line.split() - tradDict[tokens[0]] = line - simpDict[tokens[1]] = line - NSLog("Finished building dictionaries") - + # Make a pasteboard object with which to monitor the system pasteboard for changes board = NSPasteboard.generalPasteboard() @@ -72,13 +79,7 @@ class PyDict (NSObject): # init the counter to None so we pick up whatever is already on the clipboard at app launch boardChangeCount = None - def init(self): - self = super(PyDict, self).init() - if self is None: return None - NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(1.0, self, 'setTextOutput:', None, True) - self.foundMatches = "" - NSLog("Initialization completed") - return self + #ATTN @@ -92,6 +93,25 @@ class PyDict (NSObject): NSLog("value is now:") NSLog(str(self.userDefaults.objectForKey_("windowOnTop"))) + + def buildDictionaries(self): + + # New thread, needs it's own autoreleasepool + pool = NSAutoreleasePool.alloc().init() + + # Here we build up the Python dictionaries to be used for fast searching. + # Each line (definition) in the cedict has the following format: + # [traditional form] [simplified form] /definitions/ + # ...hence the use of indices [0] and [1] after splitting lines by whitespace + for line in self.dict: + tokens = line.split() + self.tradDict[tokens[0]] = line + self.simpDict[tokens[1]] = line + NSLog("Finished building dictionaries") + + # Release the pool + pool.drain() + def setTextOutput_(self): if self.board.changeCount() != self.boardChangeCount: # if new data is on the clipboard diff --git a/build/Debug/PyCEDict.app/Contents/Resources/PyDict.pyc b/build/Debug/PyCEDict.app/Contents/Resources/PyDict.pyc dissimilarity index 77% index 8bd541e1e377d9a9b03d170e8dab374a8026b786..dd6186957c28787e6900ae188db194e1313dbbb6 100644 GIT binary patch delta 1348 zcwSwU-D_M$6u{5id-v|%kNwVWvL@Z6Y1(c})mVcd1g$m{1sn9HvbtcxZD!g`dcAkO zJBzKPY$1YB5iIkfuR{NVfQV4~q~e4A6GFjP(O2=DNw*K~a1ZBu&irQBN8Nu<7LWca z``gan4~jY{0>GR2js9Q{9^RV>3#1La1cwX;A#e{q2N;y$&Kigc$SQ~$$U4Xdh$hGx zI0TR_lH7+w3wQuL#9B6JLqA;wN6dnlgBup?`;c{k;ZJmcm#IG!&w-o=UNJ^m0rtT} zv_URVzrhLELs>M^1rrQg^n}%2b z1n@=RGsKNNtH4`^;Y+~VM!5*lR&NfGk3AGh+*WU=!?7BNXzAZ9(HS%H?~=6ebMd=O zH#E^JPP8IDv!xFQn1r}-8yoI2IA9<{3NcmIW9L0q(Z4ufPfA$1xpi$X7co}_G~y)5 zcGV(kGL@(D(_^IKTp4Y1 z>z(XokH%CE1w?W~nelrlpa=TrO1~RXXo12t^0F4L4)dIO=373~7wr%Ak-e>-6uu3b zR7L4gRo{2lSWQ26znBcDmN)?B`^=!Bq{0+ULR;dAm|f$I#v}1=mL*X@2Xdy6IO06UI83BcbVDkS4P|4D{~YkFnII zU541$D2Yska?S49Es>7&XOqxXy7GiK?~`@K#56|v1n zDwo5kOS^dbA8&CvqF18mA7U>a?c5S~A{sARLeVo?O<(bUWlGnAb@sBp8eD35(*#o+ zoh5Nve;1tcqxuwr{wcV}s`^T}T!>DPeLw8Err!nqL%7Q3^q*mRzC(^#5@x~%5ZJy< zdG_h$ELC}yBqBFt^_S&y!8~Qsp`%yykLBT88>qTgmHls7Ue#u6YzALZ!wPMexrNYi nn1?H{LRMx?yUi+At>C&Xr&08p`m@SX@GA9vjl?DWu=34+sM7R+ delta 929 zcwSXfO-~b16g_WRX4>g|(GN=bD5VG#3|O#nLl;KbLDY;3pot=39`c~JNM|7{NJ?ZY zc?7pI0yB>~)0 ztK(>=Z;lQRYTy=x4emg=5FU6hL>gT{WC()!E8jBde`sV^^K^~0+f((vT#tir@ z#I>ku6+xC9jTE>BF^3?BV-JxukDxEQa9y5gN3z+orU}T=#DqNWd6?N`>U+`B)w)gJ zt|3b?U%rgpV@dff_9EY-#5?zw+m9<`3*+SB%`N#ozFtTuvP6OfDw9)BfhC#AD3($Rh=+!uQxMR)d^BJ^$f zH8nCHQeL>f5iE+$Ff_%0Y%WJDO%hg`uk>KdzZI5a@DEml<61cbEnGE^1ajY zG9>g8P$PaqR^0(JYGR|=Y;VfD?v#_GlW7_ZO@M~DKx6gj)t43Mn#=xsVlh@@Sv9D% pX2o=->jrdYF^8p@8I!|a-q4a}E}k~zf>%n-Q2BX+n%weU{RaP#qVE6z diff --git a/build/PyCEDict.build/Debug/PyCEDict.build/PyCEDict.dep b/build/PyCEDict.build/Debug/PyCEDict.build/PyCEDict.dep index 93b7e08..58e8cf9 100644 --- a/build/PyCEDict.build/Debug/PyCEDict.build/PyCEDict.dep +++ b/build/PyCEDict.build/Debug/PyCEDict.build/PyCEDict.dep @@ -1,10 +1,10 @@ ffffffffffffffffffffffffffffffff cb4dcd21a8110d09c2cf8591578e3f7e ffffffffffffffffffffffffffffffff 102 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app -ffffffffffffffffffffffffffffffff f089f574418e42c67521950653a73f2c ffffffffffffffffffffffffffffffff 5057 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/PyDict.py -0000000049f2cb7c000000000001d2e3 08c5380b2696ec2bd95415596750d62c ffffffffffffffffffffffffffffffff 26610 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/English.lproj/MainMenu.nib +ffffffffffffffffffffffffffffffff f089f574418e42c67521950653a73f2c ffffffffffffffffffffffffffffffff 5647 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/PyDict.py 0d19da12cde5fd903b7f0b0c62d0adb8 ad8ca73003eaaf083a88b8acfe5d5cc6 ffffffffffffffffffffffffffffffff 12124 /Users/foosh/git/pycedict/build/PyCEDict.build/Debug/PyCEDict.build/Objects-normal/i386/main.o a0957d2288d2b65f01f7b3a09cc2ee80 35513385a5e31caeaebb42f295578119 ffffffffffffffffffffffffffffffff 17456 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/MacOS/PyCEDict 0000000006ca5055000000000000625e 0d19da1285d322ec3b7f0b0c62d0ac3b ffffffffffffffffffffffffffffffff 34611960 /var/folders/5h/5hV71SZ+Eam-UxK1f+0BrU+++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/PyCEDict_Prefix-aqzzunutqzjvujgseqatyaabfeuo/PyCEDict_Prefix.pch.gch 00000000000000000000000000000000 9394bff9c771d1529a16f44d8756178c ffffffffffffffffffffffffffffffff 2441068 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/cedict.u8 +0000000049f2cbce000000000001d2e3 08c5380b2696ec2bd95415596750d62c ffffffffffffffffffffffffffffffff 26619 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/English.lproj/MainMenu.nib 00000000000000000000000000000000 646120f045f94e109bc3b2f5849eed11 ffffffffffffffffffffffffffffffff 1031 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/PyCEDictAppDelegate.py 00000000000000000000000000000000 26052a8eb51e7974e946cd9e859a5e1f ffffffffffffffffffffffffffffffff 444 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/main.py 0000000049f1810300000000000000c2 8873d4b8441dd2771b7ad0c85558e3a3 ffffffffffffffffffffffffffffffff 194 /Users/foosh/git/pycedict/build/Debug/PyCEDict.app/Contents/Resources/English.lproj/InfoPlist.strings diff --git a/build/PyCEDict.build/PyCEDict.pbxindex/pbxindex.header b/build/PyCEDict.build/PyCEDict.pbxindex/pbxindex.header index 71be31186e05c34e12812e798db748c43aefdb44..ddf1673459b555e35d577de8ebe99e4576eb62b2 100644 GIT binary patch literal 24 bcwVc>%Pf#)VPL4Z%*?>Zz`)QA#2^{~LPrC- literal 24 bcwVc>%Pf#)VPL4Z%*?>Zz`&pi#2^{~KNka3 diff --git a/build/PyCEDict.build/PyCEDict.pbxindex/strings.pbxstrings/control b/build/PyCEDict.build/PyCEDict.pbxindex/strings.pbxstrings/control index 2b73e075c59078c4710450c563201f9812bec919..4a2ab9db8df9b955c498c9dc02fb0c274f8d5764 100644 GIT binary patch delta 90 zcwU>*;4r1Zp`nGbg=q`(X%9xb_A?&LK+FQftU$~L#O&M8cyL_TWOSP-DA~TZh-3TS mBF?sFjMnWgkz7E`4a7X#T_Sn^Utn}=chTb8?xMwi;VJ+zE+S_D delta 90 zcwU>*;4r1Zp`nGbg=q`(X%9xx_A?&LK+FQftU$~L#O&M8cyL_TWR#sKDA~TZh-3TS mBF?sFj6&@$kz7E`4a7X#T_Sn^UtpANchTb8?xMwi;VJ+ZJR!pX diff --git a/build/PyCEDict.build/PyCEDict.pbxindex/symbols0.pbxsymbols b/build/PyCEDict.build/PyCEDict.pbxindex/symbols0.pbxsymbols index 9245386a3227cb264c55c3b52132fd3dbdc8c7c0..17f1f19f2f6ff8a8220cd41eee2275e190816ea5 100644 GIT binary patch delta 7498 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 delta 7498 zcwQ}8e{>_&b&f{kkv)<|@@VvPX9lAM2LzbKfZ2$%PNRYVb#Xv|2`0E8zz{)AQ41cCl4hb=wY<4?eWhX`}ki>AH z)G2WKSQS)#*WRXWQ6J{)EBcV?-oRdw_KJDj6qhO{eGJNUW<(?!V(%kjn zy-7px1`Meiru2co5nH1-4qEgvb9)+s`R{OnK=97I8&^HBp%Xe#+q=}EkJ*P-S;#m$ ztN-*pI_T8Lk>3rQ_2q?wU~~OoA8zw459{OJ#E}UsAEC?YFNHxQ@IPzNx%ldkT_0ob zEL*Yu@eFiP`l6v9FDw`hGdlG`q{{&P7e;J``A&VpdkkQxur3=W@F}*{ut}4E!F7T@ zNe&t2bvlJW)G#6Flian2O`6{V4?Z00je!T8iu?DD=k9>jF-BYNgNMZ8PZ?B#EgMN z*2Bz_C@Pc3p8E03FccXKFvGYxa|YAUZCOa|U{tK+&SPA};e`wgR>mpkgV_?Zic`s>%+!hcglREjAQ5Mc8{`&dBV4?Y zv>0dc$>%mML(TObBRNy)MB@xTjchaKF=5U%&fs|VTSkO)A%2l@1tN!b8U-jmI$|W| z%VWkxd`f-KIEzpIJB;Hvo|!a~krTU&E7%;_V?>A-qI-=MO#Cy(ad4Q?j3n3G!^T-m zBKwUTjz=GBixYXmIIKr%A$Q1#s4v9-+n9!;TF)DYbUka4qsCQzA@Hhk1{6xK8OdD5 znsFJ@r0T{o99nSc_E0LCwVy(rn<2V)XV8`IZRX1A!J2|C2No-|@VdU~Q zmNb_*mz@D${0?>upAr!kf@-0Q*)*=Xm>uw8%gyWnqza9*>rWevTdJBvqRXN+QX6tn;DkEI`a_A;ZybzHV;liIo3rseu7b|E87O1! z8Frr1%t5vnpHhd|A@aF0yNby|l@*|#(*LrnxF@&9hKZl|+SEtZ*-_ZIxWOWQ7Ls4E z!(gNO73;$B_0EnkF6_5=P~uroJ1Ft=pV+a4&CQcK^5oyAb@Y+}Pw$|}i3U4HVVs3f z#|CUNcST3-@iJJhjBVf$Q1*aM<(bf`GauXpr1LF=my$`yW&8}0|I+c}p@ zpJax(Aw8(H`rmS!`a=C$jvT%@&Z!_S{*WU<6ZdlSxY(cOdUa!Kk%u{?#te;x+QZxg zn2A2hRY2PRG}lYny~w5Y>$F;lTY*f6IHWyoy3CD%V3}J%UM(NN4lVa0m&efxM^09M zi5nv2t#Gi0mVBKEmtN)5KjelX;D;P4bs^Z`kOQ^MC&YBEJ^D8|1Q7En z2XE9OElw|VTB=2tms{K_q?+60@-SzVGts1FH4WqTsLixSWV%h19-0ml{8bCNO^|QS zZR*39n%9IRr8Rvf2$pEljH>Fs=3Xn7~4^$JB=anLEVnn+0I3e(_8`XuzD zV-z6&k4<6NP`uAHPzSA>I_DjbKiS#n!95Rm_HEH8zCtHu>DKd|gK)9n8=Yw=tGw1Z zK#aZLnMQnMnw=FYh8vxWAmRI>bNpbbqaiuAJ-R>MZOoY zlw0OiP$<=S4)!b8c`{q#9e&oYPsC2M02%x?^E^IPyUjDWIDUe8OvOsbOnEYRzIhYD z8N9^2NZxg+c^OPZ%>$6Pd8N4zs_=2>zB|p7 z)e?7`i9z3w&9h*+_){}gfAM~ESk@;azcJ^jG{0o#ARqs>dBv-mJkCNjE$O!a-4^(hEffI0Q!SL( zL)$FC`GrisWt4?Z1}vnLb1W+IQ*EbZ5C-;*S_skvZ?KGki`c!e=cYCS?9w8WnvPRvX={#6q{EFQ(!*%T>+4}P`*YW(=@LW5V~4$Owc>DLUl}_1X{egJ;}v| z73e8BDNuP&{X`f--l$FsdAfLyz~P$IKMTm5ff-?ge0*P{BS8m?Xcl|W^_{|N!E ztz~{Iz%;%m1*#sog8~Qr&mE>~wA>5Wq6Lo7)`cSiwbX5UKj4EloEs*vLh52W$k)YrnGz zR1Kc7shIHp(I!zpXcNdM{>w)AF!r2nl0F@_O(ND~f3mF+Kh5@@;{Ua!5I1ZC)Dd;s zN2vr^?2BM5=Cl(c?)TUspcd<~qhuF*>;(PeetTo9J{bwyhv;;~?gGdu#q3mp<8k{q zKGnwUfIV944toQ_+-V;rw(hnQcorw^8zkPnc4``nQ+5h=|89F994Y#9Ivu*-zKYZS z2kcZln-AI{rdHF4&;EV(Wx~$;?Q5q(B`?~S&jX)g_W&VVXZI`uIkmNW2G{sb>YhXe z&z{x|&+qT+Uc#2QK)Le0 z;0Ocq#6EDi;33J69P?DAK6Y%P=mk0@a=mF@A~YDXN>p;|-4dN@Iiv|lkZ?-W^Y9*t zdi&`u(h_xqJ<<~P@P3KJEp3%3lZq!w)a@?>B*NT*J}Hb!o47#IlZ#fnKq91lp+s%6 z?=oqMGX1bb;hnrnB8V8hTB7ooxK0|yN;TGAY2GZ+V@CZ}sX?E{rA@*kw@WHATyvL1 zNG$j>iF(*jTB0_q`CyyB_&$kRsD-RVg_Zw>)W%Z#r9lD`d5Lgf`EiL_^4LQA9`WBK z$`|#2Z)+#_pAx~M=pl(Z%jv^yHHBVit0{9t+5qaGK1xby9+lw3*;l0rm|k3ys0z0} zlxD$A_RmrpXeMBF_99B6Tb&$5$u{TIY5FzwYn*Vd?5MMS&27#hgkS6~C--&8n{(3J z&wAcTQ4)L7IY!0fDd(gFutW9s0yS;UXuPzQ;u!fAD9n0WWUOxhU&r@~&ax zc+NEsVX_663*~;{c^3ieV#P&pP^`MB#jC&T8l)EDL)Rv5_J86UBA!_{b?BnmJ&2%* zp5i9dQ9I3DfraKychm9pGu;AKT4%YbD=2SwPasu>2HnVm$w9Y3LR{#kO4EwCDLa?H z?VbYh=y%)%42xI0XR&8wv^{BE>n6w^zsWs7<^5(if_nXCcLiyyIOV1cnS9WV*VqCx z<0d()kGsiHiVJRfaq}14$^QvZKL;l@CsZ=?e$Q1QQYU5!abq=9*V|f-a`=^`HhF-T>MuLq4$vko(A>nhdlJs zGIGR|$Anq&^pfm<^iVs{zv`iE#lPiI(V7OjybZtrpWjvf&3PZDu2 zVTRJUm+Ut811~Aw_aiSoke2T8Rsgaxzx7f~MV|H&GH5;HrIZw0@&Z3<<-=YCYpLv| z4Cz1Ooy2{)SG;TFmaE=AQpVffMS37>c=1xE`9Akn!06}RNowINK7t-qtB)cfXY&z% zqT5H$wQ<##CeQ8hktG5r`+$x$@f6=YxH-i~AyGZsw^D+bpZQ!L zZfzlzX8y8;o>T%~ZfRGlueQ+RPLP-Bjj$xigcBK;O!%Ak%58MHMP9;WU6I@Gbv-iq zRn0FCAY+JU$pTjV19F()+&MBm@F#c3Gk_T4PMID6N4_mn3FWVl3D+%rS5^Vrt2fE* z+VFRBFM0mo%N2Uyx=W^96q}Ukk%zxW-bB3cX_*l5!i>C0b@CCJ&_?ZFWO^U1{z|51 zr1fi=@PFzVnJ}_gl<9p$JSY>8ijJcuoGf08M|k9;bVDPo_=<5UFyBGX%O?Ms=SxdN;*2vTv2LVzn}RYoCS z-KS6%&umpltl~)u0gGxtp$t*(Qz);m_bc?WD4wmfQwWb%8Q6%5>mlU#R=oO{?5^z)@9p`?p&?7m8LV(KcT@b9URQ_J3>QUh_TIzg^^ySjq3n3`6}M6rKTshN)K sQITXc-(GbUn%JwNiHSa_5-@G