0028316: Coding Rules - Elimilate confusing aliases of Standard_Real type in V3d_View
[occt.git] / src / Cocoa / Cocoa_Window.mm
1 // Created on: 2012-11-12
2 // Created by: Kirill GAVRILOV
3 // Copyright (c) 2012-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #import <TargetConditionals.h>
17
18 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
19   #import <UIKit/UIKit.h>
20 #else
21   #import <Cocoa/Cocoa.h>
22 #endif
23
24 #include <Cocoa_Window.hxx>
25
26 #include <Cocoa_LocalPool.hxx>
27
28 #include <Image_AlienPixMap.hxx>
29 #include <Aspect_Convert.hxx>
30 #include <Aspect_WindowDefinitionError.hxx>
31
32 IMPLEMENT_STANDARD_RTTIEXT(Cocoa_Window,Aspect_Window)
33
34 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
35   //
36 #else
37 static Standard_Integer getScreenBottom()
38 {
39   Cocoa_LocalPool aLocalPool;
40   NSArray* aScreens = [NSScreen screens];
41   if (aScreens == NULL || [aScreens count] == 0)
42   {
43     return 0;
44   }
45
46   NSScreen* aScreen = (NSScreen* )[aScreens objectAtIndex: 0];
47   NSDictionary* aDict = [aScreen deviceDescription];
48   NSNumber* aNumber = [aDict objectForKey: @"NSScreenNumber"];
49   if (aNumber == NULL
50   || [aNumber isKindOfClass: [NSNumber class]] == NO)
51   {
52     return 0;
53   }
54
55   CGDirectDisplayID aDispId = [aNumber unsignedIntValue];
56   CGRect aRect = CGDisplayBounds(aDispId);
57   return Standard_Integer(aRect.origin.y + aRect.size.height);
58 }
59 #endif
60
61 // =======================================================================
62 // function : Cocoa_Window
63 // purpose  :
64 // =======================================================================
65 Cocoa_Window::Cocoa_Window (const Standard_CString theTitle,
66                             const Standard_Integer thePxLeft,
67                             const Standard_Integer thePxTop,
68                             const Standard_Integer thePxWidth,
69                             const Standard_Integer thePxHeight)
70 : Aspect_Window (),
71 #if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE)
72   myHWindow (NULL),
73 #endif
74   myHView   (NULL),
75   myXLeft   (thePxLeft),
76   myYTop    (thePxTop),
77   myXRight  (thePxLeft + thePxWidth),
78   myYBottom (thePxTop + thePxHeight)
79 {
80 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
81   //
82 #else
83   if (thePxWidth <= 0 || thePxHeight <= 0)
84   {
85     throw Aspect_WindowDefinitionError("Coordinate(s) out of range");
86   }
87   else if (NSApp == NULL)
88   {
89     throw Aspect_WindowDefinitionError("Cocoa application should be instantiated before window");
90     return;
91   }
92
93   // convert top-bottom coordinates to bottom-top (Cocoa)
94   myYTop    = getScreenBottom() - myYBottom;
95   myYBottom = myYTop + thePxHeight;
96
97   Cocoa_LocalPool aLocalPool;
98   NSUInteger aWinStyle = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;
99   NSRect aRectNs = NSMakeRect (float(myXLeft), float(myYTop), float(thePxWidth), float(thePxHeight));
100   myHWindow = [[NSWindow alloc] initWithContentRect: aRectNs
101                                           styleMask: aWinStyle
102                                             backing: NSBackingStoreBuffered
103                                               defer: NO];
104   if (myHWindow == NULL)
105   {
106     throw Aspect_WindowDefinitionError("Unable to create window");
107   }
108   myHView = [[myHWindow contentView] retain];
109
110   NSString* aTitleNs = [[NSString alloc] initWithUTF8String: theTitle];
111   [myHWindow setTitle: aTitleNs];
112   [aTitleNs release];
113
114   // do not destroy NSWindow on close - we didn't handle it!
115   [myHWindow setReleasedWhenClosed: NO];
116 #endif
117 }
118
119 // =======================================================================
120 // function : Cocoa_Window
121 // purpose  :
122 // =======================================================================
123 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
124 Cocoa_Window::Cocoa_Window (UIView* theViewNS)
125 : Aspect_Window(),
126 #else
127 Cocoa_Window::Cocoa_Window (NSView* theViewNS)
128 : Aspect_Window(),
129   myHWindow (NULL),
130 #endif
131   myHView   (NULL),
132   myXLeft   (0),
133   myYTop    (0),
134   myXRight  (512),
135   myYBottom (512)
136 {
137 #if defined(HAVE_OBJC_ARC)
138   myHView = theViewNS;
139 #else
140   myHView = [theViewNS retain];
141 #endif
142   DoResize();
143 }
144
145 // =======================================================================
146 // function : ~Cocoa_Window
147 // purpose  :
148 // =======================================================================
149 Cocoa_Window::~Cocoa_Window()
150 {
151 #if !defined(HAVE_OBJC_ARC)
152   Cocoa_LocalPool aLocalPool;
153 #endif
154 #if !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE)
155   if (myHWindow != NULL)
156   {
157   #if !defined(HAVE_OBJC_ARC)
158     //[myHWindow close];
159     [myHWindow release];
160   #endif
161     myHWindow = NULL;
162   }
163 #endif
164   if (myHView != NULL)
165   {
166   #if !defined(HAVE_OBJC_ARC)
167     [myHView release];
168   #endif
169     myHView = NULL;
170   }
171 }
172
173 // =======================================================================
174 // function : SetHView
175 // purpose  :
176 // =======================================================================
177 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
178 void Cocoa_Window::SetHView (UIView* theView)
179 {
180 #else
181 void Cocoa_Window::SetHView (NSView* theView)
182 {
183   if (myHWindow != NULL)
184   {
185     [myHWindow setContentView: theView];
186   }
187 #endif
188
189 #if defined(HAVE_OBJC_ARC)
190   myHView = theView;
191 #else
192   if (myHView != NULL)
193   {
194     [myHView release];
195     myHView = NULL;
196   }
197   myHView = [theView retain];
198 #endif
199 }
200
201 // =======================================================================
202 // function : IsMapped
203 // purpose  :
204 // =======================================================================
205 Standard_Boolean Cocoa_Window::IsMapped() const
206 {
207   if (IsVirtual())
208   {
209     return Standard_True;
210   }
211
212 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
213   return myHView != NULL;
214 #else
215   return myHView != NULL
216    &&  [[myHView window] isVisible];
217 #endif
218 }
219
220 // =======================================================================
221 // function : Map
222 // purpose  :
223 // =======================================================================
224 void Cocoa_Window::Map() const
225 {
226   if (IsVirtual())
227   {
228     return;
229   }
230
231   if (myHView != NULL)
232   {
233   #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
234     //
235   #else
236     [[myHView window] orderFront: NULL];
237   #endif
238   }
239 }
240
241 // =======================================================================
242 // function : Unmap
243 // purpose  :
244 // =======================================================================
245 void Cocoa_Window::Unmap() const
246 {
247   if (myHView != NULL)
248   {
249   #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
250     //
251   #else
252     [[myHView window] orderOut: NULL];
253   #endif
254   }
255 }
256
257 // =======================================================================
258 // function : DoResize
259 // purpose  :
260 // =======================================================================
261 Aspect_TypeOfResize Cocoa_Window::DoResize() const
262 {
263   if (myHView == NULL)
264   {
265     return Aspect_TOR_UNKNOWN;
266   }
267
268 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
269   CGRect aBounds = [myHView bounds];
270 #else
271   NSRect aBounds = [myHView bounds];
272 #endif
273   Standard_Integer aMask = 0;
274   Aspect_TypeOfResize aMode = Aspect_TOR_UNKNOWN;
275
276   if (Abs ((Standard_Integer )aBounds.origin.x                         - myXLeft  ) > 2) aMask |= 1;
277   if (Abs ((Standard_Integer )(aBounds.origin.x + aBounds.size.width)  - myXRight ) > 2) aMask |= 2;
278   if (Abs ((Standard_Integer )aBounds.origin.y                         - myYTop   ) > 2) aMask |= 4;
279   if (Abs ((Standard_Integer )(aBounds.origin.y + aBounds.size.height) - myYBottom) > 2) aMask |= 8;
280   switch (aMask)
281   {
282     case 0:  aMode = Aspect_TOR_NO_BORDER;               break;
283     case 1:  aMode = Aspect_TOR_LEFT_BORDER;             break;
284     case 2:  aMode = Aspect_TOR_RIGHT_BORDER;            break;
285     case 4:  aMode = Aspect_TOR_TOP_BORDER;              break;
286     case 5:  aMode = Aspect_TOR_LEFT_AND_TOP_BORDER;     break;
287     case 6:  aMode = Aspect_TOR_TOP_AND_RIGHT_BORDER;    break;
288     case 8:  aMode = Aspect_TOR_BOTTOM_BORDER;           break;
289     case 9:  aMode = Aspect_TOR_BOTTOM_AND_LEFT_BORDER;  break;
290     case 10: aMode = Aspect_TOR_RIGHT_AND_BOTTOM_BORDER; break;
291     default: break;
292   }
293
294   *((Standard_Integer* )&myXLeft   ) = (Standard_Integer )aBounds.origin.x;
295   *((Standard_Integer* )&myXRight  ) = (Standard_Integer )(aBounds.origin.x + aBounds.size.width);
296   *((Standard_Integer* )&myYTop    ) = (Standard_Integer )aBounds.origin.y;
297   *((Standard_Integer* )&myYBottom ) = (Standard_Integer )(aBounds.origin.y + aBounds.size.height);
298   return aMode;
299 }
300
301 // =======================================================================
302 // function : DoMapping
303 // purpose  :
304 // =======================================================================
305 Standard_Boolean Cocoa_Window::DoMapping() const
306 {
307   return Standard_True;
308 }
309
310 // =======================================================================
311 // function : Ratio
312 // purpose  :
313 // =======================================================================
314 Standard_Real Cocoa_Window::Ratio() const
315 {
316   if (myHView == NULL)
317   {
318     return 1.0;
319   }
320
321 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
322   CGRect aBounds = [myHView bounds];
323 #else
324   NSRect aBounds = [myHView bounds];
325 #endif
326   return Standard_Real (aBounds.size.width / aBounds.size.height);
327 }
328
329 // =======================================================================
330 // function : Position
331 // purpose  :
332 // =======================================================================
333 void Cocoa_Window::Position (Standard_Integer& X1, Standard_Integer& Y1,
334                              Standard_Integer& X2, Standard_Integer& Y2) const
335 {
336 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
337   CGRect aBounds = [myHView bounds];
338   X1 = 0;
339   Y1 = 0;
340   X2 = (Standard_Integer )aBounds.size.width;
341   Y2 = (Standard_Integer )aBounds.size.height;
342 #else
343   NSWindow* aWindow = [myHView window];
344   NSRect aWindowRect = [aWindow frame];
345   X1 = (Standard_Integer) aWindowRect.origin.x;
346   Y1 = getScreenBottom() - (Standard_Integer) aWindowRect.origin.y - (Standard_Integer) aWindowRect.size.height;
347   X2 = X1 + (Standard_Integer) aWindowRect.size.width;
348   Y2 = Y1 + (Standard_Integer) aWindowRect.size.height;
349 #endif
350 }
351
352 // =======================================================================
353 // function : Size
354 // purpose  :
355 // =======================================================================
356 void Cocoa_Window::Size (Standard_Integer& theWidth,
357                          Standard_Integer& theHeight) const
358 {
359   if (myHView == NULL)
360   {
361     return;
362   }
363
364 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
365   CGRect aBounds = [myHView bounds];
366 #else
367   NSRect aBounds = [myHView bounds];
368 #endif
369   theWidth  = (Standard_Integer )aBounds.size.width;
370   theHeight = (Standard_Integer )aBounds.size.height;
371 }