343 lines
8.3 KiB
C++
343 lines
8.3 KiB
C++
#include "./pageAddress.h"
|
|
#include "./dataAddress.h"
|
|
#include "./common.h"
|
|
#include "./addressEncoder.h"
|
|
#include "./addressEditbox.h"
|
|
#include "./loginGui.h"
|
|
|
|
#include "../resource.h"
|
|
|
|
#include <shlwapi.h>
|
|
#include <wininet.h>
|
|
|
|
|
|
|
|
static HRESULT CALLBACK LoginPageAddress_CreateInstance(HWND hwnd, HWND hLoginbox, LoginPage **instance)
|
|
{
|
|
if (NULL == instance) return E_POINTER;
|
|
if (NULL == hwnd || NULL == hLoginbox) return E_INVALIDARG;
|
|
|
|
*instance = new LoginPageAddress(hwnd, hLoginbox);
|
|
if (NULL == instance) return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
LoginPageAddress::LoginPageAddress(HWND hwnd, HWND hLoginbox)
|
|
: LoginPage(hwnd, hLoginbox)
|
|
{
|
|
HWND hEdit = GetDlgItem(hwnd, IDC_ADDRESS_EDIT);
|
|
if (NULL != hEdit)
|
|
AddressEditbox_AttachWindow(hEdit);
|
|
|
|
}
|
|
|
|
LoginPageAddress::~LoginPageAddress()
|
|
{
|
|
}
|
|
|
|
HWND LoginPageAddress::CreatePage(HWND hLoginbox, HWND hParent)
|
|
{
|
|
return LoginPage::CreatePage(hLoginbox, MAKEINTRESOURCE(IDD_PAGE_ADDRESS),
|
|
hParent, NULL, LoginPageAddress_CreateInstance);
|
|
}
|
|
|
|
BOOL LoginPageAddress::OnInitDialog(HWND hFocus, LPARAM param)
|
|
{
|
|
HFONT fontEdit = NULL, fontLabel = NULL;
|
|
LoginGuiObject *loginGui;
|
|
if (SUCCEEDED(LoginGuiObject::QueryInstance(&loginGui)))
|
|
{
|
|
fontLabel = loginGui->GetTextFont();
|
|
fontEdit = loginGui->GetEditorFont();
|
|
loginGui->Release();
|
|
}
|
|
|
|
if (NULL != fontLabel)
|
|
{
|
|
HWND hLabel = GetDlgItem(hwnd, IDC_ADDRESS_LABEL);
|
|
if (NULL != hLabel)
|
|
SendMessage(hLabel, WM_SETFONT, (WPARAM)fontLabel, 0L);
|
|
|
|
hLabel = GetDlgItem(hwnd, IDC_MESSAGE);
|
|
if (NULL != hLabel)
|
|
SendMessage(hLabel, WM_SETFONT, (WPARAM)fontLabel, 0L);
|
|
}
|
|
|
|
if (NULL != fontEdit)
|
|
{
|
|
HWND hEdit = GetDlgItem(hwnd, IDC_ADDRESS_EDIT);
|
|
if (NULL != hEdit)
|
|
SendMessage(hEdit, WM_SETFONT, (WPARAM)fontEdit, 0L);
|
|
}
|
|
|
|
LoginPage::OnInitDialog(hFocus, param);
|
|
return FALSE;
|
|
}
|
|
|
|
void LoginPageAddress::OnDestroy()
|
|
{
|
|
LoginPage::OnDestroy();
|
|
}
|
|
|
|
void LoginPageAddress::UpdateLayout(BOOL fRedraw)
|
|
{
|
|
LoginPage::UpdateLayout(fRedraw);
|
|
|
|
RECT pageRect;
|
|
GetPageRect(&pageRect);
|
|
|
|
UINT flags = SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW;
|
|
|
|
const INT szControls[] = { IDC_ADDRESS_LABEL, IDC_ADDRESS_EDIT, IDC_MESSAGE, };
|
|
HDWP hdwp = BeginDeferWindowPos(ARRAYSIZE(szControls));
|
|
|
|
INT baseunitX, baseunitY;
|
|
if (FALSE == LoginBox_GetWindowBaseUnits(hwnd, &baseunitX, &baseunitY))
|
|
{
|
|
baseunitY = 13;
|
|
}
|
|
|
|
HRGN invalidRegion = CreateRectRgn(0, 0, 0, 0);
|
|
HRGN tempRegion = CreateRectRgn(0, 0, 0, 0);
|
|
HWND hControl;
|
|
|
|
INT nextTop = pageRect.top;
|
|
INT x, y, cx, cy;
|
|
|
|
RECT rect;
|
|
|
|
INT maxWidth = pageRect.right - pageRect.left;
|
|
hControl = GetDlgItem(hwnd, IDC_ADDRESS_EDIT);
|
|
if (NULL != hControl)
|
|
{
|
|
HDC hdc = GetDCEx(hControl, NULL, DCX_CACHE | DCX_NORESETATTRS);
|
|
if (NULL != hdc)
|
|
{
|
|
HFONT fontControl = (HFONT)SendMessage(hControl, WM_GETFONT, 0, 0L);
|
|
HFONT fontOrig = (HFONT)SelectObject(hdc, fontControl);
|
|
|
|
maxWidth = LoginBox_GetAveStrWidth(hdc, 80);
|
|
if(maxWidth > (pageRect.right - pageRect.left))
|
|
maxWidth = pageRect.right - pageRect.left;
|
|
|
|
SelectObject(hdc, fontOrig);
|
|
ReleaseDC(hControl, hdc);
|
|
}
|
|
}
|
|
|
|
for (INT i = 0; i < ARRAYSIZE(szControls); i++)
|
|
{
|
|
hControl = GetDlgItem(hwnd, szControls[i]);
|
|
if (NULL == hControl || FALSE == GetWindowRect(hControl, &rect)) continue;
|
|
MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rect, 2);
|
|
x = rect.left;
|
|
y = rect.top;
|
|
cx = rect.right - rect.left;
|
|
cy = rect.bottom - rect.top;
|
|
switch(szControls[i])
|
|
{
|
|
case IDC_ADDRESS_LABEL:
|
|
case IDC_MESSAGE:
|
|
x = pageRect.left;
|
|
y = nextTop;
|
|
LoginBox_GetWindowTextSize(hControl, maxWidth, &cx, &cy);
|
|
nextTop += (cy + MulDiv(2, baseunitY, 8));
|
|
break;
|
|
case IDC_ADDRESS_EDIT:
|
|
x = pageRect.left;
|
|
y = nextTop;
|
|
cy = LoginBox_GetWindowTextHeight(hControl, 0);
|
|
{
|
|
RECT r1, r2;
|
|
GetWindowRect(hControl, &r1);
|
|
SendMessage(hControl, EM_GETRECT, 0, (LPARAM)&r2);
|
|
INT t = (r1.bottom - r1.top) - (r2.bottom - r2.top);
|
|
cy += t;
|
|
}
|
|
cx = maxWidth;
|
|
nextTop += (cy + MulDiv(7, baseunitY, 8));
|
|
break;
|
|
}
|
|
|
|
if (rect.left != x || rect.top != y ||
|
|
(rect.right - rect.left) != cx || (rect.bottom - rect.top) != cy)
|
|
{
|
|
hdwp = DeferWindowPos(hdwp, hControl, NULL, x, y, cx, cy, flags);
|
|
if (NULL == hdwp) break;
|
|
|
|
if (FALSE != fRedraw)
|
|
{
|
|
SetRectRgn(tempRegion, rect.left, rect.top, rect.right, rect.bottom);
|
|
CombineRgn(invalidRegion, invalidRegion, tempRegion, RGN_OR);
|
|
|
|
SetRectRgn(tempRegion, x, y , x + cx, y + cy);
|
|
CombineRgn(invalidRegion, invalidRegion, tempRegion, RGN_OR);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (NULL != hdwp)
|
|
EndDeferWindowPos(hdwp);
|
|
|
|
if (FALSE != fRedraw)
|
|
{
|
|
RedrawWindow(hwnd, NULL, invalidRegion,
|
|
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ERASENOW | RDW_ALLCHILDREN | RDW_VALIDATE);
|
|
}
|
|
|
|
if (NULL != invalidRegion)
|
|
DeleteObject(invalidRegion);
|
|
if (NULL != tempRegion)
|
|
DeleteObject(tempRegion);
|
|
}
|
|
|
|
BOOL LoginPageAddress::OnGetLoginData(LoginData **ppLoginData)
|
|
{
|
|
if (NULL == ppLoginData)
|
|
return FALSE;
|
|
|
|
HWND hEdit;
|
|
LPWSTR address;
|
|
|
|
hEdit = GetDlgItem(hwnd, IDC_ADDRESS_EDIT);
|
|
if (NULL == hEdit || FAILED(LoginBox_GetWindowText(hEdit, &address, NULL)))
|
|
address = NULL;
|
|
else
|
|
{
|
|
size_t encodedMax = lstrlen(address)*2;
|
|
LPWSTR addressEncoded = LoginBox_MallocString(encodedMax);
|
|
|
|
for(;;)
|
|
{
|
|
if (FALSE == InternetCanonicalizeUrl(address, addressEncoded, (DWORD*)&encodedMax, ICU_ENCODE_PERCENT | ICU_NO_META))
|
|
{
|
|
if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
|
|
{
|
|
LoginBox_FreeString(addressEncoded);
|
|
addressEncoded = LoginBox_MallocString(encodedMax);
|
|
if (NULL != addressEncoded)
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LoginBox_FreeString(address);
|
|
address = LoginBox_CopyString(addressEncoded);
|
|
}
|
|
break;
|
|
}
|
|
|
|
HRESULT hr;
|
|
for(;;)
|
|
{
|
|
hr = AddressEncoder_EncodeString(address, addressEncoded, &encodedMax, ICU_BROWSER_MODE);
|
|
if (ENC_E_INSUFFICIENT_BUFFER == hr)
|
|
{
|
|
LoginBox_FreeString(addressEncoded);
|
|
addressEncoded = LoginBox_MallocString(encodedMax);
|
|
if (NULL == addressEncoded)
|
|
hr = E_OUTOFMEMORY;
|
|
else
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
LoginBox_FreeString(address);
|
|
address = addressEncoded;
|
|
addressEncoded = NULL;
|
|
}
|
|
else
|
|
LoginBox_FreeString(addressEncoded);
|
|
}
|
|
|
|
HRESULT hr = LoginDataAddress::CreateInstance(NULL, hwnd, hLoginbox,
|
|
address, (LoginDataAddress**)ppLoginData);
|
|
|
|
LoginBox_FreeString(address);
|
|
return SUCCEEDED(hr);
|
|
}
|
|
|
|
BOOL LoginPageAddress::OnSetUsername(LPCWSTR pszUsername)
|
|
{
|
|
HWND hEdit = GetDlgItem(hwnd, IDC_ADDRESS_EDIT);
|
|
if (NULL == hEdit) return FALSE;
|
|
|
|
if (NULL == pszUsername || L'\0' == *pszUsername)
|
|
return FALSE;
|
|
|
|
INT cchLen = lstrlen(pszUsername);
|
|
|
|
INT f, l;
|
|
SNDMSG(hEdit, EM_GETSEL, (WPARAM)&f, (LPARAM)&l);
|
|
if (f == l) return FALSE;
|
|
|
|
SNDMSG(hEdit, EM_REPLACESEL, FALSE, (LPARAM)pszUsername);
|
|
SNDMSG(hEdit, EM_SETSEL, (WPARAM)f, (LPARAM)f + cchLen);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
HBRUSH LoginPageAddress::OnGetStaticColor(HDC hdc, HWND hControl)
|
|
{
|
|
INT_PTR controlId = (INT_PTR)GetWindowLongPtr(hControl, GWLP_ID);
|
|
switch(controlId)
|
|
{
|
|
case IDC_MESSAGE:
|
|
SetTextColor(hdc, rgbSecondaryText);
|
|
SetBkColor(hdc, rgbBack);
|
|
return hbrBack;
|
|
}
|
|
|
|
return LoginPage::OnGetStaticColor(hdc, hControl);
|
|
}
|
|
|
|
BOOL LoginPageAddress::OnSetAddress(LPCWSTR pszAddress, BOOL replaceUsername)
|
|
{
|
|
HWND hEdit = GetDlgItem(hwnd, IDC_ADDRESS_EDIT);
|
|
if (NULL == hEdit) return FALSE;
|
|
|
|
BOOL succeeded;
|
|
LPWSTR addressDecoded;
|
|
|
|
if (SUCCEEDED(AddressEncoder_DecodeString(pszAddress, &addressDecoded)))
|
|
{
|
|
succeeded = (BOOL)SNDMSG(hEdit, WM_SETTEXT, 0, (LPARAM)addressDecoded);
|
|
LoginBox_FreeString(addressDecoded);
|
|
}
|
|
else
|
|
succeeded = (BOOL)SNDMSG(hEdit, WM_SETTEXT, 0, (LPARAM)pszAddress);
|
|
|
|
|
|
return succeeded;
|
|
}
|
|
|
|
BOOL LoginPageAddress::OnSetAddressTitle(LPCWSTR pszTitle)
|
|
{
|
|
return SetLabelText(IDC_ADDRESS_LABEL, pszTitle);
|
|
}
|
|
|
|
BOOL LoginPageAddress::OnSetMessage(LPCWSTR pszMessage)
|
|
{
|
|
HWND hLabel = GetDlgItem(hwnd, IDC_MESSAGE);
|
|
if (NULL == hLabel) return FALSE;
|
|
|
|
return SetWindowText(hLabel, pszMessage);
|
|
}
|
|
|
|
INT_PTR LoginPageAddress::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(uMsg)
|
|
{
|
|
case NLPAM_SETADDRESS: MSGRESULT(hwnd, OnSetAddress((LPCWSTR)lParam, (BOOL)wParam));
|
|
case NLPAM_SETADDRESSTITLE: MSGRESULT(hwnd, OnSetAddressTitle((LPCWSTR)lParam));
|
|
case NLPAM_SETMESSAGE: MSGRESULT(hwnd, OnSetMessage((LPCWSTR)lParam));
|
|
|
|
}
|
|
return __super::DialogProc(uMsg, wParam, lParam);
|
|
}
|
|
|