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
8# This module adds syntax-sugar APIs on top of the Cocoa structures.
9# This is mostly to preserve backward compatibility with previous versions
10# of RubyCocoa where the C structures support was hardcoded in the bridge.
11# Now structures are automatically handled via the metadata mechanism, but
12# the API is not compatible with what we used to have.
13
14class OSX::NSRect
15  class << self
16    alias_method :orig_new, :new
17    def new(*args)
18      origin, size = case args.size
19      when 0
20        [[0, 0], [0, 0]]
21      when 2
22        [args[0], args[1]]
23      when 4
24        [args[0..1], args[2..3]]
25      else
26        raise ArgumentError, "wrong number of arguments (#{args.size} for either 0, 2 or 4)"
27      end
28      origin = OSX::NSPoint.new(*origin) unless origin.is_a?(OSX::NSPoint)
29      size = OSX::NSSize.new(*size) unless size.is_a?(OSX::NSSize)
30      orig_new(origin, size)
31    end
32  end
33  def x; origin.x; end
34  def y; origin.y; end
35  def width; size.width; end
36  def height; size.height; end
37  def x=(v); origin.x = v; end
38  def y=(v); origin.y = v; end
39  def width=(v); size.width = v; end
40  def height=(v); size.height = v; end
41  alias_method :old_to_a, :to_a # To remove a warning.
42  def to_a; [origin.to_a, size.to_a]; end
43  def center; OSX::NSPoint.new(OSX::NSMidX(self), OSX::NSMidY(self)); end
44  def contain?(arg)
45    case arg
46    when OSX::NSRect
47      OSX::NSContainsRect(self, arg)
48    when OSX::NSPoint
49      OSX::NSPointInRect(arg, self)
50    else
51      raise ArgumentError, "argument should be NSRect or NSPoint"
52    end
53  end
54  def empty?; OSX::NSIsEmptyRect(self); end
55  def inflate(dx, dy); inset(-dx, -dy); end
56  def inset(dx, dy); OSX::NSInsetRect(self, dx, dy); end
57  def integral; OSX::NSIntegralRect(self); end
58  def intersect?(rect); OSX::NSIntersectsRect(self, rect); end
59  def intersection(rect); OSX::NSIntersectionRect(self, rect); end
60  def offset(dx, dy); OSX::NSOffsetRect(self, dx, dy); end
61  def union(rect); OSX::NSUnionRect(self, rect); end
62  def inspect; "#<#{self.class} x=#{x}, y=#{y}, width=#{width}, height=#{height}>"; end
63end
64
65class OSX::NSPoint
66  def in?(rect); OSX::NSPointInRect(self, rect); end
67  alias_method :inRect?, :in?
68  def +(v)
69    if v.is_a?(OSX::NSSize)
70      OSX::NSPoint.new(x + v.width, y + v.height)
71    else
72      raise ArgumentException, "parameter should be NSSize"
73    end
74  end
75  def -(v)
76    if v.is_a?(OSX::NSSize)
77      OSX::NSPoint.new(x - v.width, y - v.height)
78    else
79      raise ArgumentException, "parameter should be NSSize"
80    end
81  end
82  def inspect; "#<#{self.class} x=#{x}, y=#{y}>"; end
83end
84
85class OSX::NSSize
86  def /(v); OSX::NSSize.new(width / v, height / v); end
87  def *(v); OSX::NSSize.new(width * v, height * v); end
88  def +(v); OSX::NSSize.new(width + v, height + v); end
89  def -(v); OSX::NSSize.new(width - v, height - v); end
90  def inspect; "#<#{self.class} width=#{width}, height=#{height}>"; end
91end
92