static void DrawProperties(HWND hwnd, HDC hdc) { PropertiesLayout *layoutData = FindPropertyWindowByHwnd(hwnd); ScopedFont fontLeftTxt(GetSimpleFont(hdc, LEFT_TXT_FONT, LEFT_TXT_FONT_SIZE)); ScopedFont fontRightTxt(GetSimpleFont(hdc, RIGHT_TXT_FONT, RIGHT_TXT_FONT_SIZE)); HGDIOBJ origFont = SelectObject(hdc, fontLeftTxt); /* Just to remember the orig font */ SetBkMode(hdc, TRANSPARENT); ClientRect rcClient(hwnd); FillRect(hdc, &rcClient.ToRECT(), gBrushAboutBg); SetTextColor(hdc, WIN_COL_BLACK); /* render text on the left*/ SelectObject(hdc, fontLeftTxt); for (size_t i = 0; i < layoutData->Count(); i++) { PropertyEl *el = layoutData->At(i); DrawText(hdc, el->leftTxt, -1, &el->leftPos.ToRECT(), DT_RIGHT | DT_NOPREFIX); } /* render text on the right */ SelectObject(hdc, fontRightTxt); for (size_t i = 0; i < layoutData->Count(); i++) { PropertyEl *el = layoutData->At(i); RectI rc = el->rightPos; if (rc.x + rc.dx > rcClient.x + rcClient.dx - PROPERTIES_RECT_PADDING) rc.dx = rcClient.x + rcClient.dx - PROPERTIES_RECT_PADDING - rc.x; DrawText(hdc, el->rightTxt, -1, &rc.ToRECT(), DT_LEFT | DT_PATH_ELLIPSIS | DT_NOPREFIX); } SelectObject(hdc, origFont); }
static void OnPaintProperties(HWND hwnd) { PAINTSTRUCT ps; RectI rc; HDC hdc = BeginPaint(hwnd, &ps); UpdatePropertiesLayout(FindPropertyWindowByHwnd(hwnd), hdc, &rc); DrawProperties(hwnd, hdc); EndPaint(hwnd, &ps); }
// returns true if properties have been copied to the clipboard static void CopyPropertiesToClipboard(HWND hwnd) { PropertiesLayout *layoutData = FindPropertyWindowByHwnd(hwnd); if (!layoutData) return; // concatenate all the properties into a multi-line string str::Str<WCHAR> lines(256); for (size_t i = 0; i < layoutData->Count(); i++) { PropertyEl *el = layoutData->At(i); lines.AppendFmt(L"%s %s\r\n", el->leftTxt, el->rightTxt); } CopyTextToClipboard(lines.LendData()); }
static void DrawProperties(HWND hwnd, HDC hdc) { PropertiesLayout *layoutData = FindPropertyWindowByHwnd(hwnd); ScopedFont fontLeftTxt(CreateSimpleFont(hdc, LEFT_TXT_FONT, LEFT_TXT_FONT_SIZE)); ScopedFont fontRightTxt(CreateSimpleFont(hdc, RIGHT_TXT_FONT, RIGHT_TXT_FONT_SIZE)); HGDIOBJ origFont = SelectObject(hdc, fontLeftTxt); /* Just to remember the orig font */ SetBkMode(hdc, TRANSPARENT); ClientRect rcClient(hwnd); RECT rTmp = rcClient.ToRECT(); ScopedGdiObj<HBRUSH> brushAboutBg(CreateSolidBrush(GetAboutBgColor())); FillRect(hdc, &rTmp, brushAboutBg); SetTextColor(hdc, WIN_COL_BLACK); /* render text on the left*/ SelectObject(hdc, fontLeftTxt); for (size_t i = 0; i < layoutData->Count(); i++) { PropertyEl *el = layoutData->At(i); const WCHAR *txt = el->leftTxt; rTmp = el->leftPos.ToRECT(); DrawText(hdc, txt, -1, &rTmp, DT_RIGHT | DT_NOPREFIX); } /* render text on the right */ SelectObject(hdc, fontRightTxt); for (size_t i = 0; i < layoutData->Count(); i++) { PropertyEl *el = layoutData->At(i); const WCHAR *txt = el->rightTxt; RectI rc = el->rightPos; if (rc.x + rc.dx > rcClient.x + rcClient.dx - PROPERTIES_RECT_PADDING) rc.dx = rcClient.x + rcClient.dx - PROPERTIES_RECT_PADDING - rc.x; rTmp = rc.ToRECT(); UINT format = DT_LEFT | DT_NOPREFIX | (el->isPath ? DT_PATH_ELLIPSIS : DT_WORD_ELLIPSIS); DrawText(hdc, txt, -1, &rTmp, format); } SelectObject(hdc, origFont); }
LRESULT CALLBACK WndProcProperties(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PropertiesLayout *pl; switch (message) { case WM_CREATE: break; case WM_ERASEBKGND: // do nothing, helps to avoid flicker return TRUE; case WM_PAINT: OnPaintProperties(hwnd); break; case WM_CHAR: if (VK_ESCAPE == wParam) DestroyWindow(hwnd); break; case WM_DESTROY: pl = FindPropertyWindowByHwnd(hwnd); CrashIf(!pl); gPropertiesWindows.Remove(pl); delete pl; break; case WM_COMMAND: PropertiesOnCommand(hwnd, wParam); break; /* TODO: handle mouse move/down/up so that links work (?) */ default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
static void PropertiesOnCommand(HWND hwnd, WPARAM wParam) { switch (LOWORD(wParam)) { case IDM_COPY_SELECTION: CopyPropertiesToClipboard(hwnd); break; case IDM_PROPERTIES: #if defined(DEBUG) || defined(ENABLE_EXTENDED_PROPERTIES) // make a repeated Ctrl+D display some extended properties // TODO: expose this through a UI button or similar PropertiesLayout *pl = FindPropertyWindowByHwnd(hwnd); if (pl) { WindowInfo *win = FindWindowInfoByHwnd(pl->hwndParent); if (win && !pl->HasProperty(_TR("Fonts:"))) { DestroyWindow(hwnd); ShowProperties(win->hwndFrame, GetDocForWindow(SumatraWindow::Make(win)), win->dm, true); } } #endif break; } }