// MyCell - version 1.0
// Written by Yanxueming <yanxm2003@hotmail.com>
// Copyright (C) 2006-2006
// All rights reserved.
//
// The code and information is provided "as-is" without
// warranty of any kind, either expressed or implied.
//Yanxm 2007��12��25�� 18:02:11
#include "stdafx.h"
#include "../include/Workbook.h"
namespace mycell{
bool HasFocus(HWND hWnd)
{
HWND const hWndFocus=GetFocus();
for(;hWnd;hWnd=GetParent(hWnd)){
if(hWndFocus==hWnd)
return true;
}
return false;
}
void GetWndUpdateRgn(HWND hWnd, CRgnLight& rgnValue)
{
HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
if (hRgn)
{
switch (GetUpdateRgn(hWnd, hRgn, FALSE))
{
case SIMPLEREGION:
case COMPLEXREGION:
rgnValue.FromGdi(hRgn);
}
DeleteObject(hRgn);
}
}
BEGIN_MSG_MAP_CPP(GridWnd)
MESSAGE_HANDLER(WM_CREATE,OnCreate)
//MESSAGE_HANDLER(WM_POSTCREATE,OnPostCreate)
MESSAGE_HANDLER(WM_SIZE,OnSize)
if(pSheet_){
MESSAGE_HANDLER(WM_GETDLGCODE,OnGetDlgCode)
MESSAGE_HANDLER(WM_KILLFOCUS,OnKillFocus)
//MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)
//MESSAGE_HANDLER(WM_VSCROLL,OnVScroll)
//MESSAGE_HANDLER(WM_HSCROLL,OnHScroll)
//MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)
MESSAGE_HANDLER(WM_KEYDOWN,OnKeyEvent)
MESSAGE_HANDLER(WM_CHAR,OnKeyEvent)
MESSAGE_HANDLER(WM_IME_COMPOSITION,OnImeComposition)
MESSAGE_HANDLER(WM_MOUSEMOVE, pSheet_->OnMouseEvent)
MESSAGE_HANDLER(WM_LBUTTONDBLCLK, pSheet_->OnMouseEvent)
MESSAGE_HANDLER(WM_LBUTTONDOWN, pSheet_->OnMouseEvent)
MESSAGE_HANDLER(WM_LBUTTONUP, pSheet_->OnMouseEvent)
MESSAGE_HANDLER(WM_RBUTTONDOWN, pSheet_->OnMouseEvent)
MESSAGE_HANDLER(WM_RBUTTONUP, pSheet_->OnMouseEvent)
//MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)
MESSAGE_HANDLER(WM_PAINT,OnPaint)
}
END_MSG_MAP()
void GridWnd::ChangeCursor(const CELLHITTESTINFO& chi)
{
if(!HasFocus(m_hWnd)){
SetCursor(cf_.standardCursor);
return;
}
if(CHTC_ON_DRAGCORNER&chi.flags){
if(pSheet_->get_ShowSelection())
SetCursor(cf_.crossCursor.get());
else
SetCursor(cf_.standardCursor);
}else if(CHTC_ON_COLDIVIDER&chi.flags){
SetCursor(cf_.sizeWECursor);
}else if(CHTC_ON_ROWDIVIDER&chi.flags){
SetCursor(cf_.sizeNSCursor);
}else
SetCursor(cf_.standardCursor);
}
LRESULT GridWnd::OnPaint(UINT,WPARAM,LPARAM,BOOL&)
{
//if(!pSheet_)
// return 0;
CRgnLight rgnClip;
GetWndUpdateRgn(m_hWnd,rgnClip);
rgnClip.Optimize();
CPaintDC dc(m_hWnd);
//pSheet_->Draw(dc,gridRender_,rgnClip);
//const RowHeader& rh=pSheet_->get_RowHeader();
//const ColHeader& ch=pSheet_->get_ColHeader();
RECT rcli;
GetClientRect(&rcli);
const CellAxisInfo& cai=pSheet_->get_CellAxisInfo();
_ASSERT(cai.HRemainAxis>=0);
gridRender_.draw(pSheet_,&cai,dc,&rcli,&rgnClip);
return 0;
}
//LRESULT GridWnd::OnShowWindow(UINT,WPARAM wParam,LPARAM,BOOL&)
//{
// if(wParam){
// RECT rc;
// pSheet_->GetClientRect(&rc);
// pSheet_->Scroll_ResetHScrollBar(&rc);
// pSheet_->Scroll_ResetVScrollBar(&rc);
// }
// return 0;
//}
LRESULT GridWnd::OnKillFocus(UINT,WPARAM,LPARAM,BOOL&)
{
if(Worksheet::tooltip_.second.IsWindow())
Worksheet::tooltip_.second.TrackActivate(&Worksheet::tooltip_.first,FALSE);
Worksheet::tooltipCell_.set(-100,-100);
return 0;
}
LRESULT GridWnd::OnSize(UINT,WPARAM,LPARAM lParam,BOOL&)
{
if(pSheet_){
const WORD cx=LOWORD(lParam);
const WORD cy=HIWORD(lParam);
if(!cx || !cy) return 0;
const RECT rc={0,0,cx,cy};
pSheet_->RecalcCellAxisInfo(rc,CCAI_CALC_ALL);
const CellAxisInfo& cai=pSheet_->get_CellAxisInfo();
pSheet_->put_LeftVisScrollCol(pSheet_->get_ColHeader().get_LeftVisScrollCol(),&cai);
pSheet_->put_TopVisScrollRow(pSheet_->get_RowHeader().get_TopVisScrollRow(),&cai);
pSheet_->Scroll_ResetHScrollBar(/*TRUE,TRUE,*/&rc);
pSheet_->Scroll_ResetVScrollBar(/*TRUE,TRUE,*/&rc);
}
return 0;
}
HRESULT GridWnd::SendNotifyMessageToListener(int nRow, int nCol, int nNotifyCode,LPARAM lParam,BOOL* pbHandled) const
{
return pSheet_->GetWorkbook()->SendNotifyMessageToListener(nRow,nCol,nNotifyCode,lParam,pbHandled);
}
LRESULT GridWnd::OnImeComposition(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//if(!pSheet_)
// return 0;
const CCell cell=pSheet_->GetActiveCell();
const ECellType ctype=(ECellType)pSheet_->GetCellType(cell).cellType;
CComPtr<ICellEditor> pEditor=pSheet_->GetWorkbook()->GetTypeFactory().GetEditor(ctype);
if(pEditor){
CComVariant vText;
pSheet_->GetCellText(cell,&vText,EGCVD_EDIT);
pEditor->OnImeComposition(cell,&vText,wParam,lParam,(VARIANT_BOOL*)&bHandled);
}
return 0;
}
LRESULT GridWnd::OnKeyEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//if(!pSheet_)
// return 0;
const CCell cell=pSheet_->GetActiveCell();
KeyDownInfo kdi(wParam,lParam);
SendNotifyMessageToListener(cell.row,cell.col,OCN_BASE+uMsg,(LPARAM)&kdi,&bHandled);
if(!bHandled){
if(WM_KEYDOWN==uMsg)
pSheet_->selectionImp_.OnKeyDown(uMsg,wParam,lParam,bHandled);
else if(WM_CHAR==uMsg){
const ECellType ctype=(ECellType)pSheet_->GetCellType(cell).cellType;
CComPtr<ICellEditor> pEditor=pSheet_->GetWorkbook()->GetTypeFactory().GetEditor(ctype);
if(pEditor){
CComVariant vText;
pSheet_->GetCellText(cell,&vText,EGCVD_EDIT);
pEditor->OnChar(cell,&vText,wParam,lParam,(VARIANT_BOOL*)&bHandled);
}
}
}
return bHandled?0:1;
}
LRESULT GridWnd::OnCreate(UINT,WPARAM,LPARAM lParam,BOOL& bHandled)
{
#pragma warning( disable : 4312 )
cf_.standardCursor=(HCURSOR)SetClassLong(m_hWnd,GCL_HCURSOR,NULL);
if(!cf_.standardCursor){
cf_.standardCursor=LoadCursor(NULL,IDC_ARROW);
}
#pragma warning( default : 4312 )
gridRender_.Init(m_hWnd);
CreateTT();
//PostMessage(WM_POSTCREATE);
return 0;
}
//LRESULT GridWnd::OnPostCreate(UINT,WPARAM,LPARAM lParam,BOOL& bHandled)
//{
// if(pSheet_){
// RECT rc;
// pSheet_->GetClientRect(&rc);
// pSheet_->Scroll_ResetHScrollBar(&rc);
// pSheet_->Scroll_ResetVScrollBar(&rc);
// }
// return 0;
//}
void GridWnd::SetWorksheet(Worksheet* pSheet)
{
pSheet_=pSheet;
if(m_hWnd){
pSheet_->m_hWnd=m_hWnd;
pSheet_->Refresh();
}
}
void GridWnd::CreateTT()
{
#pragma warning( disable : 4311 )
if(Worksheet::tooltip_.second.m_hWnd!=NULL)
return;
_ASSERT(Worksheet::tooltip_.second.m_hWnd==NULL);
//_ASSERT(!tooltip_.IsWindow());
Worksheet::tooltip_.second.Create(m_hWnd, rcDefault, NULL, WS_POPUP ,0);
Worksheet::tooltip_.second.SetTipBkColor(RGB(0xcc,0xcc,0xff));
Worksheet::tooltip_.first.cbSize =sizeof(TOOLINFO);
Worksheet::tooltip_.first.uFlags =TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
Worksheet::tooltip_.first.hwnd =m_hWnd;
Worksheet::tooltip_.first.uId = (UINT)Worksheet::tooltip_.second.m_hWnd;
Worksheet::tooltip_.first.lpszText = Workbook::tooltipText_;
Worksheet::tooltip_.first.hinst = _Module.GetResourceInstance();
SetRect(&Worksheet::tooltip_.first.rect,0,0,0,0);
Worksheet::tooltip_.second.AddTool(&Worksheet::tooltip_.first);
Worksheet::tooltip_.second.TrackActivate(&Worksheet::tooltip_.first,FALSE);
#pragma warning( default : 4311 )
}
}//namespace mycell