ultimatepp/uppsrc/RichEdit/ColumnPopUp.cpp
2025-09-14 19:53:26 +02:00

88 lines
No EOL
1.5 KiB
C++

#include "RichEdit.h"
namespace Upp {
ColumnPopUp::ColumnPopUp()
{
SetFrame(BlackFrame());
}
void ColumnPopUp::Paint(Draw& w)
{
int ii = 0;
int y = 0;
while(ii < count || ii == 0) {
for(int x = 0; x < columns; x++) {
w.Clipoff(x * isz.cx, y * isz.cy, isz.cx, isz.cy);
w.DrawRect(isz, ii == cursor ? SColorHighlight() : SColorPaper());
if(ii < count)
WhenPaintItem(w, isz, ii, ii == cursor);
w.End();
ii++;
}
y++;
}
}
void ColumnPopUp::MouseMove(Point p, dword keyflags)
{
int ii = p.x / isz.cx + p.y / isz.cy * columns;
if(ii < 0 || ii >= count)
ii = -1;
if(ii != cursor) {
cursor = ii;
Refresh();
}
}
void ColumnPopUp::LeftUp(Point, dword keyflags)
{
if(cursor >= 0)
WhenSelect(cursor);
Close();
}
void ColumnPopUp::MouseLeave()
{
cursor = -1;
Refresh();
}
void ColumnPopUp::PopUp(const Rect& sr, Ctrl *owner)
{
if(IsOpen())
Close();
Size sz = AddFrameSize(columns * isz.cx, (count + columns - 1) / columns * isz.cy);
Point p = sr.BottomLeft();
Rect r = owner ? owner->GetWorkArea() : GetWorkArea();
if(p.x + sz.cx > r.right)
p.x = max(r.right - sz.cx, 0);
if(p.y + sz.cy > r.bottom)
p.y = max(sr.top - sz.cy, 0);
SetRect(p.x, p.y, sz.cx, sz.cy);
Ctrl::PopUp(owner);
}
int ColumnPopUp::Execute(const Rect& sr, Ctrl *owner)
{
PopUp(sr, owner);
EventLoop(this);
if(IsOpen())
Close();
return cursor;
}
int ColumnPopUp::Execute()
{
Point p = GetMousePos();
return Execute(Rect(p, p), GetActiveCtrl());
}
void ColumnPopUp::Deactivate()
{
Close();
IgnoreMouseClick();
cursor = Null;
}
};