Tk
view release on metacpan or search on metacpan
pTk/mTk/generic/tkGrid.c view on Meta::CPAN
UniformGroup *new = (UniformGroup *) ckalloc(newSize);
UniformGroup *old = uniformGroupPtr;
memcpy((VOID *) new, (VOID *) old, oldSize);
if (old != uniformPre) {
ckfree((char *) old);
}
uniformGroupPtr = new;
uniformGroupsAlloced += UNIFORM_PREALLOC;
}
uniformGroups++;
uniformGroupPtr[start].group = layoutPtr[slot].uniform;
uniformGroupPtr[start].minSize = 0;
}
weight = layoutPtr[slot].weight;
weight = weight > 0 ? weight : 1;
minSize = (layoutPtr[slot].minSize + weight - 1) / weight;
if (minSize > uniformGroupPtr[start].minSize) {
uniformGroupPtr[start].minSize = minSize;
}
}
}
/*
* Data has been gathered about uniform groups. Now relayout accordingly.
*/
if (uniformGroups > 0) {
for (slot = 0; slot < gridCount; slot++) {
if (layoutPtr[slot].uniform != NULL) {
for (start = 0; start < uniformGroups; start++) {
if (uniformGroupPtr[start].group ==
layoutPtr[slot].uniform) {
weight = layoutPtr[slot].weight;
weight = weight > 0 ? weight : 1;
layoutPtr[slot].minSize =
uniformGroupPtr[start].minSize * weight;
break;
}
}
}
}
}
if (uniformGroupPtr != uniformPre) {
ckfree((char *) uniformGroupPtr);
}
/*
* Step 3.
* Determine the minimum slot offsets going from left to right
* that would fit all of the slaves. This determines the minimum
*/
for (offset=slot=0; slot < gridCount; slot++) {
layoutPtr[slot].minOffset = layoutPtr[slot].minSize + offset;
for (slavePtr = layoutPtr[slot].binNextPtr; slavePtr != NULL;
slavePtr = slavePtr->binNextPtr) {
int span = (slotType == COLUMN) ? slavePtr->numCols : slavePtr->numRows;
int required = slavePtr->size + layoutPtr[slot - span].minOffset;
if (required > layoutPtr[slot].minOffset) {
layoutPtr[slot].minOffset = required;
}
}
offset = layoutPtr[slot].minOffset;
}
/*
* At this point, we know the minimum required size of the entire layout.
* It might be prudent to stop here if our "master" will resize itself
* to this size.
*/
requiredSize = offset;
if (maxOffset > offset) {
offset=maxOffset;
}
/*
* Step 4.
* Determine the minimum slot offsets going from right to left,
* bounding the pixel range of each slot boundary.
* Pre-fill all of the right offsets with the actual size of the table;
* they will be reduced as required.
*/
for (slot=0; slot < gridCount; slot++) {
layoutPtr[slot].maxOffset = offset;
}
for (slot=gridCount-1; slot > 0;) {
for (slavePtr = layoutPtr[slot].binNextPtr; slavePtr != NULL;
slavePtr = slavePtr->binNextPtr) {
int span = (slotType == COLUMN) ? slavePtr->numCols : slavePtr->numRows;
int require = offset - slavePtr->size;
int startSlot = slot - span;
if (startSlot >=0 && require < layoutPtr[startSlot].maxOffset) {
layoutPtr[startSlot].maxOffset = require;
}
}
offset -= layoutPtr[slot].minSize;
slot--;
if (layoutPtr[slot].maxOffset < offset) {
offset = layoutPtr[slot].maxOffset;
} else {
layoutPtr[slot].maxOffset = offset;
}
}
/*
* Step 5.
* At this point, each slot boundary has a range of values that
* will satisfy the overall layout size.
* Make repeated passes over the layout structure looking for
* spans of slot boundaries where the minOffsets are less than
* the maxOffsets, and adjust the offsets according to the slot
* weights. At each pass, at least one slot boundary will have
* its range of possible values fixed at a single value.
*/
for (start=0; start < gridCount;) {
int totalWeight = 0; /* Sum of the weights for all of the
* slots in this span. */
int need = 0; /* The minimum space needed to layout
* this span. */
int have; /* The actual amount of space that will
* be taken up by this span. */
int weight; /* Cumulative weights of the columns in
* this span. */
int noWeights = 0; /* True if the span has no weights. */
/*
* Find a span by identifying ranges of slots whose edges are
* already constrained at fixed offsets, but whose internal
* slot boundaries have a range of possible positions.
*/
if (layoutPtr[start].minOffset == layoutPtr[start].maxOffset) {
start++;
continue;
}
for (end=start+1; end<gridCount; end++) {
if (layoutPtr[end].minOffset == layoutPtr[end].maxOffset) {
break;
}
}
/*
* We found a span. Compute the total weight, minumum space required,
* for this span, and the actual amount of space the span should
* use.
*/
for (slot=start; slot<=end; slot++) {
totalWeight += layoutPtr[slot].weight;
need += layoutPtr[slot].minSize;
}
( run in 2.509 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )