예제 #1
0
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
    }
  }
예제 #2
0
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);
  }