PFC Resize Service enhancement to remove requirement to use of_SetOrigSize()

Jim Reese
CODE AUTHOR
Posts: 5
 1 year 8 months ago #455 by Jim Reese
Jim Reese created the code: PFC Resize Service enhancement to remove requirement to use of_SetOrigSize()
While investigating window sizing differences in PB2022, I dug into the PFC code for the window resize service.
We are using the version of PFC that still uses the ClassDefinition to get the original height and width, rather than using WorkspaceHeight() and WorkspaceWidth() in the call to of_SetOrigSize() made from pfc_w_master.of_SetResize(TRUE)

I did numerous comparisons, and found that the window painter values often differed from both the ClassDefinition and the Workspace...() values during window preopen and open events. Workspace...() values were incorrect when opening a sheet as layered!, for example.
Examining the values, I realized that the ClassDefinition height and width values differed from the painter values depending on which window attributes had been set for the particular window.

A window that has none of the attributes set, such as a popup splash with no title or border, has a ClassDefinition width and height that equals the Window Painter width and height values. For each attribute that is enabled, the ClassDefinition width and height values are increased by the following PBU amounts. My screen has a Horizontal Pixel to PBU ratio of 4.5 and a vertical PBU ratio of 4, so the corresponding Pixel values were determined from the PBU values.

PBUs Pixels
Attribute W H W H
------------ -- --- -- --
titlebar 0 72 0 18
menuname 0 64 0 16
hscrollbar 0 76 0 19
vscrollbar 72 0 16 0
resizable 27 24 6 6
border 9 8 2 2
clientedge 18 16 4 4
palettewindow 0 -12 0 -3
By examining the ClassDefinition of the window during of_SetResize(), these values can be subtracted from the reported width and height to determine the original window painter width and height values, removing the need to hard-code the painter values in a call to of_SetOrigSize in the preopen or open event. Those values can be problematic if a developer modifies the size of the window in the painter and neglects to update the values in the script.

Below is my code in w_master.of_SetResize(), overriding the pfc_w_master function it is based on. By coding this, I have been able to remove all of_SetOrigSize() calls in window preopen/open events that are using the resize service.
I have not coded for using a theme, but did a quick test and saw that workspace...() values increased when a theme was used.

//////////////////////////////////////////////////////////////////////////////
// Public Function: of_SetResize
// Arguments: ab_switch starts/stops the window resize service
// Returns: Integer 1 = success, 0 = no action necessary, -1 error
// Description: Starts or stops the window resize service
//////////////////////////////////////////////////////////////////////////////
// Rev. History: Version
// 5.0 Initial version
// 8.0 Modified to initially set window dimensions based on the class definition
// 2022 Jim Reese Modified to handle original window sizes based on painter and window properties that affect size
//////////////////////////////////////////////////////////////////////////////
Integer li_width_offset, li_height_offset, li_found_property //JRR offset values in pixels, convert final sums to PBUs
integer li_rc, li_v, li_vars
integer li_origwidth, li_origheight

// Check arguments
if IsNull (ab_switch) then
return -1
end if

if ab_Switch then
if IsNull(inv_resize) Or not IsValid (inv_resize) then
inv_resize = create n_cst_resize

/* Get this window's class definition and extract the width and height */
classdefinition lcd_class
lcd_class = this.ClassDefinition

li_vars = UpperBound ( lcd_class.VariableList )
For li_v = 1 to li_vars
//JRR BEGIN window size varies from painter based on the following attributes. This adjust(s) based on which are set
CHOOSE CASE lcd_class.VariableList[li_v].Name
CASE "width"
li_found_property ++
li_origwidth = Integer ( lcd_class.VariableList[li_v].InitialValue )
CASE "height"
li_found_property ++
li_origheight = Integer ( lcd_class.VariableList[li_v].InitialValue )
CASE "titlebar"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_height_offset += 18 //72 use pixels for offsets, then convert total number to PBUs at end
END IF
CASE "menuname"
li_found_property ++
0 THEN
li_height_offset += 19 //76
END IF
CASE "hscrollbar"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_height_offset += 19 //76
END IF
CASE "vscrollbar"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_width_offset += 16 //72
END IF
CASE "resizable"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_width_offset += 6 //28
li_height_offset += 6 //24
END IF
CASE "border"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_width_offset += 2 //9
li_height_offset += 2 // 8
END IF
CASE "clientedge"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_width_offset += 4 //18
li_height_offset += 4 //16
END IF
CASE "palettewindow"
li_found_property ++
IF lcd_class.VariableList[li_v].InitialValue THEN
li_height_offset -= 3 //12 //reduces height of titlebar
END IF
END CHOOSE
If li_found_property = 10 Then Exit //exit loop once all 10 values found
//JRR END
Next
li_origwidth -= pixelstounits(li_width_offset,XPixelsToUnits!) //JRR reduce orig by the offset to get back to painter values
li_origheight -= pixelstounits(li_height_offset,YPixelsToUnits!) //JRR reduce orig by the offset to get back to painter values
inv_resize.of_SetOrigSize ( li_origwidth, li_origheight )
end if
else
if IsValid (inv_resize) then
destroy inv_resize
li_rc = 1
end if
end If

return li_rc

Please Log in or Create an account to join the conversation.