1049 lines
34 KiB
C
1049 lines
34 KiB
C
|
/*++
|
||
|
|
||
|
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Arrange.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains the default mdi tiling (arrange) code for CV format
|
||
|
windowing arrangement.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Griffith Wm. Kadnier (v-griffk) 01-Aug-1992
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Win32, User Mode
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
extern HWND GetWatchHWND(void);
|
||
|
|
||
|
|
||
|
#if defined( NEW_WINDOWING_CODE )
|
||
|
|
||
|
void
|
||
|
arrange()
|
||
|
{
|
||
|
UINT indx; // counters, indices...
|
||
|
int winType; // type of window (MEM,COMMAND,etc...)
|
||
|
LPDOCREC d;
|
||
|
int numdocs, nummems, nSide, nSplit, nVsplit, nHdelta, nVdelta;
|
||
|
BOOL fWatch, fLocal, fCpu, fFloat, fCalls;
|
||
|
BOOL fDoc, fDisasm, fCommand, fMem;
|
||
|
HWND hCpu, hFlt, hWtch, hLoc, hCalls;
|
||
|
RECT rc, rcc, rCm;
|
||
|
RECT rDoc, rDisasm, rComm, rMem;
|
||
|
BOOL fIcon = FALSE;
|
||
|
HWND hwndChild;
|
||
|
|
||
|
|
||
|
SetRectEmpty(&rcc);
|
||
|
|
||
|
numdocs = nummems = nSide = nSplit = nVsplit = nHdelta = nVdelta = 0;
|
||
|
fWatch = fLocal = fCpu = fFloat = fCalls = FALSE;
|
||
|
fDoc = fDisasm = fCommand = fMem = FALSE; // initialize to non-existent
|
||
|
|
||
|
if (hwndActive && IsZoomed(hwndActive)) {
|
||
|
// In order to arrange the windows, none of the
|
||
|
// windows can be maximized. So we have to restore this
|
||
|
// window to its original size.
|
||
|
ShowWindow(hwndActive, SW_RESTORE);
|
||
|
}
|
||
|
|
||
|
hwndChild = MDIGetActive(g_hwndMDIClient, NULL);
|
||
|
for (; hwndChild; hwndChild = GetNextWindow(hwndChild, GW_HWNDNEXT) ) {
|
||
|
PCOMMONWIN_DATA pWinData = GetCommonWinData(hwndChild);
|
||
|
|
||
|
switch (pWinData->m_enumType) {
|
||
|
|
||
|
default:
|
||
|
Assert(!"Unknown window type");
|
||
|
break;
|
||
|
|
||
|
case WATCH_WINDOW:
|
||
|
if ((hWtch = GetWatchHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hWtch)) {
|
||
|
fWatch = TRUE;
|
||
|
nSplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case LOCALS_WINDOW:
|
||
|
if ((hLoc = GetLocalHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hLoc)) {
|
||
|
fLocal = TRUE;
|
||
|
nSplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CPU_WINDOW:
|
||
|
if ((hCpu = GetCpuHWND()) != (HWND)NULL) {
|
||
|
if (!IsIconic(hCpu)) {
|
||
|
fCpu = TRUE;
|
||
|
nSide++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
case FLOAT_WINDOW:
|
||
|
if ((hFlt = GetFloatHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hFlt)) {
|
||
|
fFloat = TRUE;
|
||
|
nSide++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CALLS_WINDOW:
|
||
|
if ((hCalls = GetCallsHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hCalls)) {
|
||
|
fCalls = TRUE;
|
||
|
nSplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DOC_WINDOW:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fDoc = TRUE;
|
||
|
numdocs++;
|
||
|
|
||
|
if (numdocs == 1) {
|
||
|
nVsplit++;
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case DISASM_WINDOW:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fDisasm = TRUE;
|
||
|
nVsplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CMD_WINDOW:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fCommand = TRUE;
|
||
|
nVsplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MEMORY_WINDOW:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fMem = TRUE;
|
||
|
nummems++;
|
||
|
|
||
|
if (nummems == 1) {
|
||
|
nVsplit++;
|
||
|
}
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//Now we have a count of all multiple wins and an exist on special cases
|
||
|
//First get the Client extents
|
||
|
|
||
|
|
||
|
GetClientRect (g_hwndMDIClient, &rc);
|
||
|
|
||
|
|
||
|
// If icons present, don't cover them
|
||
|
|
||
|
if ( fIcon ) {
|
||
|
rc.bottom -= GetSystemMetrics( SM_CYICONSPACING );
|
||
|
}
|
||
|
|
||
|
CopyRect (&rCm,&rc); // make a copy for cumulatives
|
||
|
|
||
|
|
||
|
//special cases first
|
||
|
|
||
|
|
||
|
if (nSide > 0) {
|
||
|
|
||
|
// We will shrink the side windows (reg, float) to the minimum size
|
||
|
// allowed and put them in the upper left corner of the MDIClient's
|
||
|
// client area (have I got this 'client' usage right?). Next, we
|
||
|
// expand them to fit the register set of the target machine, but we
|
||
|
// presently allow only two choices: 32-bit and 64-bit. (Actually, we
|
||
|
// allow only ALPHA and anything else as the two choices, eh?) Our scaling
|
||
|
// factor is 1.5 for the smaller size, and something larger that gives
|
||
|
// a good appearance for the other size. Caveat emptor et programmer!
|
||
|
|
||
|
|
||
|
UINT processor;
|
||
|
|
||
|
float scaleFactor;
|
||
|
|
||
|
if (!LppdCur) {
|
||
|
processor = mptix86;
|
||
|
} else {
|
||
|
OSDGetDebugMetric(LppdCur->hpid, 0, mtrcProcessorType, &processor);
|
||
|
}
|
||
|
|
||
|
switch (processor) {
|
||
|
default:
|
||
|
case mptix86:
|
||
|
case mptia64:
|
||
|
case mptmips:
|
||
|
case mptm68k:
|
||
|
case mptmppc:
|
||
|
scaleFactor = 1.5f;
|
||
|
break;
|
||
|
|
||
|
case mptdaxp:
|
||
|
scaleFactor = 3.0f;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (fCpu && ((hCpu = GetCpuHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hCpu)) {
|
||
|
MoveWindow (hCpu,rc.left,rc.top,1,1,FALSE); //get minimum size, don't
|
||
|
//redraw yet
|
||
|
GetWindowRect (hCpu,&rcc);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.left);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.right);
|
||
|
|
||
|
rcc.right = ((LONG)((rcc.right - rcc.left) * scaleFactor)
|
||
|
+ rcc.left);
|
||
|
|
||
|
SetWindowPos (hCpu,
|
||
|
(HWND)NULL,
|
||
|
(rc.right - (rcc.right - rcc.left)),
|
||
|
rc.top,(rcc.right - rcc.left),
|
||
|
(nSide == 2) ? ((rc.bottom - rc.top) / 2) : (rc.bottom - rc.top),
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (hCpu,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hCpu,WM_PAINT,0,0L);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (fFloat && ((hFlt = GetFloatHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hFlt)) {
|
||
|
MoveWindow (hFlt,rc.left,rc.top,1,1,FALSE);
|
||
|
|
||
|
GetWindowRect (hFlt,&rcc);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.left);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.right);
|
||
|
|
||
|
rcc.right = ((LONG)((rcc.right - rcc.left) * scaleFactor)
|
||
|
+ rcc.left);
|
||
|
|
||
|
SetWindowPos (hFlt,
|
||
|
(HWND)NULL,
|
||
|
(rc.right - (rcc.right - rcc.left)),
|
||
|
(nSide == 2)?(rc.top + ((rc.bottom - rc.top) / 2)):rc.top,
|
||
|
(rcc.right - rcc.left),
|
||
|
(nSide == 2) ? ((rc.bottom - rc.top) / 2) : (rc.bottom - rc.top),
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (hFlt,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hFlt,WM_PAINT,0,0L);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
rCm.right -= (rcc.right - rcc.left); // shrink horizontal cumulative
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
CopyRect (&rc,&rCm); // copy back for cumulatives
|
||
|
|
||
|
|
||
|
//Figure vertical delta
|
||
|
|
||
|
if ((fLocal == TRUE) || (fWatch == TRUE) || (fCalls == TRUE)) {
|
||
|
nVsplit++;
|
||
|
}
|
||
|
|
||
|
if (nVsplit > 0) {
|
||
|
nVdelta = (rc.bottom - rc.top) / nVsplit;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (nSplit > 0){
|
||
|
int currHorizPos = rc.left;
|
||
|
|
||
|
//Figure horizontal delta
|
||
|
nHdelta = (rc.right - rc.left) / nSplit;
|
||
|
|
||
|
if (fLocal && ((hLoc = GetLocalHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hLoc)) {
|
||
|
SetWindowPos (hLoc,
|
||
|
(HWND)NULL,
|
||
|
currHorizPos,
|
||
|
rc.top,
|
||
|
nHdelta,
|
||
|
nVdelta,
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
currHorizPos += nHdelta;
|
||
|
InvalidateRect (hLoc,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hLoc,WM_PAINT,0,0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (fWatch && ((hWtch = GetWatchHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hWtch)) {
|
||
|
SetWindowPos (hWtch,
|
||
|
(HWND)NULL,
|
||
|
currHorizPos,
|
||
|
rc.top,
|
||
|
nHdelta,
|
||
|
nVdelta,
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
currHorizPos += nHdelta;
|
||
|
InvalidateRect (hWtch,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hWtch,WM_PAINT,0,0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (fCalls && ((hCalls = GetCallsHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hCalls)) {
|
||
|
SetWindowPos (hCalls,
|
||
|
(HWND)NULL,
|
||
|
currHorizPos,
|
||
|
rc.top,
|
||
|
nHdelta,
|
||
|
nVdelta,
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (hCalls,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hCalls,WM_PAINT,0,0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
rCm.top += nVdelta; // shrink vertical cumulative
|
||
|
}
|
||
|
|
||
|
|
||
|
if ((fLocal == TRUE) || (fWatch == TRUE) || (fCalls == TRUE)) {
|
||
|
nVsplit--;
|
||
|
}
|
||
|
|
||
|
|
||
|
CopyRect (&rc,&rCm); // copy back for cumulatives
|
||
|
|
||
|
|
||
|
if (nVsplit > 0) { // do the main windows
|
||
|
CopyRect (&rDoc,&rc);
|
||
|
CopyRect (&rDisasm,&rc);
|
||
|
CopyRect (&rComm,&rc);
|
||
|
CopyRect (&rMem,&rc);
|
||
|
|
||
|
|
||
|
if (fDoc == TRUE) { //Handle Document Windows
|
||
|
switch ((nVsplit)) {
|
||
|
case 1:
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
if (fCommand == FALSE) { // can only be one other window
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
}
|
||
|
rDoc.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
if (fCommand == FALSE) { // must be disasm amd mem
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.top = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
} else { // set disasm amd mem to middle
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
}
|
||
|
rDoc.bottom = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 4);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.top = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 3);
|
||
|
rDoc.bottom = rc.top + ((rc.bottom - rc.top) / 4);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (fCommand == TRUE) { // handle command window
|
||
|
switch ((nVsplit)) {
|
||
|
case 1:
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
if (fDoc == FALSE) { // can only be one other window
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
rMem.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
}
|
||
|
rComm.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
if (fDoc == FALSE) { // must be disasm amd mem
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
} else { // set disasm amd mem to middle
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
}
|
||
|
|
||
|
rComm.top = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 4);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.top = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 3);
|
||
|
rComm.top = rc.top + (((rc.bottom - rc.top) / 4) * 3);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if ((fDoc == FALSE) && (fCommand == FALSE)) {
|
||
|
if ((fDisasm == TRUE) && (fMem == TRUE)) {
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
nHdelta = (rc.right - rc.left); // refigure horizontal size
|
||
|
|
||
|
// The mem windows will be placed side to side of each other, inside the original space allocated
|
||
|
// to them.
|
||
|
if (nummems) {
|
||
|
rMem.right = (rMem.right - rMem.left) / nummems;
|
||
|
}
|
||
|
|
||
|
for (indx = 0; indx < MAX_VIEWS; indx++) {
|
||
|
winType = Views[indx].Doc; //window type
|
||
|
|
||
|
if (winType <= -1) { // only DOCS,DISASMS,COMMAND,MEMWINS
|
||
|
continue; // end of valid views or sparse array
|
||
|
} else {
|
||
|
d = &Docs[winType]; //Views[indx].Doc
|
||
|
winType = d->docType;
|
||
|
|
||
|
switch (winType) {
|
||
|
case DOC_WINDOW:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rDoc.left,rDoc.top,(rDoc.right - rDoc.left),(rDoc.bottom - rDoc.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DISASM_WINDOW:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rDisasm.left,rDisasm.top,(rDisasm.right - rDisasm.left),(rDisasm.bottom - rDisasm.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CMD_WINDOW:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))){
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rComm.left,rComm.top,(rComm.right - rComm.left),(rComm.bottom - rComm.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MEMORY_WINDOW:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))){
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rMem.left,rMem.top,(rMem.right - rMem.left),(rMem.bottom - rMem.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
|
||
|
// Do this so that the next mem window is displayed next to it.
|
||
|
OffsetRect(&rMem, rMem.right - rMem.left, 0);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InvalidateRect (g_hwndMDIClient,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (g_hwndMDIClient,WM_PAINT,0,0L);
|
||
|
|
||
|
}
|
||
|
|
||
|
#else // NEW_WINDOWING_CODE
|
||
|
|
||
|
void arrange()
|
||
|
{
|
||
|
UINT indx; // counters, indices...
|
||
|
int winType; // type of window (MEM,COMMAND,etc...)
|
||
|
LPDOCREC d;
|
||
|
int numdocs, nummems, nSide, nSplit, nVsplit, nHdelta, nVdelta;
|
||
|
BOOL fWatch, fLocal, fCpu, fFloat, fCalls;
|
||
|
BOOL fDoc, fDisasm, fCommand, fMem;
|
||
|
HWND hCpu, hFlt, hWtch, hLoc, hCalls;
|
||
|
RECT rc, rcc, rCm;
|
||
|
RECT rDoc, rDisasm, rComm, rMem;
|
||
|
BOOL fIcon = FALSE;
|
||
|
|
||
|
|
||
|
SetRectEmpty(&rcc);
|
||
|
|
||
|
numdocs = nummems = nSide = nSplit = nVsplit = nHdelta = nVdelta = 0;
|
||
|
fWatch = fLocal = fCpu = fFloat = fCalls = FALSE;
|
||
|
fDoc = fDisasm = fCommand = fMem = FALSE; // initialize to non-existent
|
||
|
|
||
|
if (hwndActive && IsZoomed(hwndActive)) {
|
||
|
// In order to arrange the windows, none of the
|
||
|
// windows can be maximized. So we have to restore this
|
||
|
// window to its original size.
|
||
|
ShowWindow(hwndActive, SW_RESTORE);
|
||
|
}
|
||
|
|
||
|
|
||
|
for (indx = 0; indx < MAX_VIEWS; indx++) {
|
||
|
winType = Views[indx].Doc; //window type
|
||
|
|
||
|
if (winType == -1) {
|
||
|
continue; // end of valid views or sparse array
|
||
|
} else if (winType < -1) { // special case for WATCH,LOCALS,CPU,FLOAT win's
|
||
|
switch (-winType) {
|
||
|
case WATCH_WIN:
|
||
|
if ((hWtch = GetWatchHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hWtch)) {
|
||
|
fWatch = TRUE;
|
||
|
nSplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case LOCALS_WIN:
|
||
|
if ((hLoc = GetLocalHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hLoc)) {
|
||
|
fLocal = TRUE;
|
||
|
nSplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CPU_WIN:
|
||
|
if ((hCpu = GetCpuHWND()) != (HWND)NULL) {
|
||
|
if (!IsIconic(hCpu)) {
|
||
|
fCpu = TRUE;
|
||
|
nSide++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
case FLOAT_WIN:
|
||
|
if ((hFlt = GetFloatHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hFlt)) {
|
||
|
fFloat = TRUE;
|
||
|
nSide++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CALLS_WIN:
|
||
|
if ((hCalls = GetCallsHWND()) != (HWND)NULL) {
|
||
|
if(!IsIconic(hCalls)) {
|
||
|
fCalls = TRUE;
|
||
|
nSplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
} else {
|
||
|
Assert(winType >= 0);
|
||
|
d = &Docs[winType]; //Views[indx].Doc
|
||
|
winType = d->docType;
|
||
|
|
||
|
|
||
|
switch (winType) {
|
||
|
case DOC_WIN:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fDoc = TRUE;
|
||
|
numdocs++;
|
||
|
|
||
|
if (numdocs == 1) {
|
||
|
nVsplit++;
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case DISASM_WIN:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fDisasm = TRUE;
|
||
|
nVsplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case COMMAND_WIN:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fCommand = TRUE;
|
||
|
nVsplit++;
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MEMORY_WIN:
|
||
|
if (Views[indx].hwndClient ) {
|
||
|
if ( !IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
fMem = TRUE;
|
||
|
nummems++;
|
||
|
|
||
|
if (nummems == 1) {
|
||
|
nVsplit++;
|
||
|
}
|
||
|
} else {
|
||
|
fIcon = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//Now we have a count of all multiple wins and an exist on special cases
|
||
|
//First get the Client extents
|
||
|
|
||
|
|
||
|
GetClientRect (g_hwndMDIClient, &rc);
|
||
|
|
||
|
|
||
|
// If icons present, don't cover them
|
||
|
|
||
|
if ( fIcon ) {
|
||
|
rc.bottom -= GetSystemMetrics( SM_CYICONSPACING );
|
||
|
}
|
||
|
|
||
|
CopyRect (&rCm,&rc); // make a copy for cumulatives
|
||
|
|
||
|
|
||
|
//special cases first
|
||
|
|
||
|
|
||
|
if (nSide > 0) {
|
||
|
|
||
|
// We will shrink the side windows (reg, float) to the minimum size
|
||
|
// allowed and put them in the upper left corner of the MDIClient's
|
||
|
// client area (have I got this 'client' usage right?). Next, we
|
||
|
// expand them to fit the register set of the target machine, but we
|
||
|
// presently allow only two choices: 32-bit and 64-bit. (Actually, we
|
||
|
// allow only ALPHA and anything else as the two choices, eh?) Our scaling
|
||
|
// factor is 1.5 for the smaller size, and something larger that gives
|
||
|
// a good appearance for the other size. Caveat emptor et programmer!
|
||
|
|
||
|
|
||
|
UINT processor;
|
||
|
|
||
|
float scaleFactor;
|
||
|
|
||
|
if (!LppdCur) {
|
||
|
processor = mptix86;
|
||
|
} else {
|
||
|
OSDGetDebugMetric(LppdCur->hpid, 0, mtrcProcessorType, &processor);
|
||
|
}
|
||
|
|
||
|
switch (processor) {
|
||
|
default:
|
||
|
case mptix86:
|
||
|
case mptia64:
|
||
|
case mptmips:
|
||
|
case mptm68k:
|
||
|
case mptmppc:
|
||
|
scaleFactor = 1.5f;
|
||
|
break;
|
||
|
|
||
|
case mptdaxp:
|
||
|
scaleFactor = 3.0f;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (fCpu && ((hCpu = GetCpuHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hCpu)) {
|
||
|
MoveWindow (hCpu,rc.left,rc.top,1,1,FALSE); //get minimum size, don't
|
||
|
//redraw yet
|
||
|
GetWindowRect (hCpu,&rcc);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.left);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.right);
|
||
|
|
||
|
rcc.right = ((LONG)((rcc.right - rcc.left) * scaleFactor)
|
||
|
+ rcc.left);
|
||
|
|
||
|
SetWindowPos (hCpu,
|
||
|
(HWND)NULL,
|
||
|
(rc.right - (rcc.right - rcc.left)),
|
||
|
rc.top,(rcc.right - rcc.left),
|
||
|
(nSide == 2) ? ((rc.bottom - rc.top) / 2) : (rc.bottom - rc.top),
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (hCpu,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hCpu,WM_PAINT,0,0L);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (fFloat && ((hFlt = GetFloatHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hFlt)) {
|
||
|
MoveWindow (hFlt,rc.left,rc.top,1,1,FALSE);
|
||
|
|
||
|
GetWindowRect (hFlt,&rcc);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.left);
|
||
|
ScreenToClient (g_hwndMDIClient,(LPPOINT)&rcc.right);
|
||
|
|
||
|
rcc.right = ((LONG)((rcc.right - rcc.left) * scaleFactor)
|
||
|
+ rcc.left);
|
||
|
|
||
|
SetWindowPos (hFlt,
|
||
|
(HWND)NULL,
|
||
|
(rc.right - (rcc.right - rcc.left)),
|
||
|
(nSide == 2)?(rc.top + ((rc.bottom - rc.top) / 2)):rc.top,
|
||
|
(rcc.right - rcc.left),
|
||
|
(nSide == 2) ? ((rc.bottom - rc.top) / 2) : (rc.bottom - rc.top),
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (hFlt,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hFlt,WM_PAINT,0,0L);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
rCm.right -= (rcc.right - rcc.left); // shrink horizontal cumulative
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
CopyRect (&rc,&rCm); // copy back for cumulatives
|
||
|
|
||
|
|
||
|
//Figure vertical delta
|
||
|
|
||
|
if ((fLocal == TRUE) || (fWatch == TRUE) || (fCalls == TRUE)) {
|
||
|
nVsplit++;
|
||
|
}
|
||
|
|
||
|
if (nVsplit > 0) {
|
||
|
nVdelta = (rc.bottom - rc.top) / nVsplit;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (nSplit > 0){
|
||
|
int currHorizPos = rc.left;
|
||
|
|
||
|
//Figure horizontal delta
|
||
|
nHdelta = (rc.right - rc.left) / nSplit;
|
||
|
|
||
|
if (fLocal && ((hLoc = GetLocalHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hLoc)) {
|
||
|
SetWindowPos (hLoc,
|
||
|
(HWND)NULL,
|
||
|
currHorizPos,
|
||
|
rc.top,
|
||
|
nHdelta,
|
||
|
nVdelta,
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
currHorizPos += nHdelta;
|
||
|
InvalidateRect (hLoc,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hLoc,WM_PAINT,0,0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (fWatch && ((hWtch = GetWatchHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hWtch)) {
|
||
|
SetWindowPos (hWtch,
|
||
|
(HWND)NULL,
|
||
|
currHorizPos,
|
||
|
rc.top,
|
||
|
nHdelta,
|
||
|
nVdelta,
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
currHorizPos += nHdelta;
|
||
|
InvalidateRect (hWtch,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hWtch,WM_PAINT,0,0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (fCalls && ((hCalls = GetCallsHWND()) != (HWND)NULL)) {
|
||
|
if(!IsIconic(hCalls)) {
|
||
|
SetWindowPos (hCalls,
|
||
|
(HWND)NULL,
|
||
|
currHorizPos,
|
||
|
rc.top,
|
||
|
nHdelta,
|
||
|
nVdelta,
|
||
|
SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (hCalls,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (hCalls,WM_PAINT,0,0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
rCm.top += nVdelta; // shrink vertical cumulative
|
||
|
}
|
||
|
|
||
|
|
||
|
if ((fLocal == TRUE) || (fWatch == TRUE) || (fCalls == TRUE)) {
|
||
|
nVsplit--;
|
||
|
}
|
||
|
|
||
|
|
||
|
CopyRect (&rc,&rCm); // copy back for cumulatives
|
||
|
|
||
|
|
||
|
if (nVsplit > 0) { // do the main windows
|
||
|
CopyRect (&rDoc,&rc);
|
||
|
CopyRect (&rDisasm,&rc);
|
||
|
CopyRect (&rComm,&rc);
|
||
|
CopyRect (&rMem,&rc);
|
||
|
|
||
|
|
||
|
if (fDoc == TRUE) { //Handle Document Windows
|
||
|
switch ((nVsplit)) {
|
||
|
case 1:
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
if (fCommand == FALSE) { // can only be one other window
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
}
|
||
|
rDoc.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
if (fCommand == FALSE) { // must be disasm amd mem
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.top = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
} else { // set disasm amd mem to middle
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
}
|
||
|
rDoc.bottom = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 4);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.top = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 3);
|
||
|
rDoc.bottom = rc.top + ((rc.bottom - rc.top) / 4);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (fCommand == TRUE) { // handle command window
|
||
|
switch ((nVsplit)) {
|
||
|
case 1:
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
if (fDoc == FALSE) { // can only be one other window
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
rMem.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
}
|
||
|
rComm.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
if (fDoc == FALSE) { // must be disasm amd mem
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
} else { // set disasm amd mem to middle
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 3);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
}
|
||
|
|
||
|
rComm.top = rc.top + (((rc.bottom - rc.top) / 3) * 2);
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
rDisasm.top = rc.top + ((rc.bottom - rc.top) / 4);
|
||
|
rDisasm.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.top = rc.top + (((rc.bottom - rc.top) / 4) * 2);
|
||
|
rMem.bottom = rc.top + (((rc.bottom - rc.top) / 4) * 3);
|
||
|
rComm.top = rc.top + (((rc.bottom - rc.top) / 4) * 3);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if ((fDoc == FALSE) && (fCommand == FALSE)) {
|
||
|
if ((fDisasm == TRUE) && (fMem == TRUE)) {
|
||
|
rDisasm.bottom = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
rMem.top = rc.top + ((rc.bottom - rc.top) / 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
nHdelta = (rc.right - rc.left); // refigure horizontal size
|
||
|
|
||
|
// The mem windows will be placed side to side of each other, inside the original space allocated
|
||
|
// to them.
|
||
|
if (nummems) {
|
||
|
rMem.right = (rMem.right - rMem.left) / nummems;
|
||
|
}
|
||
|
|
||
|
for (indx = 0; indx < MAX_VIEWS; indx++) {
|
||
|
winType = Views[indx].Doc; //window type
|
||
|
|
||
|
if (winType <= -1) { // only DOCS,DISASMS,COMMAND,MEMWINS
|
||
|
continue; // end of valid views or sparse array
|
||
|
} else {
|
||
|
d = &Docs[winType]; //Views[indx].Doc
|
||
|
winType = d->docType;
|
||
|
|
||
|
switch (winType) {
|
||
|
case DOC_WIN:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rDoc.left,rDoc.top,(rDoc.right - rDoc.left),(rDoc.bottom - rDoc.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DISASM_WIN:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))) {
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rDisasm.left,rDisasm.top,(rDisasm.right - rDisasm.left),(rDisasm.bottom - rDisasm.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case COMMAND_WIN:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))){
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rComm.left,rComm.top,(rComm.right - rComm.left),(rComm.bottom - rComm.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MEMORY_WIN:
|
||
|
if (!IsIconic(GetParent(Views[indx].hwndClient))){
|
||
|
SetWindowPos (GetParent(Views[indx].hwndClient),(HWND)NULL,rMem.left,rMem.top,(rMem.right - rMem.left),(rMem.bottom - rMem.top),SWP_NOZORDER|SWP_DRAWFRAME);
|
||
|
InvalidateRect (GetParent(Views[indx].hwndClient),(LPRECT)NULL,TRUE);
|
||
|
PostMessage (GetParent(Views[indx].hwndClient),WM_PAINT,0,0L);
|
||
|
|
||
|
// Do this so that the next mem window is displayed next to it.
|
||
|
OffsetRect(&rMem, rMem.right - rMem.left, 0);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InvalidateRect (g_hwndMDIClient,(LPRECT)NULL,TRUE);
|
||
|
PostMessage (g_hwndMDIClient,WM_PAINT,0,0L);
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif // NEW_WINDOWING_CODE
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*==========================================================================*/
|