dockmgr.c
来自「CC386 is a general-purpose 32-bit C comp」· C语言 代码 · 共 2,063 行 · 第 1/5 页
C
2,063 行
->position.top;
if (docks[windows[i]]->flexparams &(FLEX_LARGE | FLEX_SMALL))
docks[windows[i]]->position = docks[windows[i]]->flexposition;
}
if (actualsize != framesize && actualsize)
{
multiply = 1000 * framesize / actualsize;
}
for (i = 0; i < wincount; i++)
{
docks[windows[i]]->position.left -= adj;
docks[windows[i]]->position.right -= adj;
if (cache[windows[0]]->type == LSTOOLBAR)
{
currenttop = docks[windows[i]]->position.top - oldclient->top +
client->top;
if (currenttop < client->top || currenttop >= client->bottom -
GRIPWIDTH)
if (i = 0)
currenttop = client->top;
else
currenttop = docks[windows[i - 1]]->position.bottom;
if (i > 0 && currenttop < docks[windows[i - 1]]->position.bottom)
currenttop = docks[windows[i - 1]]->position.bottom;
newbottom = currenttop + cache[windows[i]]->u.tb.vsize.cy +
GRIPWIDTH;
docks[windows[i]]->position.bottom = newbottom;
}
else
{
newbottom = docks[windows[i]]->position.bottom = currenttop +
(docks[windows[i]]->position.bottom - docks[windows[i]]
->position.top) *multiply / 1000;
}
docks[windows[i]]->position.top = currenttop;
currenttop = newbottom;
if (cache[windows[0]]->type != LSTOOLBAR)
currenttop += FRAMEWIDTH;
}
if (cache[windows[0]]->type != LSTOOLBAR)
docks[windows[wincount - 1]]->position.bottom = client->bottom;
if (wincount == 1)
{
SendMessage(cache[windows[0]]->self, LCF_SETFLEX, 0, wincount != 1);
}
else
{
for (i = 0; i < wincount; i++)
{
if (docks[windows[i]]->flexparams &FLEX_UNREQ)
{
for (j = 0; j < wincount; j++)
docks[windows[j]]->flexparams = 0;
break;
}
else if (docks[windows[i]]->flexparams &FLEX_REQ)
{
for (j = 0; j < wincount; j++)
docks[windows[j]]->flexparams = FLEX_SMALL;
docks[windows[i]]->flexparams = FLEX_LARGE;
break;
}
docks[windows[i]]->flexparams &= ~(FLEX_UNREQ | FLEX_REQ);
}
if (docks[windows[0]]->flexparams &(FLEX_SMALL | FLEX_LARGE))
{
framesize -= (wincount - 1) *MIN_SIZE;
currenttop = client->top;
for (i = 0; i < wincount; i++)
if (docks[windows[i]]->flexparams &FLEX_LARGE)
break;
if (i < wincount)
for (i = 0; i < wincount; i++)
{
docks[windows[i]]->flexposition = docks[windows[i]]->position;
docks[windows[i]]->position.top = currenttop;
if (docks[windows[i]]->flexparams &FLEX_LARGE)
currenttop = docks[windows[i]]->position.bottom =
currenttop + framesize;
else
currenttop = docks[windows[i]]->position.bottom =
currenttop + MIN_SIZE;
currenttop += FRAMEWIDTH;
}
else
for (i = 0; i < wincount; i++)
docks[windows[i]]->flexparams = 0;
}
for (i = 0; i < wincount; i++)
{
SendMessage(cache[windows[i]]->self, LCF_SETFLEX, docks[windows[i]]
->flexparams &FLEX_LARGE ? 1 : 0, wincount != 1);
if (i != wincount - 1 && cache[windows[i]]->type != LSTOOLBAR)
InsertHorizFrame(windows[i], 0, 0);
}
}
if (cache[windows[0]]->type == LSTOOLBAR)
{
int top = client->top;
RECT r = docks[windows[0]]->position;
for (i = 0; i < wincount; i++)
{
if (top < docks[windows[i]]->position.top)
{
r.top = top;
r.bottom = docks[windows[i]]->position.top;
AllocBlank(&r, docks[windows[0]], FALSE);
}
top = docks[windows[i]]->position.bottom;
}
if (top < client->bottom)
{
r.top = top;
r.bottom = client->bottom;
AllocBlank(&r, docks[windows[0]], FALSE);
}
}
}
//-------------------------------------------------------------------------
void InsertVertFrame(int index, int left, RECT *fullframe)
{
RECT r, r1;
CCD_params *d = docks[index];
GetFrameWindowRect(&r1);
if (left)
{
r.right = d->position.left;
r.left = d->position.left - FRAMEWIDTH;
}
else
{
r.left = d->position.right;
r.right = d->position.right + FRAMEWIDTH;
}
if (fullframe)
{
r.top = fullframe->top;
r.bottom = fullframe->bottom;
}
else
{
r.top = d->position.top;
r.bottom = d->position.bottom;
}
OffsetRect(&r, - r1.left, - r1.top);
if (frameCount >= frameMax)
{
CreateFrameWindow(hwndFrame, &r, TRUE);
frameCount++;
}
else
{
frames[frameCount]->vertical = TRUE;
frames[frameCount]->position = r;
InvalidateRect(frames[frameCount]->self, 0, 0);
MoveWindow(frames[frameCount++]->self, r.left, r.top, r.right - r.left,
r.bottom - r.top, 1);
}
}
//-------------------------------------------------------------------------
void InsertHorizFrame(int index, int top, int fullframe)
{
RECT r, r1;
CCD_params *d = docks[index];
GetFrameWindowRect(&r1);
if (top)
{
r.top = d->position.top - FRAMEWIDTH;
r.bottom = d->position.top;
}
else
{
r.top = d->position.bottom;
r.bottom = d->position.bottom + FRAMEWIDTH;
}
if (fullframe)
{
r.left = r1.left;
r.right = r1.right;
}
else
{
r.left = d->position.left;
r.right = d->position.right;
}
OffsetRect(&r, - r1.left, - r1.top);
if (frameCount >= frameMax)
{
CreateFrameWindow(hwndFrame, &r, FALSE);
frameCount++;
}
else
{
frames[frameCount]->vertical = FALSE;
frames[frameCount]->position = r;
InvalidateRect(frames[frameCount]->self, 0, 0);
MoveWindow(frames[frameCount++]->self, r.left, r.top, r.right - r.left,
r.bottom - r.top, 1);
}
}
//-------------------------------------------------------------------------
void ShowFrames(void)
{
int i;
for (i = 0; i < frameCount; i++)
{
SetWindowPos(frames[i]->self, HWND_TOP, frames[i]->position.left,
frames[i]->position.top, frames[i]->position.right - frames[i]
->position.left, frames[i]->position.bottom - frames[i]
->position.top, SWP_SHOWWINDOW);
InvalidateRect(frames[i]->self, 0, 0);
}
// ShowWindow(frames[i]->self,SW_SHOW) ;
for (i = frameCount; i < frameMax; i++)
ShowWindow(frames[i]->self, SW_HIDE);
}
//-------------------------------------------------------------------------
void CalculateLayout(int index, int recalhidden)
{
int i, j, pos, indexmax, min, adj2, found, hidden, totalsize;
int windows[30], wincount, hwindows[30], hwincount;
int srctabheight;
RECT r1, r2, temp, client, oldclient;
GetWindowRect(hwndClient, &r1);
GetFrameWindowRect(&r2);
client = r2;
oldclient = r1;
oldclient.top -= SendMessage(hwndSourceTab, WM_GETHEIGHT, 0, 0);
if (rundown)
return ;
blankCount = 0;
frameCount = 0;
if (index >= 0)
docks[index]->rowindex = - 1;
if (index >= 0 && (docks[index]->flags &DOCK_TOP))
InsertRow(index, DOCK_TOP);
indexmax = - 1;
for (i = 0, min = - 1; i < currentWindows; i++)
if (docks[i]->flags &DOCK_TOP)
{
if (docks[i]->rowindex > indexmax)
indexmax = docks[i]->rowindex;
}
adj2 = 0;
for (i = 0; i <= indexmax; i++)
{
found = FALSE, hidden = FALSE;
hwincount = 0;
wincount = 0;
for (j = 0; j < currentWindows; j++)
if ((docks[j]->flags &DOCK_TOP) && docks[j]->rowindex == i)
{
docks[j]->rowindex -= adj2;
if (!docks[j]->hidden)
{
found = TRUE;
min = docks[j]->position.top;
if (j != index)
windows[wincount++] = j;
}
else
hidden = TRUE;
hwindows[hwincount++] = j;
}
if (!found)
{
if (!hidden)
adj2++;
continue;
}
OrderLeftRight(windows, wincount, FALSE);
if (index >= 0 && docks[index]->rowindex == i - adj2 && (docks[index]
->flags &DOCK_TOP) && !docks[index]->hidden)
{
wincount += InsertLeftRight(windows, wincount, index, &r2, min);
HideAdjLeftRight(hwindows, hwincount, index);
index = - 1;
}
SizeLeftRight(windows, wincount, min - client.top, &r2);
if (recalhidden)
{
totalsize = 0;
for (j = 0; j < wincount; j++)
{
totalsize += docks[j]->hiddenwidth = (docks[j]->position.right
- docks[j]->position.left) *1000;
}
for (j = 0; j < hwincount; j++)
{
if (docks[j]->hidden)
{
docks[j]->hiddenwidth = totalsize / wincount;
}
}
}
for (j = 0; j < wincount; j++)
docks[windows[j]]->colindex = j;
if (cache[windows[0]]->type != LSTOOLBAR)
{
InsertHorizFrame(windows[0], 0, 1);
client.top = FRAMEWIDTH;
}
else
client.top = 0;
client.top += docks[windows[0]]->position.bottom;
}
if (index >= 0 && (docks[index]->flags &DOCK_BOTTOM))
InsertRow(index, DOCK_BOTTOM);
indexmax = - 1;
for (i = 0, min = - 1; i < currentWindows; i++)
if (docks[i]->flags &DOCK_BOTTOM)
{
if (docks[i]->rowindex > indexmax)
indexmax = docks[i]->rowindex;
}
adj2 = 0;
for (i = 0; i <= indexmax; i++)
{
found = FALSE, hidden = FALSE;
hwincount = 0;
wincount = 0;
for (j = 0; j < currentWindows; j++)
if ((docks[j]->flags &DOCK_BOTTOM) && docks[j]->rowindex == i)
{
docks[j]->rowindex -= adj2;
if (!docks[j]->hidden)
{
found = TRUE;
min = docks[j]->position.bottom;
if (j != index)
windows[wincount++] = j;
}
else
hidden = TRUE;
hwindows[hwincount++] = j;
}
if (!found)
{
if (!hidden)
adj2++;
continue;
}
OrderLeftRight(windows, wincount, FALSE);
if (index >= 0 && docks[index]->rowindex == i - adj2 && (docks[index]
->flags &DOCK_BOTTOM) && !docks[index]->hidden)
{
wincount += InsertLeftRight(windows, wincount, index, &r2, min);
HideAdjLeftRight(hwindows, hwincount, index);
index = - 1;
}
SizeLeftRight(windows, wincount, min - client.bottom, &r2);
if (recalhidden)
{
totalsize = 0;
for (j = 0; j < wincount; j++)
{
totalsize += docks[j]->hiddenwidth = (docks[j]->position.right
- docks[j]->position.left) *1000;
}
for (j = 0; j < hwincount; j++)
{
if (docks[j]->hidden)
{
docks[j]->hiddenwidth = totalsize / wincount;
}
}
}
for (j = 0; j < wincount; j++)
docks[windows[j]]->colindex = j;
if (cache[windows[0]]->type != LSTOOLBAR)
{
InsertHorizFrame(windows[0], 1, 1);
client.bottom = - FRAMEWIDTH;
}
else
client.bottom = 0;
client.bottom += docks[windows[0]]->position.top;
}
indexmax = - 1;
if (index >= 0 && (docks[index]->flags &DOCK_LEFT))
InsertColumn(index, DOCK_LEFT);
for (i = 0, min = - 1; i < currentWindows; i++)
if (docks[i]->flags &DOCK_LEFT)
{
if (docks[i]->rowindex > indexmax)
indexmax = docks[i]->rowindex;
}
adj2 = 0;
if (index == - 2)
oldclient = client;
for (i = 0; i <= indexmax; i++)
{
found = FALSE, hidden = FALSE;
hwincount = 0;
wincount = 0;
for (j = 0; j < currentWindows; j++)
if ((docks[j]->flags &DOCK_LEFT) && docks[j]->rowindex == i)
{
docks[j]->rowindex -= adj2;
if (!docks[j
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?