123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- !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)
|