Difference between revisions of "Mac OS X Porting - Native Controls"

From Apache OpenOffice Wiki
Jump to: navigation, search
(How a ScrollBar is drawn)
(How a ScrollBar is drawn)
Line 66: Line 66:
  
 
=====How a ScrollBar is drawn=====
 
=====How a ScrollBar is drawn=====
After printing out the part numbers passed to draw a ScrollBar. I found out how it is actually drawn out:
+
After printing out the part numbers passed to draw a ScrollBar, I found out how it is actually drawn out:
 
* 1. Part 101 - PART_BUTTON_UP
 
* 1. Part 101 - PART_BUTTON_UP
 
* 2. Part 102 - PART_BUTTON_DOWN
 
* 2. Part 102 - PART_BUTTON_DOWN
Line 73: Line 73:
 
* 5. Part 203 - PART_TRACK_VERT_LOWER
 
* 5. Part 203 - PART_TRACK_VERT_LOWER
  
The first two parts are self-explanatory. The last 3 are a little more confusing at first especially since some heights and widths are negative. But here is what they are.
+
The first two parts are self-explanatory. The last 3 are a little more confusing at first especially since some heights and widths can be negative. But here is what they are.
  
 
=====Part 211=====
 
=====Part 211=====

Revision as of 02:26, 11 September 2006

Native Controls

Contributors

Introduction

The purpose of this article is to present our current knowledge and progress of the implementation of native controls in the native Mac OS X version of OpenOffice.org. Our goal by implementing native controls is to remove the win32 look as much as possible and replace it by the Aqua look and feel using the Carbon API.

Apple Documentation and References

The Appearance Manager and HITheme

Apple provides an easy way to change a custom user interface to an aqua interface by using the Appearance Manager(AM). This API was first developed for Mac OS 8 and is centered around QuickDraw. The AM is less and less supported by Apple since 10.2 and any implementation needs to be replaced with the HIToolbox version: HITheme. The problem with HITheme is that its implementation started on Mac OS X 10.2 (Jaguar) and has since gone under many revisions and new functions have been progressively added with each new version of OS X. Therefore some functions in the 10.4 version might not be in 10.3 or 10.2. This will probably be one of the reason why the native version of OpenOffice.org will run on Mac OS X 10.4 and higher only.

Using HITheme

Unfortunately there is not much documentation provided by Apple about HITheme. Thus we have to look at the HITheme.h header file directly and read the extensive comments to understand how to use this API. All the constants used to describe the type of controls that we want to implement is still the same as in the AM. This is the reason why the AM reference document is still useful and should always be opened when implementing native controls. The AM and HITheme are very similar in the way they approach the implementation of native controls, most of the time the functions have similar names and the arguments different types so you can always use the AM reference to give you an idea about the procedure to follow.

  • Location of HITheme.h: /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/HITheme.h

Native controls in VCL

Native Controls Files in VCL

salnativewidgets.cxx

This file was copied directly from the Windows implementation of native controls. All the useless functions were removed and we are left with 6 functions:

  • isNativeControlSupported: function called to see if a control should be implemented natively or not. A big switch statement that goes through all the controls and part of controls possible. Returns true when a control is supported. Each time a new control is implemented this function should be modified so the new native code is used at compile time.
  • hitTestNativeControl: Boolean function. If the return value is TRUE, bIsInside contains information whether aPos was or not inside the native widget specified by the nType/nPart combination.
  • getState: a translation from the VCL constants to the Carbon constants of the state of controls.
  • drawNativeControl: the most important function. This is where the code for new native controls is written. Again it is a big switch statment that lists each control with the corresponding implementation. Needs to be modified each time a new control is implemented.
  • drawNativeControlText: [TO DO]
  • getNativeControlRegion: [TO DO]

salnativewidgets.hxx

Uses AquaSalGraphics class, defined in vcl/aqua/inc/salgdi.h. AquaSalGraphics itself inherits of SalGraphics virtual class (defined in vcl/inc/salgdi.hxx).

This header file describes all the structures, classes and constants used to get the state and properties of the VCL controls. It is necessary to be familiar with this file since its content will be used to translate the state and properties to their Carbon equivalent.

Most of the stuff used in salnativewidgets.hxx are from HITheme.h (or Appearance.h for previous test)

The native controls and the implementation

Here is a list of all the controls that need to be native. Since some of them do not have the same name in VCL and Carbon, they are listed in this format: <VCL name> - <Carbon name> when they are different.

Push Button

This is the regular OK, Cancel buttons.

Radio Button

This is the regular radio button.

Check Box

This is the regular check box.

ScrollBar

This is the regular scrollbar.

Current status

How a ScrollBar is drawn

After printing out the part numbers passed to draw a ScrollBar, I found out how it is actually drawn out:

  • 1. Part 101 - PART_BUTTON_UP
  • 2. Part 102 - PART_BUTTON_DOWN
  • 3. Part 211 - PART_THUMB_VERT
  • 4. Part 201 - PART_TRACK_VERT_UPPER
  • 5. Part 203 - PART_TRACK_VERT_LOWER

The first two parts are self-explanatory. The last 3 are a little more confusing at first especially since some heights and widths can be negative. But here is what they are.

Part 211

This part is the slider. As described by its value, it is vertical. The horizontal equivalent is part 210 - PART_THUMB_HORZ.

Part 201 - Part 203

These are the parts that are between the slider and the arrows. Part 201 is between the slider and the upper arrow. Part 203 is between the slider and the lower arrow. Each one of them can actually have a negative size in the case where the slider touches one or both of the arrows. The equivalents for a horizontal scrollbar are part 200 - PART_TRACK_HORZ_LEFT and part 202 - PART_TRACK_HORZ_RIGHT.


(10th September) Now the scrollbar is correctly drawn. Missing: always full (needs some work). modify the top control coordinates, manage active/not active.

Patch available here : http://eric.bachard.free.fr/mac/aquavcl/patches/controls/scrollbar/scrollbar10sept.diff

Screenshot :

scrollbar10sept.jpg

(03rd September) Does not work as expected, work in progress to fix arrows issue, and obtain correct redrawing (arrows are correctly drawn, but not at good place). See screenshot:

Current state of native scrollbar

More to come...


Current state of native controls

Current state of native controls. Bigger Version
Personal tools