void TABLE::DestroyEditControl() { if(hEdit) { // Get the rectangle of the cell for intelligent update RECT cellRect; GetWindowRect(hEdit, &cellRect); ScreenToClient(hTable, (POINT*)&cellRect); ScreenToClient(hTable, (POINT*)&cellRect.right); cellRect.left -= COLUMN::CellCharWidth(editCol); cellRect.top = cellRect.bottom - TABLE_ATTRIBUTES::CellHeight(); cellRect.right += COLUMN::CellCharWidth(editCol); // un-subclass the control in preparation for destroy RemoveProp(hEdit, "loPtr"); RemoveProp(hEdit, "hiPtr"); RemoveProp(hEdit, "number"); SetWindowLong(hEdit, GWL_WNDPROC, (long)oldEditControlProc); // get the text and update the cell as necessary WORD len = (WORD)SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0L)+1; char* buffer = new char[len]; SendMessage(hEdit, WM_GETTEXT, (WPARAM)(len+1), (LPARAM)buffer); RUNTIMEINFO* rtime = (RUNTIMEINFO*)AObjGetRuntimeInfo(theObject); ROW* row = rtime->GetRow(); if(hstrcmp(row->GetCell(editRow, editCol, FALSE, NULL), buffer)) { row->SetCell(editRow, editCol, buffer); TABLE_ATTRIBUTES::SetEditRow(editRow); TABLE_ATTRIBUTES::SetEditColumn(editCol); PostObjectChanged(CHANGED_FULLREDRAW); AEvtPostSignalAtMark(theObject, SIGNAL_TABLEEDITED); } delete buffer; // destroy the window DestroyWindow(hEdit); hEdit = NULL; DeleteObject(hEditFont); AEvtPostSignalAtMark(theObject, SIGNAL_STOPEDITING); // make sure the proper region is redrawn InvalidateRect(hTable, &cellRect, FALSE); UpdateWindow(hTable); // wipPreventThieves(ParentID, FALSE); SKJ need replacement } }
void TABLE::CreateEditControl() { if(hEdit || TABLE_ATTRIBUTES::AutoFill() || !TABLE_ATTRIBUTES::CanActivate()) return; long activeRow = TABLE_ATTRIBUTES::ActiveRow(); if(activeRow<0) return; if((activeRow<firstRow) || (activeRow>(firstRow+numVisRows-1))) return; int activeCol = TABLE_ATTRIBUTES::ActiveColumn(); if(!COLUMN::CanEdit(activeCol)) return; RUNTIMEINFO* rtime = (RUNTIMEINFO*)AObjGetRuntimeInfo(theObject); ROW* row = rtime->GetRow(); if(!row->IsSelected(activeRow)) return; int width = COLUMN::ColumnWidth(activeCol); if(width==0) return; int height = TABLE_ATTRIBUTES::CellHeight(); if(TABLE_ATTRIBUTES::RowLines()) height++; int cellY = tblRect.top + ((int)(activeRow - firstRow))*height; if(TABLE_ATTRIBUTES::ShowTitles()) { cellY += (TABLE_ATTRIBUTES::TitleHeight()+1); if(TABLE_ATTRIBUTES::RowLines()) cellY++; } if(TABLE_ATTRIBUTES::RowLines()) height--; int cellX = tblRect.left; for(int i=0; i<activeCol; i++) { if((i>=TABLE_ATTRIBUTES::NumFixedColumns()) && (i<firstColumn)) continue; if(COLUMN::ColumnWidth(i)==0) { if((i==(TABLE_ATTRIBUTES::NumFixedColumns()-1)) && (cellX!=tblRect.left)) cellX++; continue; } cellX += COLUMN::ColumnWidth(i); if(TABLE_ATTRIBUTES::ColumnLines()) cellX++; if(i==(TABLE_ATTRIBUTES::NumFixedColumns()-1)) cellX++; } HDC hDC = GetDC(hTable); HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_WINDOW)); LOGBRUSH lb = {BS_SOLID, GetSysColor(COLOR_WINDOW), 0}; HPEN oldPen = (HPEN)SelectObject(hDC, hPen); HBRUSH hBrush = CreateBrushIndirect(&lb); HBRUSH oldBrush = (HBRUSH)SelectObject(hDC, hBrush); int right = cellX+width; if(right>tblRect.right) right = tblRect.right; Rectangle(hDC, cellX, cellY, right, cellY+height); SelectObject(hDC, oldPen); DeleteObject(hPen); SelectObject(hDC, oldBrush); DeleteObject(hBrush); ReleaseDC(hParentWnd, hDC); cellX += COLUMN::CellCharWidth(activeCol); width -= 2*COLUMN::CellCharWidth(activeCol); if((cellX+width)>tblRect.right) width = tblRect.right - cellX; int offset = 2*TABLE_ATTRIBUTES::CellLeading()/3 + TABLE_ATTRIBUTES::CellAscent() - COLUMN::CellAscent(activeCol); cellY = cellY + offset; height = TABLE_ATTRIBUTES::CellHeight() - offset; editRow = activeRow; editCol = activeCol; char huge* cellPtr = row->GetCell(activeRow, activeCol, FALSE, NULL); UINT length = (UINT)hstrlen(cellPtr) + 1; char* cellStr = new char[length]; hmemcpy(cellStr, cellPtr, length); hEdit = CreateWindow("EDIT", cellStr, WS_CHILD | ES_AUTOHSCROLL, cellX, cellY, width, height, hTable, (HMENU)3, G.hInstance, NULL); delete cellStr; // subclass the edit control SetProp(hEdit, "loPtr", (HANDLE)LOWORD((DWORD)this)); SetProp(hEdit, "hiPtr", (HANDLE)HIWORD((DWORD)this)); SetProp(hEdit, "number", (HANDLE)AObjCheckType(COLUMN::GetObjectID(activeCol), OTYPE_NUMBER)); oldEditControlProc = (WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC); SetWindowLong(hEdit, GWL_WNDPROC, (long)EditControlProc); ShowWindow(hEdit, SW_SHOW); hEditFont =CreateFontIndirect(COLUMN::CellLogFont(activeCol)); SendMessage(hEdit, WM_SETFONT, (WPARAM)hEditFont, MAKELPARAM(TRUE, 0)); SetFocus(hEdit); SendMessage(hEdit, EM_SETSEL, (WPARAM)FALSE, MAKELPARAM(0, -1)); // wipPreventThieves(ParentID, TRUE); SKJ --> need replacement AEvtPostSignalAtMark(theObject, SIGNAL_STARTEDITING); }