186 lines
3.6 KiB
Plaintext
186 lines
3.6 KiB
Plaintext
|
!ifndef NULLSOFT_NX_TEXT_RECT_NSIS_HEADER
|
||
|
!define NULLSOFT_NX_TEXT_RECT_NSIS_HEADER
|
||
|
|
||
|
!include "util.nsh"
|
||
|
!include "logicLib.nsh"
|
||
|
!include "system.nsh"
|
||
|
|
||
|
!macro NX_CalculateTextRectInternal
|
||
|
!define hwnd_ $R0
|
||
|
!define text_ $R1
|
||
|
!define style_ $R2
|
||
|
!define maxWidth_ $R3
|
||
|
!define hdc_ $R4
|
||
|
!define font_ $R5
|
||
|
!define previousFont_ $R6
|
||
|
!define width_ $R7
|
||
|
!define height_ $R8
|
||
|
!define averageCharWidth_ $R9
|
||
|
|
||
|
Exch ${hwnd_}
|
||
|
Exch 1
|
||
|
Exch ${text_}
|
||
|
Exch 2
|
||
|
Exch ${style_}
|
||
|
Exch 3
|
||
|
Exch ${maxWidth_}
|
||
|
|
||
|
Push ${hdc_}
|
||
|
Push ${font_}
|
||
|
Push ${previousFont_}
|
||
|
Push ${width_}
|
||
|
Push ${height_}
|
||
|
Push ${averageCharWidth_}
|
||
|
|
||
|
StrCpy ${width_} 0
|
||
|
StrCpy ${height_} 0
|
||
|
StrCpy ${averageCharWidth_} 0
|
||
|
|
||
|
System::Call "${fnGetDCEx}(${hwnd_}, 0, ${DCX_CACHE}|${DCX_NORESETATTRS}).s"
|
||
|
Pop ${hdc_}
|
||
|
|
||
|
SendMessage ${hwnd_} ${WM_GETFONT} 0 0 ${font_}
|
||
|
System::Call "${fnSelectObject}(${hdc_}, ${font_}).s"
|
||
|
Pop ${previousFont_}
|
||
|
|
||
|
; Get Text Metrics (in case of empty line)
|
||
|
Push $0
|
||
|
Push $1
|
||
|
System::Call "*${stTEXTMETRIC} .r1"
|
||
|
System::Call "${fnGetTextMetrics}(${hdc_}, $1).r0"
|
||
|
${If} $0 != 0
|
||
|
Push $2
|
||
|
System::Call "*$1${stTEXTMETRIC}(.r0, ., ., ., ., .r2, _)"
|
||
|
StrCpy ${height_} $0
|
||
|
StrCpy ${averageCharWidth_} $2
|
||
|
Pop $2
|
||
|
${EndIf}
|
||
|
|
||
|
System::Free $1
|
||
|
Pop $1
|
||
|
Pop $0
|
||
|
|
||
|
; Calculate Text Rect
|
||
|
Push $0
|
||
|
StrLen $0 ${text_}
|
||
|
${If} $0 != 0
|
||
|
Push $1 ; rect
|
||
|
Push $2 ; text flags
|
||
|
|
||
|
; build text flags
|
||
|
StrCpy $2 ${DT_CALCRECT}|${DT_LEFT}|${DT_TOP}
|
||
|
IntOp $2 $2 | ${style_}
|
||
|
|
||
|
System::Call "*${stRECT}(0, 0, ${maxWidth_}, $0) .r1"
|
||
|
System::Call "${fnDrawText}(${hdc_}, '${text_}', -1, $1, $2).r0"
|
||
|
${if} $0 != 0
|
||
|
Push $3
|
||
|
Push $4
|
||
|
Push $5
|
||
|
|
||
|
System::Call "*$1${stRECT}(.r2, .r3, .r4, .r5)"
|
||
|
IntOp ${width_} $4 - $2
|
||
|
IntOp $3 $5 - $3
|
||
|
${if} $3 > ${height_}
|
||
|
StrCpy ${height_} $3
|
||
|
${EndIf}
|
||
|
|
||
|
IntOp $4 ${averageCharWidth_} / 2
|
||
|
IntOp ${width_} ${width_} + $4
|
||
|
|
||
|
Pop $5
|
||
|
Pop $4
|
||
|
Pop $3
|
||
|
${EndIf}
|
||
|
|
||
|
System::Free $1
|
||
|
Pop $2 ; text flags
|
||
|
Pop $1 ; rect
|
||
|
${EndIf}
|
||
|
Pop $0
|
||
|
|
||
|
${If} ${previousFont_} != 0
|
||
|
System::Call "${fnSelectObject}(${hdc_}, ${previousFont_})"
|
||
|
${EndIf}
|
||
|
|
||
|
System::Call "${fnReleaseDC}(${hwnd_}, ${hdc_})"
|
||
|
|
||
|
StrCpy ${style_} ${width_}
|
||
|
StrCpy ${text_} ${height_}
|
||
|
|
||
|
Pop ${averageCharWidth_}
|
||
|
Pop ${height_}
|
||
|
Pop ${width_}
|
||
|
Pop ${previousFont_}
|
||
|
Pop ${font_}
|
||
|
Pop ${hdc_}
|
||
|
Pop ${maxWidth_}
|
||
|
Pop ${hwnd_}
|
||
|
Exch ${text_}
|
||
|
Exch
|
||
|
Exch ${style_}
|
||
|
|
||
|
!undef hwnd_
|
||
|
!undef text_
|
||
|
!undef style_
|
||
|
!undef maxWidth_
|
||
|
!undef hdc_
|
||
|
!undef font_
|
||
|
!undef previousFont_
|
||
|
!undef width_
|
||
|
!undef height_
|
||
|
!undef averageCharWidth_
|
||
|
!macroend
|
||
|
|
||
|
!macro NX_CalculateTextRect __hwnd __text __style __maxWidth __width __height
|
||
|
Push "${__maxWidth}"
|
||
|
Push "${__style}"
|
||
|
Push "${__text}"
|
||
|
Push "${__hwnd}"
|
||
|
${CallArtificialFunction} NX_CalculateTextRectInternal
|
||
|
Pop "${__width}"
|
||
|
Pop "${__height}"
|
||
|
!macroend
|
||
|
|
||
|
!define NX_CalculateTextRect `!insertmacro NX_CalculateTextRect`
|
||
|
|
||
|
!macro NX_GetLabelIdealSize __hwnd __maxWidth __width __height
|
||
|
Push "${__maxWidth}"
|
||
|
|
||
|
System::Call "${fnGetWindowLong}(${__hwnd}, ${GWL_STYLE}).s"
|
||
|
Exch $0
|
||
|
Push $1
|
||
|
Push $2
|
||
|
|
||
|
StrCpy $2 0
|
||
|
IntOp $1 $0 & ${SS_EDITCONTROL}
|
||
|
${If} $1 != 0
|
||
|
IntOp $2 $2 | ${DT_EDITCONTROL}
|
||
|
${EndIf}
|
||
|
|
||
|
IntOp $1 $0 & ${SS_NOPREFIX}
|
||
|
${If} $1 != 0
|
||
|
IntOp $2 $2 | ${DT_NOPREFIX}
|
||
|
${EndIf}
|
||
|
|
||
|
IntOp $1 $0 & ${SS_SIMPLE}
|
||
|
${If} $1 != 0
|
||
|
IntOp $2 $2 | ${DT_SINGLELINE}
|
||
|
${Else}
|
||
|
IntOp $2 $2 | ${DT_WORDBREAK}
|
||
|
${EndIf}
|
||
|
|
||
|
StrCpy $0 $2
|
||
|
Pop $2
|
||
|
Pop $1
|
||
|
Exch $0
|
||
|
|
||
|
System::Call "${fnGetWindowText}(${__hwnd}, .s, ${NSIS_MAX_STRLEN})"
|
||
|
Push "${__hwnd}"
|
||
|
${CallArtificialFunction} NX_CalculateTextRectInternal
|
||
|
Pop "${__width}"
|
||
|
Pop "${__height}"
|
||
|
!macroend
|
||
|
!define NX_GetLabelIdealSize `!insertmacro NX_GetLabelIdealSize`
|
||
|
|
||
|
!endif ; defined(NULLSOFT_NX_TEXT_RECT_NSIS_HEADER)
|