/*---------------------------------------------------------------------------------------------- Initialize font after superclass initialization is done. ----------------------------------------------------------------------------------------------*/ void AfDeFeEdBoxBut::Init() { Assert(m_hvoObj); // Initialize should have been called first. CreateFont(); ILgWritingSystemFactoryPtr qwsf; IWritingSystemPtr qws; GetLpInfo()->GetDbInfo()->GetLgWritingSystemFactory(&qwsf); AssertPtr(qwsf); ComBool fRTL = FALSE; CheckHr(qwsf->get_EngineOrNull(m_ws, &qws)); if (qws) CheckHr(qws->get_RightToLeft(&fRTL)); m_fRtl = bool(fRTL); }
/*---------------------------------------------------------------------------------------------- Make the root box. ----------------------------------------------------------------------------------------------*/ void TssEdit::MakeRoot(IVwGraphics * pvg, ILgWritingSystemFactory * pwsf, IVwRootBox ** pprootb) { AssertPtr(pvg); AssertPtrN(pwsf); AssertPtr(pprootb); *pprootb = NULL; IVwRootBoxPtr qrootb; qrootb.CreateInstance(CLSID_VwRootBox); CheckHr(qrootb->SetSite(this)); HVO hvo = khvoString; int frag = kfrString; // Set up a new view constructor. ComBool fRTL = FALSE; IWritingSystemPtr qws; Assert(pwsf == m_qwsf.Ptr()); CheckHr(pwsf->get_EngineOrNull(m_wsBase, &qws)); if (qws) CheckHr(qws->get_RightToLeft(&fRTL)); TssEditVcPtr qtevc; qtevc.Attach(NewObj TssEditVc(this, m_nEditable, m_fShowTags, fRTL)); CheckHr(m_qcda->putref_WritingSystemFactory(pwsf)); CheckHr(qrootb->putref_DataAccess(m_qcda)); AfMainWnd * pafw = MainWindow(); AssertPtrN(pafw); AfStylesheet * pss = NULL; AfLpInfo * plpi = pafw->GetLpInfo(); if (plpi) { pss = plpi->GetAfStylesheet(); // This allows it to receive updates to style defns. pafw->RegisterRootBox(qrootb); } IVwViewConstructor * pvvc = qtevc; CheckHr(qrootb->SetRootObjects(&hvo, &pvvc, &frag, pss, 1)); *pprootb = qrootb.Detach(); }
/*---------------------------------------------------------------------------------------------- Make an edit box to allow editing. hwnd is the parent hwnd. rc is the size of the child window. Store the hwnd and return true. @param hwnd @param rc @param dxpCursor @param fTopCursor @param tpte @return true if successful TODO: To handle extra long field contents (and RTL?) the button cannot be a child of the edit control, because they must occupy seperate rectangles inside the field proper. ----------------------------------------------------------------------------------------------*/ bool AfDeFeEdBoxBut::BeginEdit(HWND hwnd, Rect &rc, int dxpCursor, bool fTopCursor, TptEditable tpte) { if (!SuperClass::BeginEdit(hwnd, rc, dxpCursor, fTopCursor)) return false; DeEditPtr qde; qde.Create(); qde->SetEditable(tpte); qde->m_pdee = this; IActionHandler * pacth = BeginTempEdit(); ILgWritingSystemFactoryPtr qwsf; GetLpInfo()->GetDbInfo()->GetLgWritingSystemFactory(&qwsf); AssertPtr(qwsf); #if 1 int nRet = 0; ComBool fRTL = FALSE; IWritingSystemPtr qws; CheckHr(qwsf->get_EngineOrNull(m_ws, &qws)); if (qws) CheckHr(qws->get_RightToLeft(&fRTL)); if (fRTL) qde->Create(hwnd, kwidEditChild, WS_CHILD | ES_RIGHT | ES_AUTOHSCROLL, NULL, m_qtss, qwsf, m_ws, pacth); else #endif qde->Create(hwnd, kwidEditChild, WS_CHILD | ES_LEFT | ES_AUTOHSCROLL, NULL, m_qtss, qwsf, m_ws, pacth); m_hwnd = qde->Hwnd(); Rect rcT(rc.left + 2, rc.top + 1, rc.right, rc.bottom); nRet = ::MoveWindow(m_hwnd, rcT.left, rcT.top, rcT.Width(), rcT.Height(), true); #if 99-99 Rect rcParentClient; Rect rcParent; ::GetClientRect(hwnd, &rcParentClient); ::GetWindowRect(hwnd, &rcParent); Rect rcEdit; Rect rcEditClient; ::GetWindowRect(m_hwnd, &rcEdit); ::GetClientRect(m_hwnd, &rcEditClient); #endif Rect rcTb; ::GetClientRect(m_hwnd, &rcTb); rcTb.left = rcTb.right - 16; rcTb.bottom = rcTb.top + Min((int)rcTb.bottom - (int)rcTb.top, (int)kdxpButtonHeight); WndCreateStruct wcsButton; wcsButton.InitChild(_T("BUTTON"), m_hwnd, kwidEditChild); wcsButton.style |= WS_VISIBLE | BS_OWNERDRAW; wcsButton.SetRect(rcTb); DeButtonPtr qdb; qdb.Create(); qdb->CreateAndSubclassHwnd(wcsButton); qdb->m_pdee = this; m_hwndButton = qdb->Hwnd(); #if 1-1 // Resize the edit control window to exclude the button nRet = ::MoveWindow(m_hwnd, rcT.left, rcT.top, rcT.Width() - 18, rcT.Height(), true); #endif // Add text to the window. ::SendMessage(m_hwnd, FW_EM_SETSTYLE, m_chrp.clrBack, (LPARAM)&m_qfsp->m_stuSty); ::SendMessage(m_hwnd, EM_SETMARGINS, EC_RIGHTMARGIN | EC_LEFTMARGIN, MAKELPARAM(0, 18)); ::ShowWindow(m_hwnd, SW_SHOW); //::SendMessage(m_hwnd, WM_SETFONT, (WPARAM)::GetStockObject(DEFAULT_GUI_FONT), 0); // Foreground/background colors are set via WM_CTLCOLOREDIT in AfDeFeWnd. // Set cursor to desired offset. //int ich; //ich = LOWORD(::SendMessage(m_hwnd, EM_CHARFROMPOS, 0, dxpCursor)); // For some reason the above always comes back with -1 instead of the correct index. // Is this a bug in TssEdit or am I doing something wrong? //::SendMessage(m_hwnd, EM_SETSEL, ich, ich); //::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); // Send LButton to place cursor in edit ctrl. #if 99-99 Rect rcEditNew; Rect rcEditNewClient; Rect rcBut; Rect rcButClient; ::GetWindowRect(m_hwnd, &rcEditNew); ::GetClientRect(m_hwnd, &rcEditNewClient); ::GetWindowRect(m_hwndButton, &rcBut); ::GetClientRect(m_hwndButton, &rcButClient); #endif return true; }