1# Copyright (c) 2006-2008, The RubyCocoa Project.
2# Copyright (c) 2001-2006, FUJIMOTO Hisakuni.
3# All Rights Reserved.
4#
5# RubyCocoa is free software, covered under either the Ruby's license or the 
6# LGPL. See the COPYRIGHT file for more information.
7
8require 'nkf'
9
10module OSX
11
12  # from NSBundle
13  def NSLocalizedString (key, comment = nil)
14    OSX::NSBundle.mainBundle.
15      localizedStringForKey_value_table(key, "", nil)
16  end
17  def NSLocalizedStringFromTable (key, tbl, comment = nil)
18    OSX::NSBundle.mainBundle.
19      localizedStringForKey_value_table(key, "", tbl)
20  end
21  def NSLocalizedStringFromTableInBundle (key, tbl, bundle, comment = nil)
22    bundle.localizedStringForKey_value_table(key, "", tbl)
23  end
24  module_function :NSLocalizedStringFromTableInBundle
25  module_function :NSLocalizedStringFromTable
26  module_function :NSLocalizedString
27
28  # for NSData
29  class NSData
30
31    def NSData.dataWithRubyString (str)
32      NSData.dataWithBytes_length( str )
33    end
34
35  end
36
37  # for NSMutableData
38  class NSMutableData
39
40    def NSMutableData.dataWithRubyString (str)
41      NSMutableData.dataWithBytes_length( str )
42    end
43
44  end
45
46  # for NSString
47  class NSString
48
49    def NSString.guess_nsencoding(rbstr)
50      case NSString.guess_encoding(rbstr)
51      when NKF::JIS then NSISO2022JPStringEncoding
52      when NKF::EUC then NSJapaneseEUCStringEncoding
53      when NKF::SJIS then NSShiftJISStringEncoding
54      else 
55        if defined? NSProprietaryStringEncoding
56          NSProprietaryStringEncoding
57        else
58          NSUTF8StringEncoding
59        end
60      end
61    end
62
63    def NSString.guess_encoding(rbstr)
64      NKF.guess(rbstr)
65    end
66
67    # NKF.guess fails on ruby-1.8.2
68    if NKF.respond_to?('guess1') && NKF::NKF_VERSION == "2.0.4"
69      def NSString.guess_encoding(rbstr)
70        NKF.guess1(rbstr)
71      end
72    end
73
74    def NSString.stringWithRubyString (str)
75      data = NSData.dataWithRubyString( str )
76      enc = guess_nsencoding( str )
77      NSString.alloc.initWithData_encoding( data, enc )
78    end
79
80  end
81
82  # for NSMutableString
83  class NSMutableString
84    def NSMutableString.stringWithRubyString (str)
85      data = NSData.dataWithRubyString( str )
86      enc = NSString.guess_nsencoding( str )
87      NSMutableString.alloc.initWithData_encoding( data, enc )
88    end
89  end
90
91  # This moved there as osx/coredata is now deprecated.
92  module CoreData
93    # define wrappers from NSManagedObjectModel
94    def define_wrapper(model)
95      unless model.isKindOfClass? OSX::NSManagedObjectModel
96        raise RuntimeError, "invalid class: #{model.class}"
97      end
98
99      model.entities.each do |ent|
100        CoreData.define_wrapper_for_entity(ent)
101      end
102    end
103    module_function :define_wrapper
104
105    def define_wrapper_for_entity(entity)
106      klassname = entity.managedObjectClassName.to_s
107      return if klassname == 'NSManagedObject'
108      unless Object.const_defined?(klassname)
109	warn "define_wrapper_for_entity: class \"#{klassname}\" is not defined."
110        return
111      end
112
113      attrs = entity.attributesByName.allKeys.collect {|key| key.to_s}
114      rels = entity.relationshipsByName.allKeys.collect {|key| key.to_s}
115      klass = Object.const_get(klassname)
116      klass.instance_eval <<-EOE_AUTOWRAP,__FILE__,__LINE__+1
117	kvc_wrapper attrs
118	kvc_wrapper_reader rels
119      EOE_AUTOWRAP
120    end
121    module_function :define_wrapper_for_entity
122  end
123
124end
125