mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-13 23:17:57 +00:00
626 lines
16 KiB
C++
626 lines
16 KiB
C++
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
*
|
||
|
* The contents of this file are subject to the Netscape Public License
|
||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||
|
* http://www.mozilla.org/NPL/
|
||
|
*
|
||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* NPL.
|
||
|
*
|
||
|
* The Initial Developer of this code under the NPL is Netscape
|
||
|
* Communications Corporation. Portions created by Netscape are
|
||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||
|
* Reserved.
|
||
|
*/
|
||
|
|
||
|
//
|
||
|
// This file contains the implementation of
|
||
|
// CODNetscapeButton
|
||
|
// CODMochaListBox
|
||
|
// CODMochaComboBox
|
||
|
//
|
||
|
// Why we need the ownerdrawn version ?
|
||
|
// 1. So we could display UTF8 widget
|
||
|
// 2. So we coudl use Unicode Font on US Win95 to display non-Latin
|
||
|
// characters.
|
||
|
|
||
|
|
||
|
|
||
|
// Requried include file
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#include "odctrl.h"
|
||
|
#include "intlwin.h"
|
||
|
#include "intl_csi.h"
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CODNetscapeButton
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CODNetscapeButton::CODNetscapeButton(MWContext * context, LO_FormElementStruct * form, CWnd* pParent) :
|
||
|
CNetscapeButton(context, form, pParent)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CODNetscapeButton::Draw3DBox(CDC *pDC, CRect& r, BOOL selected)
|
||
|
{
|
||
|
|
||
|
// fill out the rectangle wiht background brush
|
||
|
CBrush* pBrush = new CBrush ( ::GetSysColor (COLOR_BTNFACE));
|
||
|
|
||
|
pDC->FillRect (r, pBrush);
|
||
|
delete pBrush;
|
||
|
|
||
|
// decide which color we should use to draw the four edges
|
||
|
COLORREF color1, color2, color3, color4;
|
||
|
|
||
|
#ifdef XP_WIN32
|
||
|
if(selected)
|
||
|
{
|
||
|
color1 = ::GetSysColor(COLOR_3DHILIGHT);
|
||
|
color2 = ::GetSysColor(COLOR_3DLIGHT);
|
||
|
color3 = ::GetSysColor(COLOR_3DDKSHADOW);
|
||
|
color4 = ::GetSysColor(COLOR_3DSHADOW);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
color1 = ::GetSysColor(COLOR_3DDKSHADOW);
|
||
|
color2 = ::GetSysColor(COLOR_3DSHADOW);
|
||
|
color3 = ::GetSysColor(COLOR_3DHILIGHT);
|
||
|
color4 = ::GetSysColor(COLOR_3DLIGHT);
|
||
|
}
|
||
|
#else
|
||
|
if(selected)
|
||
|
{
|
||
|
color1 = ::GetSysColor(COLOR_BTNHIGHLIGHT);
|
||
|
color2 = ::GetSysColor(COLOR_BTNHIGHLIGHT);
|
||
|
color3 = ::GetSysColor(COLOR_BTNSHADOW);
|
||
|
color4 = ::GetSysColor(COLOR_BTNSHADOW);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
color1 = ::GetSysColor(COLOR_BTNSHADOW);
|
||
|
color2 = ::GetSysColor(COLOR_BTNSHADOW);
|
||
|
color3 = ::GetSysColor(COLOR_BTNHIGHLIGHT);
|
||
|
color4 = ::GetSysColor(COLOR_BTNHIGHLIGHT);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// 3. create pen and draw them
|
||
|
CPen* pPen1 = new CPen( PS_SOLID, 0, color1);
|
||
|
CPen* pOldpen = pDC->SelectObject(pPen1);
|
||
|
|
||
|
POINT seg1[3];
|
||
|
seg1[0].x = r.left;
|
||
|
seg1[0].y = r.bottom-1;
|
||
|
seg1[1].x = r.right-1;
|
||
|
seg1[1].y = r.bottom-1;
|
||
|
seg1[2].x = r.right-1;
|
||
|
seg1[2].y = r.top;
|
||
|
pDC->Polyline(seg1, 3);
|
||
|
|
||
|
CPen* pPen2 = new CPen( PS_SOLID, 0, color2);
|
||
|
pDC->SelectObject(pPen2);
|
||
|
|
||
|
delete pPen1;
|
||
|
|
||
|
POINT seg2[3];
|
||
|
seg2[0].x = r.left+1;
|
||
|
seg2[0].y = r.bottom-2;
|
||
|
seg2[1].x = r.right-2;
|
||
|
seg2[1].y = r.bottom-2;
|
||
|
seg2[2].x = r.right-2;
|
||
|
seg2[2].y = r.top;
|
||
|
pDC->Polyline(seg2, 3);
|
||
|
|
||
|
CPen* pPen3 = new CPen( PS_SOLID, 0, color3);
|
||
|
pDC->SelectObject(pPen3);
|
||
|
delete pPen2;
|
||
|
|
||
|
POINT seg3[3];
|
||
|
seg3[0].x = r.left;
|
||
|
seg3[0].y = r.bottom-2;
|
||
|
seg3[1].x = r.left;
|
||
|
seg3[1].y = r.top;
|
||
|
seg3[2].x = r.right-1;
|
||
|
seg3[2].y = r.top;
|
||
|
pDC->Polyline(seg3, 3);
|
||
|
|
||
|
CPen* pPen4 = new CPen( PS_SOLID, 0, color4);
|
||
|
pDC->SelectObject(pPen4);
|
||
|
delete pPen3;
|
||
|
|
||
|
POINT seg4[3];
|
||
|
seg4[0].x = r.left+1;
|
||
|
seg4[0].y = r.bottom-3;
|
||
|
seg4[1].x = r.left+1;
|
||
|
seg4[1].y = r.top+1;
|
||
|
seg4[2].x = r.right-2;
|
||
|
seg4[2].y = r.top+1;
|
||
|
pDC->Polyline(seg4, 3);
|
||
|
|
||
|
pDC->SelectObject(pOldpen);
|
||
|
delete pPen4;
|
||
|
}
|
||
|
void CODNetscapeButton::DrawCenterText(CDC *pDC, LPCSTR text, CRect& r)
|
||
|
{
|
||
|
CSize size;
|
||
|
int16 wincsid = INTL_GetCSIWinCSID(LO_GetDocumentCharacterSetInfo(m_Context));
|
||
|
|
||
|
LO_TextAttr *text_attr = m_Form->text_attr;
|
||
|
|
||
|
// Measure what the size of the button should be.
|
||
|
CyaFont *pMyFont;
|
||
|
CXDC(m_Context)->SelectNetscapeFont( pDC->GetSafeHdc(), text_attr, pMyFont );
|
||
|
// pMyFont->PrepareDrawText(pDC->GetSafeHdc());
|
||
|
|
||
|
CIntlWin::GetTextExtentPointWithCyaFont(pMyFont, wincsid,
|
||
|
pDC->GetSafeHdc(), text, XP_STRLEN(text), &size);
|
||
|
|
||
|
CIntlWin::TextOutWithCyaFont(pMyFont, wincsid, pDC->GetSafeHdc(),
|
||
|
(r.right + r.left - size.cx) / 2 ,
|
||
|
(r.top + r.bottom - size.cy) / 2 ,
|
||
|
text, XP_STRLEN(text));
|
||
|
|
||
|
// pMyFont->EndDrawText( pDC->GetSafeHdc( ));
|
||
|
CXDC(m_Context)->ReleaseNetscapeFont( pDC->GetSafeHdc(), pMyFont );
|
||
|
|
||
|
}
|
||
|
void CODNetscapeButton::DrawContent(CDC *pDC, LPDRAWITEMSTRUCT lpdis)
|
||
|
{
|
||
|
|
||
|
CString text;
|
||
|
int16 win_csid = INTL_GetCSIWinCSID(LO_GetDocumentCharacterSetInfo(m_Context));
|
||
|
|
||
|
if (CS_UTF8 == win_csid)
|
||
|
{
|
||
|
// UTF8 text is broken inside MFC or WINAPI.
|
||
|
// We need to use original data in form.
|
||
|
// We should maybe only use this part (not call MFC get a window text).
|
||
|
// This should be reviewed again for Gromit.
|
||
|
LO_FormElementStruct* elm = GetElement();
|
||
|
lo_FormElementMinimalData ele_minimal = elm->element_data->ele_minimal;
|
||
|
char *cp = (char *) (ele_minimal.value);
|
||
|
text = CString(cp);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
GetWindowText(text);
|
||
|
}
|
||
|
|
||
|
// set the mode to TRANSPARENT
|
||
|
pDC->SetBkMode(TRANSPARENT);
|
||
|
|
||
|
// If it is disabled, draw a ghost one first.
|
||
|
if(lpdis->itemState & ODS_DISABLED)
|
||
|
{
|
||
|
#ifdef XP_WIN32
|
||
|
pDC->SetTextColor(::GetSysColor(COLOR_3DLIGHT));
|
||
|
#else
|
||
|
// *** Fix me ftang
|
||
|
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
|
||
|
#endif
|
||
|
|
||
|
CRect ghostRect = lpdis->rcItem;
|
||
|
ghostRect.OffsetRect(1,1);
|
||
|
|
||
|
this->DrawCenterText(pDC, (LPCSTR)text, ghostRect);
|
||
|
|
||
|
pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
|
||
|
}
|
||
|
|
||
|
// Find teh rect that we should draw the text
|
||
|
CRect textrect = lpdis->rcItem;
|
||
|
if(lpdis->itemState & ODS_SELECTED)
|
||
|
textrect.OffsetRect(1,1);
|
||
|
|
||
|
// Draw the text
|
||
|
this->DrawCenterText(pDC, (LPCSTR)text, textrect);
|
||
|
|
||
|
// Draw focus box
|
||
|
if( (lpdis->itemState & ODS_FOCUS) &&
|
||
|
!(lpdis->itemState & ODS_DISABLED))
|
||
|
{
|
||
|
CRect rect = lpdis->rcItem;
|
||
|
rect.InflateRect(-3, -3);
|
||
|
pDC->DrawFocusRect(rect);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CODNetscapeButton::DrawItem(LPDRAWITEMSTRUCT lpdis)
|
||
|
{
|
||
|
CDC dc;
|
||
|
dc.Attach (lpdis->hDC);
|
||
|
CRect rect = lpdis->rcItem;
|
||
|
|
||
|
this->Draw3DBox(&dc, rect, (lpdis->itemState & ODS_SELECTED));
|
||
|
this->DrawContent(&dc, lpdis);
|
||
|
|
||
|
dc.Detach();
|
||
|
}
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CODMochaListBox
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// Helper routine used shared by list box and combo box code
|
||
|
static void
|
||
|
DrawTheItem(LPDRAWITEMSTRUCT lpdis, int16 wincsid, LO_TextAttr* text_attr, MWContext* m_Context)
|
||
|
{
|
||
|
#ifdef _WIN32
|
||
|
::FillRect(lpdis->hDC, &lpdis->rcItem, lpdis->itemState & ODS_SELECTED ?
|
||
|
(HBRUSH)(COLOR_HIGHLIGHT + 1) : (HBRUSH)(COLOR_WINDOW + 1));
|
||
|
#else
|
||
|
HBRUSH hBrush;
|
||
|
|
||
|
// Paint the item background
|
||
|
hBrush = ::CreateSolidBrush(::GetSysColor(lpdis->itemState & ODS_SELECTED ?
|
||
|
COLOR_HIGHLIGHT : COLOR_WINDOW));
|
||
|
::FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
|
||
|
::DeleteObject(hBrush);
|
||
|
#endif
|
||
|
|
||
|
// Measure what the size of the button should be.
|
||
|
if (lpdis->itemID != (UINT)-1) {
|
||
|
CyaFont *pMyFont;
|
||
|
CXDC(m_Context)->SelectNetscapeFont( lpdis->hDC, text_attr, pMyFont );
|
||
|
//pMyFont->PrepareDrawText(lpdis->hDC);
|
||
|
|
||
|
::SetTextColor(lpdis->hDC, ::GetSysColor(lpdis->itemState & ODS_SELECTED ?
|
||
|
COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));
|
||
|
::SetBkColor(lpdis->hDC, ::GetSysColor(lpdis->itemState & ODS_SELECTED ?
|
||
|
COLOR_HIGHLIGHT : COLOR_WINDOW ));
|
||
|
|
||
|
CIntlWin::TextOutWithCyaFont(pMyFont, wincsid, lpdis->hDC,
|
||
|
2 + lpdis->rcItem.left, lpdis->rcItem.top,
|
||
|
(LPCSTR)lpdis->itemData, XP_STRLEN((char*)lpdis->itemData));
|
||
|
|
||
|
//pMyFont->EndDrawText(lpdis->hDC);
|
||
|
CXDC(m_Context)->ReleaseNetscapeFont( lpdis->hDC, pMyFont );
|
||
|
}
|
||
|
|
||
|
if (lpdis->itemState & ODS_FOCUS)
|
||
|
::DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
|
||
|
}
|
||
|
|
||
|
void CODMochaListBox::MeasureItem(LPMEASUREITEMSTRUCT lpmis)
|
||
|
{
|
||
|
CyaFont *pMyFont;
|
||
|
CDC *pDC = GetDC();
|
||
|
HDC hDC = pDC->GetSafeHdc();
|
||
|
CXDC(m_Context)->SelectNetscapeFont( hDC, m_Form->text_attr, pMyFont );
|
||
|
lpmis->itemHeight = pMyFont->GetHeight();
|
||
|
|
||
|
CXDC(m_Context)->ReleaseNetscapeFont( hDC, pMyFont );
|
||
|
ReleaseDC(pDC);
|
||
|
}
|
||
|
|
||
|
void CODMochaListBox::DrawItem(LPDRAWITEMSTRUCT lpdis)
|
||
|
{
|
||
|
LO_LockLayout();
|
||
|
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(m_Context);
|
||
|
DrawTheItem(lpdis, INTL_GetCSIWinCSID(csi), m_Form->text_attr, m_Context);
|
||
|
LO_UnlockLayout();
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CODMochaComboBox
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CODMochaComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpmis)
|
||
|
{
|
||
|
CyaFont *pMyFont;
|
||
|
CDC *pDC = GetDC();
|
||
|
CXDC(m_Context)->SelectNetscapeFont( pDC->GetSafeHdc(), m_Form->text_attr, pMyFont );
|
||
|
lpmis->itemHeight = pMyFont->GetHeight();
|
||
|
|
||
|
|
||
|
CXDC(m_Context)->ReleaseNetscapeFont( pDC->GetSafeHdc(), pMyFont );
|
||
|
ReleaseDC(pDC);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CODMochaComboBox::DrawItem(LPDRAWITEMSTRUCT lpdis)
|
||
|
{
|
||
|
LO_LockLayout();
|
||
|
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(m_Context);
|
||
|
DrawTheItem(lpdis, INTL_GetCSIWinCSID(csi), m_Form->text_attr, m_Context);
|
||
|
LO_UnlockLayout();
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CUTF8NetscapeEdit
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
#define ResizeBuffer(b,l,nl) \
|
||
|
if((nl) > (l)) { \
|
||
|
(b) = ((b) == NULL) ? ((unsigned char*) malloc( ((l)=(((nl) < 512) ? 512 : (nl))))) \
|
||
|
: ((unsigned char*) realloc((b), ((l)=(((nl) < 512) ? 512 : (nl))))); \
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
CODNetscapeEdit::CODNetscapeEdit()
|
||
|
{
|
||
|
m_set_text_wincsid = 0;
|
||
|
m_convertedBufSize = m_ucs2BufSize = m_gettextBufSize = 0;
|
||
|
m_ucs2Buf = m_convertedBuf = m_gettextBuf = NULL;
|
||
|
}
|
||
|
CODNetscapeEdit::~CODNetscapeEdit()
|
||
|
{
|
||
|
if(m_convertedBuf != NULL)
|
||
|
{
|
||
|
free(m_convertedBuf);
|
||
|
m_convertedBuf = NULL;
|
||
|
m_convertedBufSize = 0;
|
||
|
}
|
||
|
if(m_ucs2Buf != NULL)
|
||
|
{
|
||
|
free(m_ucs2Buf);
|
||
|
m_ucs2Buf=NULL;
|
||
|
m_ucs2BufSize = 0;
|
||
|
}
|
||
|
if(m_gettextBuf != NULL)
|
||
|
{
|
||
|
free(m_gettextBuf);
|
||
|
m_gettextBuf=NULL;
|
||
|
m_gettextBufSize = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
CODNetscapeEdit::GetWindowText(CString& rString)
|
||
|
{
|
||
|
|
||
|
if( (CIntlWin::UseUnicodeFontAPI(GetSetWindowTextCSID())) ||
|
||
|
(sysInfo.m_bWinNT))
|
||
|
{
|
||
|
int nLen = GetWindowTextLength();
|
||
|
GetWindowText (rString.GetBufferSetLength(nLen), nLen+1);
|
||
|
rString.ReleaseBuffer();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CNetscapeEdit::GetWindowText(rString);
|
||
|
}
|
||
|
}
|
||
|
int
|
||
|
CODNetscapeEdit::GetWindowTextLength()
|
||
|
{
|
||
|
|
||
|
if( (CIntlWin::UseUnicodeFontAPI(GetSetWindowTextCSID())) ||
|
||
|
(sysInfo.m_bWinNT))
|
||
|
return GetWindowText(NULL, 0);
|
||
|
else
|
||
|
return CNetscapeEdit::GetWindowTextLength();
|
||
|
}
|
||
|
|
||
|
#ifdef XP_WIN32
|
||
|
|
||
|
void
|
||
|
CODNetscapeEdit::SetWindowTextW(HWND hWnd, LPCWSTR lpString)
|
||
|
{
|
||
|
::SendMessageW(hWnd, WM_SETTEXT, (WPARAM) 0, (LPARAM) lpString);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
CODNetscapeEdit::GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
|
||
|
{
|
||
|
if(nMaxCount > 0)
|
||
|
return ::SendMessageW(hWnd, WM_GETTEXT, (WPARAM) nMaxCount, (LPARAM) lpString);
|
||
|
else
|
||
|
return ::SendMessageW(hWnd, WM_GETTEXTLENGTH, 0, 0);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void
|
||
|
CODNetscapeEdit::SetWindowText(LPCTSTR lpszString)
|
||
|
{
|
||
|
int16 wincsid = GetWinCSID();
|
||
|
SetSetWindowTextCSID(wincsid);
|
||
|
#ifdef XP_WIN32
|
||
|
if(sysInfo.m_bWinNT)
|
||
|
{
|
||
|
// In case it is NT, we should convert it to Unicode and use
|
||
|
// if appropriate SendMessageW
|
||
|
ASSERT((strlen(lpszString) < 4) ||
|
||
|
(!((lpszString[0]=='?') && (lpszString[1]=='?') && (lpszString[2]=='?') && (lpszString[3]=='?')))
|
||
|
);
|
||
|
Convert(wincsid, CS_UCS2, (unsigned char*)lpszString);
|
||
|
|
||
|
SetWindowTextW(m_hWnd, (unsigned short*)m_convertedBuf);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
if(CS_UTF8 == wincsid)
|
||
|
{
|
||
|
int16 csid = CIntlWin::GetSystemLocaleCsid();
|
||
|
Convert(wincsid, csid, (unsigned char*)lpszString);
|
||
|
CNetscapeEdit::SetWindowText((char*)m_convertedBuf);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CNetscapeEdit::SetWindowText(lpszString);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int
|
||
|
CODNetscapeEdit::GetWindowText(LPTSTR lpszStringBuf, int nMaxCount)
|
||
|
{
|
||
|
#ifdef XP_WIN32
|
||
|
if(sysInfo.m_bWinNT)
|
||
|
{
|
||
|
// In case it is NT, we should convert it to Unicode and use
|
||
|
// if appropriate SendMessageW
|
||
|
int rawLen = (::GetWindowTextLengthW(m_hWnd) + 1) * 2;
|
||
|
ResizeBuffer(m_gettextBuf, m_gettextBufSize, rawLen);
|
||
|
|
||
|
GetWindowTextW(m_hWnd, (unsigned short*)m_gettextBuf, m_gettextBufSize / 2);
|
||
|
|
||
|
Convert(CS_UCS2, GetSetWindowTextCSID(), (unsigned char*)m_gettextBuf);
|
||
|
int convertedLen = strlen((char*)m_convertedBuf);
|
||
|
ASSERT((convertedLen < 4) ||
|
||
|
(! ((m_convertedBuf[0]=='?') && (m_convertedBuf[1]=='?') &&
|
||
|
(m_convertedBuf[2]=='?') && (m_convertedBuf[3]=='?')))
|
||
|
);
|
||
|
if((nMaxCount > 0) && (lpszStringBuf != NULL))
|
||
|
{
|
||
|
if(nMaxCount > convertedLen)
|
||
|
{
|
||
|
strcpy(lpszStringBuf, (char*)m_convertedBuf);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* We should really make sure it return the whole characters */
|
||
|
strncpy(lpszStringBuf, (char*)m_convertedBuf, nMaxCount-1);
|
||
|
lpszStringBuf[nMaxCount-1] = '\0';
|
||
|
}
|
||
|
}
|
||
|
return convertedLen;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
if(CS_UTF8 == GetWinCSID())
|
||
|
{
|
||
|
int rawLen = CNetscapeEdit::GetWindowTextLength();
|
||
|
if(rawLen == 0)
|
||
|
return 0;
|
||
|
ResizeBuffer(m_gettextBuf, m_gettextBufSize, rawLen);
|
||
|
|
||
|
// Currently, I have problem to use GetWindowTextW to get the
|
||
|
// Unicode text. Try to use DDE CF_UNICODETEXT instead
|
||
|
CNetscapeEdit::GetWindowText((char*)m_gettextBuf, m_gettextBufSize);
|
||
|
Convert(CIntlWin::GetSystemLocaleCsid(),GetWinCSID(), m_gettextBuf);
|
||
|
int convertedLen = strlen((char*)m_convertedBuf);
|
||
|
|
||
|
if((nMaxCount > 0) && (lpszStringBuf != NULL))
|
||
|
{
|
||
|
if(nMaxCount > convertedLen)
|
||
|
{
|
||
|
strcpy(lpszStringBuf, (char*)m_convertedBuf);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* We should really make sure it return the whole characters */
|
||
|
strncpy(lpszStringBuf, (char*)m_convertedBuf, nMaxCount-1);
|
||
|
lpszStringBuf[nMaxCount-1] = '\0';
|
||
|
}
|
||
|
}
|
||
|
return convertedLen;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(0 == nMaxCount)
|
||
|
return CNetscapeEdit::GetWindowTextLength();
|
||
|
else
|
||
|
return CNetscapeEdit::GetWindowText(lpszStringBuf,nMaxCount);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CODNetscapeEdit::Convert(int16 from, int16 to, unsigned char* lpszString)
|
||
|
{
|
||
|
int ucs2bufneeded;
|
||
|
int ucs2len;
|
||
|
int mbbufneeded;
|
||
|
if((lpszString == NULL) || ((lpszString[0] == NULL) && (CS_UCS2 != from)))
|
||
|
{
|
||
|
ResizeBuffer(m_convertedBuf, m_convertedBufSize, 2);
|
||
|
m_convertedBuf[0] = '\0';
|
||
|
m_convertedBuf[1] = '\0'; // in case the to is UCS2
|
||
|
return;
|
||
|
}
|
||
|
if(CS_UCS2 == from)
|
||
|
{
|
||
|
// it the from is UCS2, then we don't need to convert it
|
||
|
// Just make sure the buffer is big enough and copy to it.
|
||
|
ucs2len = CASTINT(INTL_UnicodeLen((INTL_Unicode*)lpszString));
|
||
|
ucs2bufneeded = CASTINT((ucs2len + 1)* 2);
|
||
|
ResizeBuffer(m_ucs2Buf, m_ucs2BufSize, ucs2bufneeded);
|
||
|
memcpy((char*)m_ucs2Buf, (char*)lpszString, ucs2bufneeded);
|
||
|
m_ucs2Buf[ucs2len*2] = '\0'; // NULL terminated UCS2 string
|
||
|
m_ucs2Buf[ucs2len*2+1] = '\0'; // NULL terminated UCS2 string
|
||
|
} else {
|
||
|
ucs2bufneeded = CASTINT(INTL_StrToUnicodeLen(from, lpszString) * 2);
|
||
|
ResizeBuffer(m_ucs2Buf, m_ucs2BufSize, ucs2bufneeded);
|
||
|
ucs2len = CASTINT(INTL_StrToUnicode(from, lpszString, (INTL_Unicode*)m_ucs2Buf, m_ucs2BufSize));
|
||
|
}
|
||
|
|
||
|
if(CS_UCS2 == to)
|
||
|
{
|
||
|
// it the to is UCS2, then we don't need to convert it
|
||
|
// Just make sure the buffer is big enough and copy to it.
|
||
|
mbbufneeded = CASTINT((ucs2len+1)*2);
|
||
|
ResizeBuffer(m_convertedBuf, m_convertedBufSize, mbbufneeded);
|
||
|
memcpy((char*)m_convertedBuf, (char*)m_ucs2Buf, mbbufneeded);
|
||
|
m_convertedBuf[ucs2len*2] = '\0'; // NULL terminated UCS2 string
|
||
|
m_convertedBuf[ucs2len*2+1] = '\0'; // NULL terminated UCS2 string
|
||
|
|
||
|
} else {
|
||
|
mbbufneeded = CASTINT(INTL_UnicodeToStrLen(to, (INTL_Unicode*)m_ucs2Buf, ucs2len));
|
||
|
ResizeBuffer(m_convertedBuf, m_convertedBufSize, mbbufneeded);
|
||
|
INTL_UnicodeToStr(to, (INTL_Unicode*)m_ucs2Buf, ucs2len, m_convertedBuf, m_convertedBufSize);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
int16
|
||
|
CODNetscapeEdit::GetSetWindowTextCSID()
|
||
|
{
|
||
|
// XP_ASSERT(0 != m_set_text_wincsid); // Make sure SetWindowText is called after SetWindowText
|
||
|
if(m_set_text_wincsid != CS_UNKNOWN && m_set_text_wincsid != CS_DEFAULT)
|
||
|
return m_set_text_wincsid;
|
||
|
else
|
||
|
return INTL_DefaultWinCharSetID(0); // temp use CS_LATIN1
|
||
|
}
|
||
|
int16 CODNetscapeEdit::GetWinCSID()
|
||
|
{
|
||
|
XP_ASSERT(m_Context);
|
||
|
|
||
|
if(m_Context)
|
||
|
{
|
||
|
return INTL_GetCSIWinCSID(
|
||
|
LO_GetDocumentCharacterSetInfo(m_Context));
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return CS_DEFAULT; // CS_DEFAULT == 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef XP_WIN32
|
||
|
BOOL CODNetscapeEdit::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
|
||
|
LPCTSTR lpszWindowName, DWORD dwStyle,
|
||
|
int x, int y, int nWidth, int nHeight,
|
||
|
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
|
||
|
{
|
||
|
if(sysInfo.m_bWinNT)
|
||
|
{
|
||
|
// Place holder for code deal with Unicode
|
||
|
}
|
||
|
|
||
|
return CEdit::CreateEx(dwExStyle, lpszClassName, lpszWindowName,
|
||
|
dwStyle, x, y, nWidth, nHeight, hWndParent, nIDorHMenu, lpParam);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|