void DropChoice::Drop() { if(!owner || owner->IsReadOnly() && !rodrop || list.GetCount() == 0 && !WhenDrop) return; WhenDrop(); if(dropfocus) owner->SetWantFocus(); if(!list.FindSetCursor(owner->GetData()) && list.GetCount() > 0) list.SetCursor(0); list.PopUp(owner,dropwidth); }
void DropGrid::Drop() { if(!IsEditable()) return; WhenDrop(); GridDisplay &dsp = list.GetDisplay(); if(!header) { list.HideRow(0, false); dsp.SetHorzMargin(2, 2); } else dsp.SetHorzMargin(); list.UpdateRows(true); //TODO: try to avoid it.. Rect rs = GetScreenRect(); int width = rs.Width(); int resize_height = list.GetResizePanelHeight(); int list_height = max(list.GetHeight(), list.GD_ROW_HEIGHT + list.GD_HDR_HEIGHT * header); int height = list_height + 4 + resize_height; int drop_height = drop_lines * list.GD_ROW_HEIGHT + header * list.GD_HDR_HEIGHT + 4 + resize_height; if(!display_all && height > drop_height) height = drop_height; list.resize_panel.SetMinSize(Size(width, height)); if(list_width > width) width = list_width; if(display_all && list_height > height) //check this height = list_height; Rect rw = Ctrl::GetWorkArea(); Rect r; r.left = rs.left; r.right = rs.left + width; r.top = rs.bottom; r.bottom = rs.bottom + height; if(r.bottom > rw.bottom) { r.top = rs.top - height; r.bottom = rs.top; } if(r.right > rw.right) { int diff; if(rs.right <= rw.right) diff = rs.right - r.right; else diff = rw.right - r.right; r.left += diff; r.right += diff; } if(r.left < rw.left) { int diff = rw.left - r.left; r.left += diff; r.right += diff; } if(searching) list.ClearFound(); list.PopUp(this, r); list.CenterCursor(); }