ultimatepp/uppsrc/CtrlLib/PopupTable.cpp
mdelfede d2b54f7989 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

136 lines
2.5 KiB
C++

#include "CtrlLib.h"
NAMESPACE_UPP
CH_VALUE(DropEdge, ChBorder(BlackBorder()));
CtrlFrame& DropFrame()
{
static LookFrame m(DropEdge);
return m;
}
void PopUpTable::CancelMode() {
if(open) {
DoClose();
WhenCancel();
}
ArrayCtrl::CancelMode();
}
void PopUpTable::DoClose() {
open = false;
Close();
}
void PopUpTable::Deactivate() {
if(open) {
DoClose();
IgnoreMouseClick();
WhenCancel();
}
}
void PopUpTable::LeftUp(Point p, dword keyflags) {
ArrayCtrl::LeftUp(p, keyflags);
DoClose();
WhenSelect();
}
bool PopUpTable::Key(dword key, int n) {
switch(key) {
case K_ENTER:
case K_ALT_DOWN:
DoClose();
WhenSelect();
return true;
case K_ESCAPE:
DoClose();
WhenCancel();
return true;
case K_UP:
if(!IsCursor()) {
SetCursor(GetCount() - 1);
return true;
}
break;
case K_DOWN:
if(!IsCursor()) {
SetCursor(0);
return true;
}
break;
}
return ArrayCtrl::Key(key, n);
}
void PopUpTable::PopUp(Ctrl *owner, int x, int top, int bottom, int width) {
DoClose();
int h = AddFrameSize(width, min(droplines * GetLineCy(), GetTotalCy())).cy;
Rect rt = RectC(x, bottom, width, h);
Rect area = Ctrl::GetWorkArea();
bool up = false;
if(rt.bottom > area.bottom) {
up = true;
rt.top = top - h;
rt.bottom = rt.top + h;
}
open = false;
Ctrl popup;
if(GUI_PopUpEffect()) {
if(up) {
popup.SetRect(Rect(rt.left, rt.bottom - 1, rt.right, rt.bottom));
popup.Add(TopPos(0, rt.Height()).LeftPos(0, rt.Width()));
}
else {
popup.SetRect(Rect(rt.left, rt.top, rt.right, rt.top + 1));
popup.Add(BottomPos(0, rt.Height()).LeftPos(0, rt.Width()));
}
CenterCursor();
popup.PopUp(owner, true, true, GUI_DropShadows());
SetFocus();
Ctrl::ProcessEvents();
Animate(popup, rt, GUIEFFECT_SLIDE);
Ctrl::Remove();
}
CenterCursor();
SetRect(rt);
Ctrl::PopUp(owner, true, true, GUI_DropShadows());
SetFocus();
open = true;
}
void PopUpTable::PopUp(Ctrl *owner, int width)
{
Rect r = owner->GetScreenRect();
r.right = r.left + width;
PopUp(owner, r.left, r.top, r.bottom, width);
}
void PopUpTable::PopUp(Ctrl *owner)
{
Rect r = owner->GetScreenRect();
PopUp(owner, r.left, r.top, r.bottom, r.Width());
}
void PopUpTable::Normal()
{
AddColumn().Accel();
NoHeader();
HeaderTab(0).SetMargin(0);
MouseMoveCursor();
NoGrid();
AutoHideSb();
SetLineCy(Draw::GetStdFontCy());
NoPopUpEx();
}
PopUpTable::PopUpTable() {
SetFrame(DropFrame());
droplines = 16;
open = false;
}
PopUpTable::~PopUpTable() {}
END_UPP_NAMESPACE