Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
761
Src/omBrowser/toolbarAddress.cpp
Normal file
761
Src/omBrowser/toolbarAddress.cpp
Normal file
|
@ -0,0 +1,761 @@
|
|||
#include "main.h"
|
||||
#include "./toolbarAddress.h"
|
||||
#include "./toolbar.h"
|
||||
#include "./toolbarEditbox.h"
|
||||
#include "./resource.h"
|
||||
#include "./graphics.h"
|
||||
#include "./menu.h"
|
||||
#include "./ifc_imageloader.h"
|
||||
#include "./addressEncoder.h"
|
||||
|
||||
|
||||
#include <wininet.h>
|
||||
//#include <shlwapi.h>
|
||||
#include <strsafe.h>
|
||||
|
||||
#define ADDRESSBAR_MINWIDTH 96
|
||||
|
||||
UINT minWidth;
|
||||
HBITMAP bitmap;
|
||||
INT iconHeight;
|
||||
INT iconWidth;
|
||||
INT textHeight;
|
||||
INT textMargin;
|
||||
COLORREF rgbText;
|
||||
COLORREF rgbBk;
|
||||
HWND hEditor;
|
||||
|
||||
ToolbarAddress::ToolbarAddress(LPCSTR pszName, UINT nStyle) :
|
||||
ToolbarItem(pszName, nStyle, ICON_NONE, NULL, NULL),
|
||||
minWidth(ADDRESSBAR_MINWIDTH), bitmap(NULL), iconHeight(0), iconWidth(0),
|
||||
textHeight(12), textMargin(0), rgbText(0x000000), rgbBk(0xFFFFFF), hEditor(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
ToolbarAddress::~ToolbarAddress()
|
||||
{
|
||||
if (NULL != bitmap)
|
||||
DeleteObject(bitmap);
|
||||
if (NULL != hEditor)
|
||||
DestroyWindow(hEditor);
|
||||
}
|
||||
|
||||
ToolbarItem* CALLBACK ToolbarAddress::CreateInstance(ToolbarItem::Template *item)
|
||||
{
|
||||
if (NULL == item)
|
||||
return NULL;
|
||||
|
||||
return new ToolbarAddress( (NULL != item->name) ? item->name : TOOLCLS_ADDRESSBAR,
|
||||
item->style);
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::ActivateEditor(HWND hToolbar, const POINT *ppt)
|
||||
{
|
||||
if (NULL == hEditor)
|
||||
{
|
||||
UINT editorStyle = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP |
|
||||
ES_LEFT | ES_NOHIDESEL | ES_AUTOHSCROLL;
|
||||
|
||||
if (0 != (styleAddressReadonly & style))
|
||||
editorStyle |= ES_READONLY;
|
||||
|
||||
hEditor = CreateWindowEx(WS_EX_NOPARENTNOTIFY, L"Edit", text, editorStyle, 0, 0, 0, 0, hToolbar, NULL, NULL, 0);
|
||||
|
||||
if (NULL == hEditor)
|
||||
return FALSE;
|
||||
|
||||
ToolbarEditbox_AttachWindow(hEditor, this);
|
||||
|
||||
HFONT hFont = (HFONT)SendMessage(hToolbar, WM_GETFONT, 0, 0L);
|
||||
SendMessage(hEditor, WM_SETFONT, (WPARAM)hFont, 0L);
|
||||
SendMessage(hEditor, EM_SETMARGINS, (WPARAM)(EC_LEFTMARGIN | EC_RIGHTMARGIN), MAKELPARAM(textMargin, textMargin));
|
||||
}
|
||||
|
||||
UINT editorStyle = GetWindowStyle(hEditor);
|
||||
if (0 == (WS_VISIBLE & editorStyle))
|
||||
{
|
||||
RECT textRect;
|
||||
CopyRect(&textRect, &rect);
|
||||
InflateRect(&textRect, -((iconWidth -1)/2), -((iconHeight -1)/2));
|
||||
textRect.top = textRect.bottom - textHeight;
|
||||
|
||||
SetWindowPos(hEditor, NULL, textRect.left, textRect.top,
|
||||
textRect.right - textRect.left, textRect.bottom - textRect.top,
|
||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
|
||||
|
||||
UINT editorStyle = GetWindowStyle(hEditor);
|
||||
if (0 == (WS_VISIBLE & editorStyle))
|
||||
SetWindowLongPtr(hEditor, GWL_STYLE, editorStyle | WS_VISIBLE);
|
||||
|
||||
}
|
||||
|
||||
if (IsWindowVisible(hEditor))
|
||||
{
|
||||
if (hEditor != GetFocus())
|
||||
::SetFocus(hEditor);
|
||||
|
||||
if (NULL != ppt)
|
||||
{
|
||||
POINT editorPt = *ppt;
|
||||
MapWindowPoints(hToolbar, hEditor, &editorPt, 1);
|
||||
PostMessage(hEditor, WM_LBUTTONDOWN, (WPARAM)(MK_LBUTTON), MAKELPARAM(editorPt.x, editorPt.y));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendMessage(hEditor, NTEBM_SELECTALL, 0, 0);
|
||||
}
|
||||
|
||||
InvalidateRect(hEditor, NULL, FALSE);
|
||||
}
|
||||
|
||||
InvalidateRect(hToolbar, &rect, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
UINT ToolbarAddress::GetStyle()
|
||||
{
|
||||
UINT filteredStyle = style;
|
||||
if (0 != (styleAddressReadonly & filteredStyle))
|
||||
filteredStyle &= ~styleTabstop;
|
||||
|
||||
return filteredStyle;
|
||||
}
|
||||
|
||||
void ToolbarAddress::SetStyle(HWND hToolbar, UINT newStyle, UINT styleMask)
|
||||
{
|
||||
ToolbarItem::SetStyle(hToolbar, newStyle, styleMask);
|
||||
|
||||
if (NULL != hEditor)
|
||||
{
|
||||
if (0 != (stateHidden & styleMask) && 0 != (stateHidden & style))
|
||||
{
|
||||
if (GetFocus() == hEditor)
|
||||
EditboxNavigateNextCtrl(hEditor, TRUE);
|
||||
else
|
||||
DestroyWindow(hEditor);
|
||||
}
|
||||
|
||||
if (0 != (styleAddressReadonly & styleMask))
|
||||
{
|
||||
UINT editorStyle = GetWindowStyle(hEditor);
|
||||
if (0 == (styleAddressReadonly & style) != 0 == (ES_READONLY & editorStyle))
|
||||
SendMessage(hEditor, EM_SETREADONLY, (WPARAM)(0 != (styleAddressReadonly & style)), 0L);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::SetRect(const RECT *prc)
|
||||
{
|
||||
BOOL result = ToolbarItem::SetRect(prc);
|
||||
if (FALSE == result) return result;
|
||||
|
||||
if (NULL != hEditor)
|
||||
{
|
||||
UINT editorStyle = GetWindowStyle(hEditor);
|
||||
if (0 != (WS_VISIBLE & editorStyle))
|
||||
{
|
||||
RECT textRect;
|
||||
CopyRect(&textRect, &rect);
|
||||
InflateRect(&textRect, -((iconWidth -1)/2), -((iconHeight -1)/2));
|
||||
textRect.top = textRect.bottom - textHeight;
|
||||
|
||||
SetWindowPos(hEditor, NULL, textRect.left, textRect.top,
|
||||
textRect.right - textRect.left, textRect.bottom - textRect.top,
|
||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::SetRectEmpty()
|
||||
{
|
||||
BOOL result = ToolbarItem::SetRectEmpty();
|
||||
if (FALSE == result) return result;
|
||||
|
||||
|
||||
if (NULL != hEditor)
|
||||
{
|
||||
if (GetFocus() == hEditor)
|
||||
EditboxNavigateNextCtrl(hEditor, TRUE);
|
||||
else
|
||||
DestroyWindow(hEditor);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::SetDescription(HWND hToolbar, LPCWSTR pszDescription)
|
||||
{
|
||||
if (NULL != pszDescription && FALSE == IS_INTRESOURCE(pszDescription))
|
||||
{
|
||||
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, 0, L"about:blank", -1, pszDescription, -1))
|
||||
pszDescription = NULL;
|
||||
}
|
||||
|
||||
BOOL result = ToolbarItem::SetDescription(hToolbar, pszDescription);
|
||||
if (NULL != hToolbar)
|
||||
InvalidateRect(hToolbar, &rect, TRUE);
|
||||
return result;
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::AdjustRect(HWND hToolbar, RECT *proposedRect)
|
||||
{
|
||||
if (0 == (styleFlexible & style) ||
|
||||
proposedRect->right < proposedRect->left ||
|
||||
((UINT)(proposedRect->right - proposedRect->left)) < minWidth)
|
||||
{
|
||||
proposedRect->right = proposedRect->left + minWidth;
|
||||
}
|
||||
//INT iconCY = Toolbar_GetImageListHeight(hToolbar);
|
||||
INT height = textHeight + iconHeight;
|
||||
INT t = ((proposedRect->bottom - proposedRect->top) - height);
|
||||
proposedRect->top += (t/2 + t%2);
|
||||
proposedRect->bottom = proposedRect->top + height;
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::Paint(HWND hToolbar, HDC hdc, const RECT *paintRect, UINT state)
|
||||
{
|
||||
|
||||
if (NULL == bitmap)
|
||||
return FALSE;
|
||||
|
||||
RECT blitRect;
|
||||
if (!IntersectRect(&blitRect, paintRect))
|
||||
return TRUE;
|
||||
|
||||
BOOL success = FALSE;
|
||||
HDC hdcSrc = CreateCompatibleDC(hdc);
|
||||
|
||||
UINT editorStyle = (NULL != hEditor) ? GetWindowStyle(hEditor) : 0;
|
||||
INT offsetY;
|
||||
if (0 != (stateDisabled & state) || 0 != (styleAddressReadonly & style))
|
||||
offsetY = 2* iconHeight;
|
||||
else if (WS_VISIBLE == ((WS_VISIBLE | ES_READONLY | WS_DISABLED) & editorStyle))
|
||||
offsetY = 1 * iconHeight;
|
||||
else
|
||||
offsetY = 0;
|
||||
|
||||
INT partCY = (iconHeight - 1)/2;
|
||||
INT partCX = (iconWidth - 1)/2;
|
||||
|
||||
RECT textRect;
|
||||
CopyRect(&textRect, &rect);
|
||||
InflateRect(&textRect, -partCX, -partCY);
|
||||
|
||||
INT clipRgnCode = -1;
|
||||
HRGN clipRgn = CreateRectRgn(0, 0, 0, 0);
|
||||
if (NULL != clipRgn)
|
||||
{
|
||||
clipRgnCode = GetClipRgn(hdc, clipRgn);
|
||||
ExcludeClipRect(hdc, textRect.left, textRect.top, textRect.right, textRect.bottom);
|
||||
}
|
||||
|
||||
if (NULL != hdcSrc)
|
||||
{
|
||||
success = TRUE;
|
||||
HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcSrc, bitmap);
|
||||
|
||||
// left-top
|
||||
BitBlt(hdc, rect.left, rect.top, partCX, partCY, hdcSrc, 0, offsetY + 0, SRCCOPY);
|
||||
// right-top
|
||||
BitBlt(hdc, rect.right - partCX, rect.top, partCX, partCY, hdcSrc, iconWidth - partCX, offsetY + 0, SRCCOPY);
|
||||
// right-bottom
|
||||
BitBlt(hdc, rect.right - partCX, rect.bottom - partCY, partCX, partCY, hdcSrc, iconWidth - partCX, offsetY + (iconHeight - partCY), SRCCOPY);
|
||||
// left-bottom
|
||||
BitBlt(hdc, rect.left, rect.bottom - partCY, partCX, partCY, hdcSrc, 0, offsetY + (iconHeight - partCY), SRCCOPY);
|
||||
|
||||
INT stretchMode = SetStretchBltMode(hdc, COLORONCOLOR);
|
||||
|
||||
StretchBlt(hdc, rect.left, rect.top + partCY, partCX, (rect.bottom - rect.top) - 2*partCY, hdcSrc, 0, offsetY + partCY, partCX, 1, SRCCOPY);
|
||||
StretchBlt(hdc, rect.right - partCX, rect.top + partCY, partCX, (rect.bottom - rect.top) - 2*partCY, hdcSrc, iconWidth - partCX, offsetY + partCY, partCX, 1, SRCCOPY);
|
||||
StretchBlt(hdc, rect.left + partCX, rect.top, (rect.right - rect.left) - 2 * partCX, partCY, hdcSrc, partCX, offsetY + 0, 1, partCY, SRCCOPY);
|
||||
StretchBlt(hdc, rect.left + partCX, rect.bottom - partCY, (rect.right - rect.left) - 2 * partCX, partCY, hdcSrc, partCX, offsetY + (iconHeight - partCY), 1, partCY, SRCCOPY);
|
||||
|
||||
|
||||
if (COLORONCOLOR != stretchMode)
|
||||
SetStretchBltMode(hdc, stretchMode);
|
||||
|
||||
|
||||
SelectObject(hdcSrc, hbmpOld);
|
||||
DeleteDC(hdcSrc);
|
||||
}
|
||||
|
||||
if (clipRgnCode >= 0)
|
||||
SelectClipRgn(hdc, ( 0 != clipRgnCode) ? (clipRgn ? clipRgn : NULL) : NULL);
|
||||
|
||||
if (NULL != clipRgn)
|
||||
DeleteObject(clipRgn);
|
||||
|
||||
COLORREF rgbTextOrig, rgbBkOrig;
|
||||
|
||||
if (0 == (stateDisabled & state) && 0 == (styleAddressReadonly & style))
|
||||
{
|
||||
rgbTextOrig = SetTextColor(hdc, rgbText);
|
||||
rgbBkOrig = SetBkColor(hdc, rgbBk);
|
||||
}
|
||||
else
|
||||
{
|
||||
rgbTextOrig = GetTextColor(hdc);
|
||||
rgbBkOrig = GetBkColor(hdc);
|
||||
}
|
||||
|
||||
LPCWSTR pszText;
|
||||
pszText = ( 0 == (styleAddressShowReal & style) && NULL != description) ? description : text;
|
||||
|
||||
|
||||
UINT cchText = (NULL != pszText && FALSE == IS_INTRESOURCE(pszText)) ? lstrlen(pszText) : 0;
|
||||
INT textAlign = SetTextAlign(hdc, TA_LEFT | TA_BOTTOM);
|
||||
ExtTextOut(hdc, textRect.left + textMargin, textRect.bottom, ETO_OPAQUE | ETO_CLIPPED, &textRect, pszText, cchText, NULL);
|
||||
|
||||
if (textAlign != (TA_LEFT | TA_BOTTOM)) SetTextAlign(hdc, textAlign);
|
||||
if (rgbText != rgbTextOrig) SetTextColor(hdc, rgbTextOrig);
|
||||
if (rgbBk != rgbBkOrig) SetBkColor(hdc, rgbBkOrig);
|
||||
|
||||
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
INT ToolbarAddress::GetTip(LPTSTR pszBuffer, INT cchBufferMax)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
HRESULT ToolbarAddress::GetText(LPWSTR pszBuffer, UINT cchBufferMax)
|
||||
{
|
||||
if (NULL == pszBuffer) return E_POINTER;
|
||||
if (0 == cchBufferMax) return E_OUTOFMEMORY;
|
||||
if (NULL == text)
|
||||
{
|
||||
*pszBuffer = L'\0';
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if (IS_INTRESOURCE(text))
|
||||
return Plugin_CopyResString(pszBuffer, cchBufferMax, text);
|
||||
|
||||
return AddressEncoder_EncodeString(text, pszBuffer,(size_t*)&cchBufferMax, ICU_BROWSER_MODE);
|
||||
}
|
||||
|
||||
HRESULT ToolbarAddress::GetTextLength(size_t *pcchLength)
|
||||
{
|
||||
if (NULL == pcchLength)
|
||||
return E_POINTER;
|
||||
|
||||
if (NULL == text)
|
||||
{
|
||||
*pcchLength = 0;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if (IS_INTRESOURCE(text))
|
||||
{
|
||||
WCHAR szBuffer[8192] = {0};
|
||||
HRESULT hr = Plugin_CopyResString(szBuffer, ARRAYSIZE(szBuffer), text);
|
||||
*pcchLength = (FAILED(hr)) ? 0 : lstrlen(szBuffer);
|
||||
return hr;
|
||||
}
|
||||
|
||||
WCHAR szBuffer[1] = {0};
|
||||
size_t cchBufferMax = ARRAYSIZE(szBuffer);
|
||||
HRESULT hr = AddressEncoder_EncodeString(text, szBuffer, &cchBufferMax, ICU_BROWSER_MODE);
|
||||
if (SUCCEEDED(hr) || ENC_E_INSUFFICIENT_BUFFER == hr)
|
||||
{
|
||||
if (0 != cchBufferMax) cchBufferMax--;
|
||||
*pcchLength = cchBufferMax;
|
||||
hr = S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = E_FAIL;
|
||||
*pcchLength = 0;
|
||||
|
||||
}
|
||||
|
||||
return hr;
|
||||
|
||||
}
|
||||
void ToolbarAddress::MouseMove(HWND hToolbar, UINT mouseFlags, POINT pt)
|
||||
{
|
||||
// UINT styleNew = (PtInItem(pt)) ? stateHighlighted : 0;
|
||||
// SetStyle(hToolbar, styleNew, stateHighlighted);
|
||||
|
||||
}
|
||||
|
||||
void ToolbarAddress::MouseLeave(HWND hToolbar)
|
||||
{
|
||||
if (0 != (stateHighlighted & style))
|
||||
{
|
||||
SetStyle(hToolbar, 0, stateHighlighted);
|
||||
}
|
||||
}
|
||||
|
||||
void ToolbarAddress::LButtonDown(HWND hToolbar, UINT mouseFlags, POINT pt)
|
||||
{
|
||||
ActivateEditor(hToolbar, &pt);
|
||||
}
|
||||
|
||||
void ToolbarAddress::UpdateSkin(HWND hToolbar)
|
||||
{
|
||||
if (NULL != bitmap)
|
||||
{
|
||||
DeleteObject(bitmap);
|
||||
bitmap = NULL;
|
||||
}
|
||||
|
||||
iconHeight = 0;
|
||||
iconWidth = 0;
|
||||
|
||||
COLORREF rgbToolBk = Toolbar_GetBkColor(hToolbar);
|
||||
rgbText = Toolbar_GetEditColor(hToolbar);
|
||||
rgbBk = Toolbar_GetEditBkColor(hToolbar);
|
||||
|
||||
ifc_omimageloader *loader;
|
||||
if (SUCCEEDED(Plugin_QueryImageLoader(Plugin_GetInstance(), MAKEINTRESOURCE(IDR_TOOLBARADDRESS_IMAGE), TRUE, &loader)))
|
||||
{
|
||||
BITMAPINFOHEADER headerInfo;
|
||||
BYTE *pixelData;
|
||||
if (SUCCEEDED(loader->LoadBitmapEx(&bitmap, &headerInfo, (void**)&pixelData)))
|
||||
{
|
||||
if (headerInfo.biHeight < 0) headerInfo.biHeight = -headerInfo.biHeight;
|
||||
iconHeight = headerInfo.biHeight/3;
|
||||
iconWidth = headerInfo.biWidth;
|
||||
|
||||
Image_Colorize(pixelData, headerInfo.biWidth, headerInfo.biHeight, headerInfo.biBitCount,
|
||||
rgbToolBk, Toolbar_GetFgColor(hToolbar), FALSE);
|
||||
|
||||
// disabled
|
||||
Image_BlendOnColorEx(pixelData, headerInfo.biWidth, headerInfo.biHeight,
|
||||
0, 0, headerInfo.biWidth, iconHeight, headerInfo.biBitCount, FALSE, rgbToolBk);
|
||||
// highlighted
|
||||
Image_BlendOnColorEx(pixelData, headerInfo.biWidth, headerInfo.biHeight,
|
||||
0, 1*iconHeight, headerInfo.biWidth, iconHeight, headerInfo.biBitCount, FALSE, rgbBk);
|
||||
// normal
|
||||
Image_BlendOnColorEx(pixelData, headerInfo.biWidth, headerInfo.biHeight,
|
||||
0, 2*iconHeight, headerInfo.biWidth, iconHeight, headerInfo.biBitCount, FALSE, rgbBk);
|
||||
|
||||
}
|
||||
loader->Release();
|
||||
}
|
||||
|
||||
textHeight = 12;
|
||||
HFONT toolbarFont = (HFONT)SendMessage(hToolbar, WM_GETFONT, 0, 0L);
|
||||
|
||||
if (NULL != toolbarFont)
|
||||
{
|
||||
HDC hdc = GetDCEx(hToolbar, NULL, DCX_CACHE | DCX_NORESETATTRS);
|
||||
if (NULL != hdc)
|
||||
{
|
||||
HFONT originalFont = (HFONT)SelectObject(hdc, toolbarFont);
|
||||
|
||||
TEXTMETRIC tm;
|
||||
if (GetTextMetrics(hdc, &tm))
|
||||
{
|
||||
textHeight = tm.tmHeight;
|
||||
textMargin = tm.tmAveCharWidth/2 + tm.tmAveCharWidth%2;
|
||||
}
|
||||
|
||||
SelectObject(hdc, originalFont);
|
||||
ReleaseDC(hToolbar, hdc);
|
||||
}
|
||||
|
||||
if (NULL != hEditor)
|
||||
{
|
||||
UINT editorStyle = GetWindowStyle(hEditor);
|
||||
if (0 != (WS_VISIBLE & editorStyle))
|
||||
{
|
||||
SendMessage(hEditor, WM_SETFONT, (WPARAM)toolbarFont, 0L);
|
||||
SendMessage(hEditor, EM_SETMARGINS, (WPARAM)(EC_LEFTMARGIN | EC_RIGHTMARGIN), MAKELPARAM(textMargin, textMargin));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::FillMenuInfo(HWND hToolbar, MENUITEMINFO *pmii, LPWSTR pszBuffer, INT cchBufferMax)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
void ToolbarAddress::CommandSent(HWND hToolbar, INT commandId)
|
||||
{
|
||||
if (NULL != hEditor && ID_ADDRESSBAR_CHANGED != commandId)
|
||||
{
|
||||
if (GetFocus() == hEditor)
|
||||
EditboxNavigateNextCtrl(hEditor, TRUE);
|
||||
else
|
||||
DestroyWindow(hEditor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL ToolbarAddress::SetValueStr(HWND hToolbar, LPCWSTR value)
|
||||
{
|
||||
Plugin_FreeResString(text);
|
||||
|
||||
if (NULL != value)
|
||||
{
|
||||
if (FALSE != IS_INTRESOURCE(value) || FAILED(AddressEncoder_DecodeString(value, &text)))
|
||||
text = Plugin_DuplicateResString(value);
|
||||
}
|
||||
else
|
||||
text = NULL;
|
||||
|
||||
RECT textRect;
|
||||
CopyRect(&textRect, &rect);
|
||||
InflateRect(&textRect, -((iconWidth -1)/2), -(iconHeight - 1)/2);
|
||||
|
||||
InvalidateRect(hToolbar, &textRect, TRUE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::SetClipboardText(HWND hToolbar, LPCWSTR pszText)
|
||||
{
|
||||
if(FALSE == OpenClipboard(hToolbar))
|
||||
return FALSE;
|
||||
|
||||
EmptyClipboard();
|
||||
|
||||
INT cchLen;
|
||||
HGLOBAL hMemory;
|
||||
|
||||
cchLen = (NULL != pszText) ? lstrlenW(pszText) : 0;
|
||||
hMemory = (0 != cchLen) ? GlobalAlloc(GMEM_MOVEABLE, (cchLen + 1) * sizeof(WCHAR)) : NULL;
|
||||
if (NULL != hMemory)
|
||||
{
|
||||
LPWSTR pszDest = (LPWSTR)GlobalLock(hMemory);
|
||||
CopyMemory(pszDest, pszText, (cchLen + 1) * sizeof(WCHAR));
|
||||
GlobalUnlock(hMemory);
|
||||
}
|
||||
SetClipboardData(CF_UNICODETEXT, hMemory);
|
||||
|
||||
|
||||
LPSTR pszTextAnsi = (NULL != pszText) ? Plugin_WideCharToMultiByte(CP_ACP, 0, pszText, -1, NULL, NULL) : NULL;
|
||||
cchLen = (NULL != pszTextAnsi) ? lstrlenA(pszTextAnsi) : 0;
|
||||
hMemory = (0 != cchLen) ? GlobalAlloc(GMEM_MOVEABLE, (cchLen + 1) * sizeof(CHAR)) : NULL;
|
||||
if (NULL != hMemory)
|
||||
{
|
||||
LPWSTR pszDest = (LPWSTR)GlobalLock(hMemory);
|
||||
CopyMemory(pszDest, pszTextAnsi, (cchLen + 1) * sizeof(CHAR));
|
||||
GlobalUnlock(hMemory);
|
||||
}
|
||||
SetClipboardData(CF_TEXT, hMemory);
|
||||
|
||||
CloseClipboard();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::DisplayContextMenu(HWND hToolbar, INT x, INT y)
|
||||
{
|
||||
HMENU hMenu = Menu_GetMenu(MENU_ADDRESSBAR, 0);
|
||||
if (NULL != hMenu)
|
||||
{
|
||||
UINT fEnable = MF_BYCOMMAND;
|
||||
if (0 != (styleAddressReadonly & style))
|
||||
fEnable |= (MF_DISABLED | MF_GRAYED);
|
||||
else
|
||||
fEnable |= MF_ENABLED;
|
||||
|
||||
EnableMenuItem(hMenu, ID_ADDRESSBAR_EDITADDRESS, fEnable);
|
||||
|
||||
INT commandId = Menu_TrackPopup(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, x, y, hToolbar, NULL);
|
||||
switch(commandId)
|
||||
{
|
||||
case ID_ADDRESSBAR_COPY:
|
||||
if (0 == (styleAddressShowReal & style) && NULL != description)
|
||||
{
|
||||
UINT cchTextMax = (IS_INTRESOURCE(description)) ? 2048 : (lstrlen(description) + 1);
|
||||
LPWSTR pszText = Plugin_MallocString(cchTextMax);
|
||||
if (NULL != pszText && FAILED(GetDescription(pszText, cchTextMax)))
|
||||
{
|
||||
Plugin_FreeString(pszText);
|
||||
pszText = NULL;
|
||||
}
|
||||
SetClipboardText(hToolbar, pszText);
|
||||
Plugin_FreeString(pszText);
|
||||
break;
|
||||
}
|
||||
// let it go
|
||||
case ID_ADDRESSBAR_COPYADDRESS:
|
||||
{
|
||||
size_t cchTextMax;
|
||||
if (SUCCEEDED(GetTextLength(&cchTextMax)))
|
||||
{
|
||||
cchTextMax++;
|
||||
LPWSTR pszText = Plugin_MallocString(cchTextMax);
|
||||
if (NULL != pszText && FAILED(GetText(pszText, (UINT)cchTextMax)))
|
||||
{
|
||||
Plugin_FreeString(pszText);
|
||||
pszText = NULL;
|
||||
}
|
||||
|
||||
SetClipboardText(hToolbar, pszText);
|
||||
Plugin_FreeString(pszText);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_ADDRESSBAR_EDITADDRESS:
|
||||
ActivateEditor(hToolbar, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
Menu_ReleaseMenu(hMenu, MENU_ADDRESSBAR);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ToolbarAddress::SetFocus(HWND hToolbar, ToolbarItem *focusItem, BOOL fSet)
|
||||
{
|
||||
ActivateEditor(hToolbar, NULL);
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::SetCursor(HWND hToolbar, HWND hCursor, UINT hitTest, UINT messageId)
|
||||
{
|
||||
RECT textRect;
|
||||
CopyRect(&textRect, &rect);
|
||||
InflateRect(&textRect, -((iconWidth -1)/2), -(iconHeight - 1)/2);
|
||||
UINT messagePos = GetMessagePos();
|
||||
POINTS messagePts = MAKEPOINTS(messagePos);
|
||||
POINT messagePt;
|
||||
POINTSTOPOINT(messagePt, messagePts);
|
||||
MapWindowPoints(HWND_DESKTOP, hToolbar, &messagePt, 1);
|
||||
if (::PtInRect(&textRect, messagePt))
|
||||
{
|
||||
HCURSOR cursor = LoadCursor(NULL, IDC_IBEAM);
|
||||
if (NULL != cursor)
|
||||
{
|
||||
::SetCursor(cursor);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void ToolbarAddress::EditboxDestroyed(HWND hwnd)
|
||||
{
|
||||
if (hEditor == hwnd)
|
||||
{
|
||||
hEditor = NULL;
|
||||
|
||||
HWND hToolbar = GetParent(hwnd);
|
||||
if (NULL != hToolbar)
|
||||
{
|
||||
InvalidateRect(hToolbar, &rect, FALSE);
|
||||
Toolbar_CheckHide(hToolbar, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ToolbarAddress::EditboxKillFocus(HWND hwnd, HWND hFocus)
|
||||
{
|
||||
DestroyWindow(hwnd);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ToolbarAddress::EditboxResetText(HWND hwnd)
|
||||
{
|
||||
UINT editboxStyle = GetWindowStyle(hwnd);
|
||||
if (0 != (WS_VISIBLE & editboxStyle))
|
||||
SetWindowLongPtr(hwnd, GWL_STYLE, editboxStyle & ~WS_VISIBLE);
|
||||
|
||||
SetWindowText(hwnd, text);
|
||||
SendMessage(hEditor, NTEBM_SELECTALL, 0, 0L);
|
||||
|
||||
if (0 != (WS_VISIBLE & editboxStyle))
|
||||
{
|
||||
UINT editboxStyle = GetWindowStyle(hwnd);
|
||||
if (0 == (WS_VISIBLE & editboxStyle))
|
||||
SetWindowLongPtr(hwnd, GWL_STYLE, editboxStyle | WS_VISIBLE);
|
||||
|
||||
InvalidateRect(hwnd, NULL, FALSE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ToolbarAddress::EditboxNavigateNextCtrl(HWND hwnd, BOOL fForward)
|
||||
{
|
||||
HWND hToolbar = GetParent(hwnd);
|
||||
if (NULL != hToolbar)
|
||||
{
|
||||
INT itemIndex = Toolbar_GetNextTabItem(hToolbar, name, (FALSE == fForward));
|
||||
if (ITEM_ERR != itemIndex)
|
||||
{
|
||||
if (FALSE != Toolbar_NextItem(hToolbar, MAKEINTRESOURCE(itemIndex), TRUE))
|
||||
{
|
||||
::SetFocus(hToolbar);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
HWND hParent = GetAncestor(hToolbar, GA_PARENT);
|
||||
while(NULL != hParent &&
|
||||
0 != (WS_CHILD & GetWindowStyle(hParent)) &&
|
||||
0 != (WS_EX_CONTROLPARENT & GetWindowStyleEx(hParent)))
|
||||
{
|
||||
HWND hTest = GetAncestor(hParent, GA_PARENT);
|
||||
if (NULL == hTest) break;
|
||||
hParent = hTest;
|
||||
}
|
||||
|
||||
if (NULL != hParent)
|
||||
{
|
||||
HWND hFocus = GetNextDlgTabItem(hParent, hToolbar, (FALSE == fForward));
|
||||
if (NULL != hFocus) ::SetFocus(hFocus);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ToolbarAddress::EditboxAcceptText(HWND hwnd)
|
||||
{
|
||||
UINT cchLenMax = GetWindowTextLength(hwnd);
|
||||
if (0 == cchLenMax) return;
|
||||
|
||||
cchLenMax++;
|
||||
Plugin_FreeResString(text);
|
||||
text = Plugin_MallocString(cchLenMax);
|
||||
if (NULL != text)
|
||||
{
|
||||
INT cchText = GetWindowText(hwnd, text, cchLenMax);
|
||||
if (0 != cchText)
|
||||
{
|
||||
LPCWSTR begin, end;
|
||||
begin = text;
|
||||
end = text + cchText + 1;
|
||||
while (L' ' == *begin && begin != end) begin++;
|
||||
while (L' ' == *end && begin != end) end--;
|
||||
if (end <= begin) return;
|
||||
}
|
||||
}
|
||||
|
||||
HWND hToolbar = GetParent(hwnd);
|
||||
|
||||
if (NULL != hToolbar)
|
||||
{
|
||||
Toolbar_SendCommand(hToolbar, ID_ADDRESSBAR_CHANGED);
|
||||
}
|
||||
|
||||
EditboxNavigateNextCtrl(hwnd, TRUE);
|
||||
}
|
||||
BOOL ToolbarAddress::EditboxKeyDown(HWND hwnd, UINT vKey, UINT state)
|
||||
{
|
||||
switch(vKey)
|
||||
{
|
||||
case VK_UP:
|
||||
case VK_DOWN:
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
BOOL ToolbarAddress::EditboxKeyUp(HWND hwnd, UINT vKey, UINT state)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
BOOL ToolbarAddress::EditboxPreviewChar(HWND hwnd, UINT vKey, UINT state)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue