dockmgr.c

来自「CC386 is a general-purpose 32-bit C comp」· C语言 代码 · 共 2,063 行 · 第 1/5 页

C
2,063 行
字号

void dmgrAddGrip(CCW_params *p)
{
    grips[gripMax++] = p;
}

//-------------------------------------------------------------------------

void dmgrAddContainer(CCW_params *p)
{
    containers[containerMax++] = p;
}

//-------------------------------------------------------------------------

void dmgrStartMoveClient(CCW_params *p, LPARAM lParam)
{
    RECT r;
    int i;
    CCD_params *d = FindParams(p, 0);
    GetFrameWindowRect(&r);
    ClipCursor(&r);

    movept.x = (long)(short)LOWORD(lParam);
    movept.y = (long)(short)HIWORD(lParam);
    ClientToScreen(p->parent, &movept);

    for (i = 0; i < currentWindows; i++)
    {
        GetWindowRect(cache[i]->parent, &docks[i]->position);
        if (!docks[i]->flags)
            docks[i]->oldsize = docks[i]->position;
    }

    moverect = d->oldsize;
    OffsetRect(&moverect,  - moverect.left,  - moverect.top);
    OffsetRect(&moverect, d->position.left, d->position.top);

    moving = 1, drawnbound = 1;
    DrawBoundingRect(&moverect);
    lastSuggestedDock = d->flags &~DOCK_PRESENT;
}

//-------------------------------------------------------------------------

void dmgrMoveClient(CCW_params *p, LPARAM lParam, int grip)
{
    RECT r = moverect;
    POINT temppt;
    RECT r1;
    POINT adjust;
    int adj;
    int newcurs = 0;
    temppt.x = (long)(short)LOWORD(lParam);
    temppt.y = (long)(short)HIWORD(lParam);
    if (grip)
        ClientToScreen(p->parent, &temppt);
    else
        ClientToScreen(p->self, &temppt);
    OffsetRect(&r, temppt.x - movept.x, temppt.y - movept.y);
    adjust.x = adjust.y = 0;
    GetFrameWindowRect(&r1);

    if (r1.right < r.right)
    {
        adj = r1.right - r.right;
        r.left += adj;
        r.right += adj;
        adjust.x += adj;
        newcurs++;
    }
    else if (r1.left > r.left)
    {
        adj = r1.left - r.left;
        r.left += adj;
        r.right += adj;
        adjust.x += adj;
        newcurs++;
    }
    if (r1.bottom < r.bottom)
    {
        adj = r1.bottom - r.bottom;
        r.top += adj;
        r.bottom += adj;
        adjust.y += adj;
        newcurs++;
    }
    else if (r1.top > r.top)
    {
        adj = r1.top - r.top;
        r.top += adj;
        r.bottom += adj;
        adjust.y += adj;
        newcurs++;
    }

    CalculateMoveableDocks(p, &r, &temppt);
    if (drawnbound)
        DrawBoundingRect(&lastbound);
    DrawBoundingRect(&r);

}

//-------------------------------------------------------------------------

void dmgrStartSizeClient(CCW_params *p, int oncursor, LPARAM lParam)
{
    RECT r;
    GetClientWindowRect(&r);
    ClipCursor(&r);
    movept.x = (long)(short)LOWORD(lParam);
    movept.y = (long)(short)HIWORD(lParam);
    ClientToScreen(p->parent, &movept);
    curstype = oncursor;
    GetWindowRect(p->parent, &moverect);

    sizing = 1, drawnbound = 0;
}

//-------------------------------------------------------------------------

void dmgrSizeClient(CCW_params *p, LPARAM lParam)
{
    POINT temppt;
    RECT r = moverect;
    temppt.x = (long)(short)LOWORD(lParam);
    temppt.y = (long)(short)HIWORD(lParam);
    ClientToScreen(p->self, &temppt);
    switch (curstype)
    {
        case HTRIGHT:
            r.right += temppt.x - movept.x;
            if (r.right - r.left < MIN_WIDTH)
                r.right = r.left + MIN_WIDTH;
            break;
        case HTLEFT:
            r.left += temppt.x - movept.x;
            if (r.right - r.left < MIN_WIDTH)
                r.left = r.right - MIN_WIDTH;
            break;
        case HTTOP:
            r.top += temppt.y - movept.y;
            if (r.bottom - r.top < MIN_WIDTH)
                r.top = r.bottom - MIN_WIDTH;
            break;
        case HTBOTTOM:
            r.bottom += temppt.y - movept.y;
            if (r.bottom - r.top < MIN_WIDTH)
                r.bottom = r.top + MIN_WIDTH;
            break;
        case HTTOPRIGHT:
            r.top += temppt.y - movept.y;
            if (r.bottom - r.top < MIN_WIDTH)
                r.top = r.bottom - MIN_WIDTH;
            r.right += temppt.x - movept.x;
            if (r.right - r.left < MIN_WIDTH)
                r.right = r.left + MIN_WIDTH;
            break;
        case HTTOPLEFT:
            r.top += temppt.y - movept.y;
            if (r.bottom - r.top < MIN_WIDTH)
                r.bottom = r.top + MIN_WIDTH;
            r.left += temppt.x - movept.x;
            if (r.right - r.left < MIN_WIDTH)
                r.left = r.right - MIN_WIDTH;
            break;
        case HTBOTTOMRIGHT:
            r.bottom += temppt.y - movept.y;
            if (r.bottom - r.top < MIN_WIDTH)
                r.top = r.bottom - MIN_WIDTH;
            r.right += temppt.x - movept.x;
            if (r.right - r.left < MIN_WIDTH)
                r.right = r.left + MIN_WIDTH;
            break;
        case HTBOTTOMLEFT:
            r.bottom += temppt.y - movept.y;
            if (r.bottom - r.top < MIN_WIDTH)
                r.bottom = r.top + MIN_WIDTH;
            r.left += temppt.x - movept.x;
            if (r.right - r.left < MIN_WIDTH)
                r.left = r.right - MIN_WIDTH;
            break;
    }

    if (drawnbound)
        DrawBoundingRect(&lastbound);
    DrawBoundingRect(&r);
}

//-------------------------------------------------------------------------

void dmgrEndMoveSizeClient(CCW_params *p, LPARAM lParam)
{
    int i;
    if (sizing == 0 && moving == 0)
        return ;
    if (drawnbound)
    {
        DrawBoundingRect(&lastbound);
        if (moving)
        {
            DoDocks(p);
            PostMessage(hwndSourceTab, WM_RESETTABS, 0, 0);
        }
        else
            PutWindow(p->parent, &lastbound);
    }
    moving = sizing = 0;
    ClipCursor(0);
}

//-------------------------------------------------------------------------

int dmgrStartMoveGrip(CCW_params *p, LPARAM lParam)
{
    CCW_params *p1 = (CCW_params*)GetWindowLong(p->u.gp.child, 0);
    dmgrStartMoveClient(p1, lParam);
    dmgrMoveClient(p1, lParam, TRUE);
}

//-------------------------------------------------------------------------

int dmgrMoveGrip(CCW_params *p, LPARAM lParam)
{
    CCW_params *p1 = (CCW_params*)GetWindowLong(p->u.gp.child, 0);
    dmgrMoveClient(p1, lParam, TRUE);
}

//-------------------------------------------------------------------------

int dmgrEndMoveGrip(CCW_params *p, LPARAM lParam)
{
    CCW_params *p1 = (CCW_params*)GetWindowLong(p->u.gp.child, 0);
    dmgrEndMoveSizeClient(p1, lParam);
}

//-------------------------------------------------------------------------

int dmgrDocked(CCW_params *p)
{
    CCD_params *d = FindParams(p, 0);
    if (d)
    {
        return !!(d->flags &DOCK_PRESENT);
    }
    return FALSE;
}

//-------------------------------------------------------------------------

int dmgrSizeBarStartMove(CFW_params *p, LPARAM lParam)
{
    int i;
    RECT r;
    GetWindowRect(p->self, &moverect);
    movept.x = (long)(short)LOWORD(lParam);
    movept.y = (long)(short)HIWORD(lParam);
    ClientToScreen(p->self, &movept);
    drawnbound = FALSE;
    for (i = 0; i < frameCount; i++)
    {
        GetWindowRect(frames[i]->self, &frames[i]->position);
    }
    for (i = 0; i < currentWindows; i++)
    {
        GetWindowRect(cache[i]->parent, &docks[i]->position);
    }
    CalculateSizebarBounds(p, &r);
    ClipCursor(&r);
    drawnbound = 1;
    DrawBoundingRect(&p->position);
}

//-------------------------------------------------------------------------

int dmgrSizeBarMove(CFW_params *p, LPARAM lParam)
{
    POINT temp;
    RECT r = moverect;
    temp.x = (long)(short)LOWORD(lParam);
    temp.y = (long)(short)HIWORD(lParam);
    ClientToScreen(p->self, &temp);

    if (!p->vertical)
        OffsetRect(&r, 0, temp.y - movept.y);
    else
        OffsetRect(&r, temp.x - movept.x, 0);
    if (drawnbound)
        DrawBoundingRect(&lastbound);
    DrawBoundingRect(&r);
}

//-------------------------------------------------------------------------

int dmgrSizeBarEndMove(CFW_params *p)
{
    ClipCursor(0);

    Resize(p, &lastbound);
    if (drawnbound)
        DrawBoundingRect(&lastbound);
    drawnbound = 0;
}

//-------------------------------------------------------------------------

int dmgrFlex(CCW_params *p)
{
    int index;
    CCD_params *d;
    d = FindParams(p, &index);
    d->flexparams |= p->u.cw.flexed ? FLEX_UNREQ : FLEX_REQ;
    CalculateLayout( - 1, 0);
}

//-------------------------------------------------------------------------

int dmgrSizeFrame(void)
{
    int i;
    for (i = 0; i < currentWindows; i++)
    {
        GetWindowRect(cache[i]->parent, &docks[i]->position);
    }
    CalculateLayout( - 1, 0);
}

//-------------------------------------------------------------------------

int dmgrGetHiddenState(int id)
{
    int i;
    for (i = 0; i < currentWindows; i++)
        if (cache[i]->id == id)
            return docks[i]->hidden;
    return FALSE;
}

//-------------------------------------------------------------------------

int dmgrHideWindow(int id, int state)
{

    int oldstate = 0;
    CCW_params *p = 0;
    CCD_params *d = 0;
    int i, index;
    for (i = 0; i < currentWindows; i++)
    {
        if (cache[i]->id == id)
        {
            p = cache[i];
            d = docks[i];
            index = i;
            break;
        }
    }
    if (p)
    {
        oldstate = !d->hidden;
        if (state != d->hidden)
        {
            d->hidden = state;
            if (d->flags)
                CalculateHidden(d, index, state);
            ShowWindow(p->parent, state ? SW_HIDE : SW_SHOW);
            if (d->flags)
                CalculateLayout( - 1, 0);
            SendMessage(hwndSourceTab, WM_RESETTABS, 0, 0);
        }
        if (!state)
            SetFocus(p->parent);
    }
    return oldstate;
}

//-------------------------------------------------------------------------

void PutWindow(HWND hwnd, RECT *r)
{
    RECT r1, r2 =  *r;
    if (GetParent(hwnd) == hwndClient)
        GetWindowRect(hwndClient, &r1);
    else
        GetFrameWindowRect(&r1);
    OffsetRect(&r2,  - r1.left,  - r1.top);
    InvalidateRect(hwnd, 0, 0);
    MoveWindow(hwnd, r2.left, r2.top, r2.right - r2.left, r2.bottom - r2.top, 1)
        ;
}

//-------------------------------------------------------------------------

#define HYSTER(x,y) ((x)-(y) < 10 && (x)-(y) > -10)
void CalculateMoveableDocks(CCW_params *p, RECT *r, POINT *cursor)
{
    int i, fit =  - 1, fitwidth = 0, index, j;
    CCD_params *d = FindParams(p, &index);
    RECT r1, r2, r3;
    GetFrameWindowRect(&r3);
    GetClientWindowRect(&r1);
    suggestedDock = 0;

    if (HYSTER(cursor->x, r1.left))
    {
        r->top = r1.top;
        r->left = r1.left;
        if (p->type == LSTOOLBAR)
        {
            r->bottom = r->top + p->u.tb.vsize.cy + GRIPWIDTH;
            r->right = r->left + p->u.tb.vsize.cx;
        }
        else

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?