2011-11-09 22:58:42 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* Version: MPL 1.1 / GPLv3+ / LGPLv3+
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.)
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 2011 the
|
|
|
|
* Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): Caolán McNamara <caolanm@redhat.com>
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 3 or later (the "GPLv3+"), or
|
|
|
|
* the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
|
|
|
|
* in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
|
|
|
|
* instead of those above.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <vcl/layout.hxx>
|
2012-04-11 11:41:54 +01:00
|
|
|
#include "window.h"
|
|
|
|
|
|
|
|
Size VclContainer::GetOptimalSize(WindowSizeType eType) const
|
|
|
|
{
|
|
|
|
if (eType == WINDOWSIZE_MAXIMUM)
|
|
|
|
return Window::GetOptimalSize(eType);
|
2012-05-18 13:48:13 +01:00
|
|
|
|
|
|
|
Size aSize = calculateRequisition();
|
|
|
|
aSize.Width() += m_nBorderWidth*2;
|
|
|
|
aSize.Height() += m_nBorderWidth*2;
|
|
|
|
return aSize;
|
2012-04-11 11:41:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void VclContainer::SetPosSizePixel(const Point& rAllocPos, const Size& rAllocation)
|
|
|
|
{
|
2012-05-18 13:48:13 +01:00
|
|
|
Size aAllocation = rAllocation;
|
|
|
|
aAllocation.Width() -= m_nBorderWidth*2;
|
|
|
|
aAllocation.Height() -= m_nBorderWidth*2;
|
|
|
|
|
|
|
|
Point aAllocPos = rAllocPos;
|
|
|
|
aAllocPos.X() += m_nBorderWidth;
|
|
|
|
aAllocPos.Y() += m_nBorderWidth;
|
|
|
|
|
|
|
|
Window::SetPosSizePixel(aAllocPos, aAllocation);
|
|
|
|
setAllocation(aAllocation);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VclContainer::set_property(const rtl::OString &rKey, const rtl::OString &rValue)
|
|
|
|
{
|
|
|
|
if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("border-width")))
|
|
|
|
set_border_width(rValue.toInt32());
|
|
|
|
else
|
|
|
|
return Window::set_property(rKey, rValue);
|
|
|
|
return true;
|
2012-04-11 11:41:54 +01:00
|
|
|
}
|
2011-11-09 22:58:42 +00:00
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
Size VclBox::calculateRequisition() const
|
2011-11-09 22:58:42 +00:00
|
|
|
{
|
|
|
|
long nMaxChildDimension = 0;
|
|
|
|
|
|
|
|
sal_uInt16 nVisibleChildren = 0;
|
|
|
|
|
|
|
|
Size aSize;
|
2012-04-16 15:14:42 +01:00
|
|
|
for (Window *pChild = GetWindow(WINDOW_FIRSTCHILD); pChild; pChild = pChild->GetWindow(WINDOW_NEXT))
|
2011-11-09 22:58:42 +00:00
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
++nVisibleChildren;
|
2012-02-06 14:57:38 +01:00
|
|
|
Size aChildSize = pChild->get_preferred_size();
|
2011-11-09 22:58:42 +00:00
|
|
|
long nSecondaryDimension = getSecondaryDimension(aChildSize);
|
|
|
|
if (nSecondaryDimension > getSecondaryDimension(aSize))
|
|
|
|
setSecondaryDimension(aSize, nSecondaryDimension);
|
|
|
|
if (m_bHomogeneous)
|
|
|
|
{
|
|
|
|
long nPrimaryDimension = getPrimaryDimension(aChildSize);
|
|
|
|
if (nPrimaryDimension > nMaxChildDimension)
|
|
|
|
nMaxChildDimension = nPrimaryDimension;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
long nPrimaryDimension = getPrimaryDimension(aSize);
|
|
|
|
setPrimaryDimension(aSize, nPrimaryDimension + getPrimaryDimension(aChildSize));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nVisibleChildren)
|
|
|
|
{
|
|
|
|
long nPrimaryDimension = getPrimaryDimension(aSize);
|
|
|
|
if (m_bHomogeneous)
|
2011-11-15 16:38:47 +00:00
|
|
|
nPrimaryDimension += nMaxChildDimension * nVisibleChildren;
|
2011-11-09 22:58:42 +00:00
|
|
|
setPrimaryDimension(aSize, nPrimaryDimension + m_nSpacing * (nVisibleChildren-1));
|
|
|
|
}
|
|
|
|
|
|
|
|
return aSize;
|
|
|
|
}
|
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
void VclBox::setAllocation(const Size &rAllocation)
|
2011-11-09 22:58:42 +00:00
|
|
|
{
|
2011-11-15 09:50:11 +00:00
|
|
|
rtl::OString sExpand(RTL_CONSTASCII_STRINGPARAM("expand"));
|
|
|
|
|
2011-11-15 16:38:47 +00:00
|
|
|
sal_uInt16 nVisibleChildren = 0, nExpandChildren = 0;
|
2012-04-16 15:14:42 +01:00
|
|
|
for (Window *pChild = GetWindow(WINDOW_FIRSTCHILD); pChild; pChild = pChild->GetWindow(WINDOW_NEXT))
|
2011-11-09 22:58:42 +00:00
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
++nVisibleChildren;
|
2011-11-17 21:24:33 +00:00
|
|
|
bool bExpand = pChild->getWidgetProperty<sal_Bool>(sExpand);
|
2011-11-14 16:56:25 +00:00
|
|
|
if (bExpand)
|
2011-11-09 22:58:42 +00:00
|
|
|
++nExpandChildren;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!nVisibleChildren)
|
|
|
|
return;
|
|
|
|
|
2012-05-18 13:48:13 +01:00
|
|
|
long nAllocPrimaryDimension = getPrimaryDimension(rAllocation);
|
2011-11-15 09:50:11 +00:00
|
|
|
|
2012-05-18 13:48:13 +01:00
|
|
|
long nHomogeneousDimension = 0, nExtraSpace = 0;
|
2011-11-09 22:58:42 +00:00
|
|
|
if (m_bHomogeneous)
|
|
|
|
{
|
2011-11-15 16:38:47 +00:00
|
|
|
nHomogeneousDimension = ((nAllocPrimaryDimension -
|
|
|
|
(nVisibleChildren - 1) * m_nSpacing)) / nVisibleChildren;
|
2011-11-09 22:58:42 +00:00
|
|
|
}
|
|
|
|
else if (nExpandChildren)
|
|
|
|
{
|
|
|
|
Size aRequisition = calculateRequisition();
|
2012-05-18 13:48:13 +01:00
|
|
|
nExtraSpace = (getPrimaryDimension(rAllocation) - getPrimaryDimension(aRequisition)) / nExpandChildren;
|
2011-11-09 22:58:42 +00:00
|
|
|
}
|
|
|
|
|
2011-11-15 09:50:11 +00:00
|
|
|
rtl::OString sPadding(RTL_CONSTASCII_STRINGPARAM("padding"));
|
|
|
|
rtl::OString sPackType(RTL_CONSTASCII_STRINGPARAM("pack-type"));
|
|
|
|
rtl::OString sFill(RTL_CONSTASCII_STRINGPARAM("fill"));
|
2011-11-14 16:56:25 +00:00
|
|
|
|
2011-11-15 09:50:11 +00:00
|
|
|
for (sal_Int32 ePackType = VCL_PACK_START; ePackType <= VCL_PACK_END; ++ePackType)
|
|
|
|
{
|
2012-05-18 13:48:13 +01:00
|
|
|
Point aPos(0, 0);
|
2011-11-15 09:50:11 +00:00
|
|
|
if (ePackType == VCL_PACK_END)
|
2011-11-09 22:58:42 +00:00
|
|
|
{
|
2011-11-15 09:50:11 +00:00
|
|
|
long nPrimaryCoordinate = getPrimaryCoordinate(aPos);
|
|
|
|
setPrimaryCoordinate(aPos, nPrimaryCoordinate + nAllocPrimaryDimension);
|
2011-11-09 22:58:42 +00:00
|
|
|
}
|
|
|
|
|
2012-04-16 15:14:42 +01:00
|
|
|
for (Window *pChild = GetWindow(WINDOW_FIRSTCHILD); pChild; pChild = pChild->GetWindow(WINDOW_NEXT))
|
2011-11-09 22:58:42 +00:00
|
|
|
{
|
2011-11-15 09:50:11 +00:00
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
|
2011-11-17 21:24:33 +00:00
|
|
|
sal_Int32 ePacking = pChild->getWidgetProperty<sal_Int32>(sPackType);
|
2011-11-15 09:50:11 +00:00
|
|
|
|
|
|
|
if (ePacking != ePackType)
|
|
|
|
continue;
|
|
|
|
|
2011-11-17 21:24:33 +00:00
|
|
|
long nPadding = pChild->getWidgetProperty<sal_Int32>(sPadding);
|
2011-11-15 09:50:11 +00:00
|
|
|
|
|
|
|
Size aBoxSize;
|
|
|
|
if (m_bHomogeneous)
|
|
|
|
setPrimaryDimension(aBoxSize, nHomogeneousDimension);
|
|
|
|
else
|
|
|
|
{
|
2012-02-06 14:57:38 +01:00
|
|
|
aBoxSize = pChild->get_preferred_size();
|
2011-11-15 09:50:11 +00:00
|
|
|
long nPrimaryDimension = getPrimaryDimension(aBoxSize);
|
|
|
|
nPrimaryDimension += nPadding;
|
2011-11-17 21:24:33 +00:00
|
|
|
bool bExpand = pChild->getWidgetProperty<bool>(sExpand);
|
2011-11-15 09:50:11 +00:00
|
|
|
if (bExpand)
|
|
|
|
setPrimaryDimension(aBoxSize, nPrimaryDimension + nExtraSpace);
|
|
|
|
}
|
2012-05-18 13:48:13 +01:00
|
|
|
setSecondaryDimension(aBoxSize, getSecondaryDimension(rAllocation));
|
2011-11-15 09:50:11 +00:00
|
|
|
|
|
|
|
Point aChildPos(aPos);
|
|
|
|
Size aChildSize(aBoxSize);
|
|
|
|
long nPrimaryCoordinate = getPrimaryCoordinate(aPos);
|
|
|
|
|
2011-11-17 21:24:33 +00:00
|
|
|
bool bFill = pChild->getWidgetProperty<sal_Bool>(sFill, sal_True);
|
2011-11-15 09:50:11 +00:00
|
|
|
if (bFill)
|
|
|
|
{
|
|
|
|
setPrimaryDimension(aChildSize, std::max(static_cast<long>(1),
|
|
|
|
getPrimaryDimension(aBoxSize) - nPadding * 2));
|
|
|
|
|
|
|
|
setPrimaryCoordinate(aChildPos, nPrimaryCoordinate + nPadding);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setPrimaryDimension(aChildSize,
|
2012-02-06 14:57:38 +01:00
|
|
|
getPrimaryDimension(pChild->get_preferred_size()));
|
2011-11-15 09:50:11 +00:00
|
|
|
|
|
|
|
setPrimaryCoordinate(aChildPos, nPrimaryCoordinate +
|
|
|
|
(getPrimaryDimension(aBoxSize) - getPrimaryDimension(aChildSize)) / 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
long nDiff = getPrimaryDimension(aBoxSize) + m_nSpacing;
|
|
|
|
if (ePackType == VCL_PACK_START)
|
|
|
|
setPrimaryCoordinate(aPos, nPrimaryCoordinate + nDiff);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setPrimaryCoordinate(aPos, nPrimaryCoordinate - nDiff);
|
|
|
|
setPrimaryCoordinate(aChildPos, getPrimaryCoordinate(aChildPos) -
|
2012-03-29 10:27:27 +01:00
|
|
|
getPrimaryDimension(aBoxSize));
|
2011-11-15 09:50:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pChild->SetPosSizePixel(aChildPos, aChildSize);
|
2011-11-09 22:58:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-16 11:05:57 +01:00
|
|
|
bool VclBox::set_property(const rtl::OString &rKey, const rtl::OString &rValue)
|
|
|
|
{
|
|
|
|
if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("spacing")))
|
|
|
|
set_spacing(rValue.toInt32());
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("homogeneous")))
|
|
|
|
set_homogeneous(toBool(rValue));
|
|
|
|
else
|
2012-05-18 13:48:13 +01:00
|
|
|
return VclContainer::set_property(rKey, rValue);
|
2012-04-16 11:05:57 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-11-17 11:46:16 +00:00
|
|
|
#define DEFAULT_CHILD_INTERNAL_PAD_X 4
|
|
|
|
#define DEFAULT_CHILD_INTERNAL_PAD_Y 0
|
2011-11-17 21:24:33 +00:00
|
|
|
#define DEFAULT_CHILD_MIN_WIDTH 85
|
|
|
|
#define DEFAULT_CHILD_MIN_HEIGHT 27
|
2011-11-17 11:46:16 +00:00
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
Size VclButtonBox::calculateRequisition() const
|
2011-11-17 11:46:16 +00:00
|
|
|
{
|
2011-11-17 21:24:33 +00:00
|
|
|
sal_uInt16 nVisibleChildren = 0;
|
2011-11-17 11:46:16 +00:00
|
|
|
|
2011-11-17 21:24:33 +00:00
|
|
|
rtl::OString sChildMinWidth(RTL_CONSTASCII_STRINGPARAM("child-min-width"));
|
|
|
|
sal_Int32 nChildMinWidth = getWidgetStyleProperty<sal_Int32>(sChildMinWidth, DEFAULT_CHILD_MIN_WIDTH);
|
|
|
|
rtl::OString sChildMinHeight(RTL_CONSTASCII_STRINGPARAM("child-min-height"));
|
|
|
|
sal_Int32 nChildMinHeight = getWidgetStyleProperty<sal_Int32>(sChildMinHeight, DEFAULT_CHILD_MIN_HEIGHT);
|
|
|
|
Size aSize(nChildMinWidth, nChildMinHeight);
|
2011-11-17 11:46:16 +00:00
|
|
|
|
2012-04-16 15:14:42 +01:00
|
|
|
for (Window *pChild = GetWindow(WINDOW_FIRSTCHILD); pChild; pChild = pChild->GetWindow(WINDOW_NEXT))
|
2011-11-17 11:46:16 +00:00
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
2011-11-17 21:24:33 +00:00
|
|
|
++nVisibleChildren;
|
2012-02-06 14:57:38 +01:00
|
|
|
Size aChildSize = pChild->get_preferred_size();
|
2011-11-17 21:24:33 +00:00
|
|
|
if (aChildSize.Width() > aSize.Width())
|
|
|
|
aSize.Width() = aChildSize.Width();
|
|
|
|
if (aChildSize.Height() > aSize.Height())
|
|
|
|
aSize.Height() = aChildSize.Height();
|
2011-11-17 11:46:16 +00:00
|
|
|
}
|
|
|
|
|
2011-11-17 21:24:33 +00:00
|
|
|
if (!nVisibleChildren)
|
|
|
|
return Size();
|
|
|
|
|
|
|
|
long nPrimaryDimension =
|
|
|
|
(getPrimaryDimension(aSize) * nVisibleChildren) +
|
2012-06-01 10:26:18 +01:00
|
|
|
(m_nSpacing * (nVisibleChildren-1));
|
2011-11-17 21:24:33 +00:00
|
|
|
setPrimaryDimension(aSize, nPrimaryDimension + m_nSpacing);
|
|
|
|
|
2011-11-17 11:46:16 +00:00
|
|
|
long nSecondaryDimension = getSecondaryDimension(aSize);
|
2012-06-01 10:26:18 +01:00
|
|
|
setSecondaryDimension(aSize, nSecondaryDimension);
|
|
|
|
|
|
|
|
fprintf(stderr, "button box asked for %ld %ld\n", aSize.Width(), aSize.Height());
|
2011-11-17 11:46:16 +00:00
|
|
|
|
|
|
|
return aSize;
|
|
|
|
}
|
|
|
|
|
2012-06-06 10:46:49 +01:00
|
|
|
bool VclButtonBox::set_property(const rtl::OString &rKey, const rtl::OString &rValue)
|
|
|
|
{
|
|
|
|
if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("layout-style")))
|
|
|
|
{
|
|
|
|
VclButtonBoxStyle eStyle = VCL_BUTTONBOX_DEFAULT_STYLE;
|
|
|
|
if (rValue.equalsL(RTL_CONSTASCII_STRINGPARAM("start")))
|
|
|
|
eStyle = VCL_BUTTONBOX_START;
|
|
|
|
else if (rValue.equalsL(RTL_CONSTASCII_STRINGPARAM("spread")))
|
|
|
|
eStyle = VCL_BUTTONBOX_SPREAD;
|
|
|
|
else if (rValue.equalsL(RTL_CONSTASCII_STRINGPARAM("edge")))
|
|
|
|
eStyle = VCL_BUTTONBOX_EDGE;
|
|
|
|
else if (rValue.equalsL(RTL_CONSTASCII_STRINGPARAM("start")))
|
|
|
|
eStyle = VCL_BUTTONBOX_START;
|
|
|
|
else if (rValue.equalsL(RTL_CONSTASCII_STRINGPARAM("end")))
|
|
|
|
eStyle = VCL_BUTTONBOX_END;
|
|
|
|
else if (rValue.equalsL(RTL_CONSTASCII_STRINGPARAM("center")))
|
|
|
|
eStyle = VCL_BUTTONBOX_CENTER;
|
|
|
|
else
|
|
|
|
fprintf(stderr, "unknown layout style %s\n", rValue.getStr());
|
|
|
|
set_layout(eStyle);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return VclBox::set_property(rKey, rValue);
|
|
|
|
return true;
|
|
|
|
}
|
2011-11-17 11:46:16 +00:00
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
void VclButtonBox::setAllocation(const Size &rAllocation)
|
2011-11-15 16:38:47 +00:00
|
|
|
{
|
2012-06-01 10:26:18 +01:00
|
|
|
fprintf(stderr, "button box got %ld %ld\n", rAllocation.Width(), rAllocation.Height());
|
|
|
|
|
2011-11-15 16:38:47 +00:00
|
|
|
sal_uInt16 nVisibleChildren = 0;
|
2012-04-16 15:14:42 +01:00
|
|
|
for (Window *pChild = GetWindow(WINDOW_FIRSTCHILD); pChild; pChild = pChild->GetWindow(WINDOW_NEXT))
|
2011-11-15 16:38:47 +00:00
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
++nVisibleChildren;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!nVisibleChildren)
|
|
|
|
return;
|
|
|
|
|
|
|
|
Size aSize = rAllocation;
|
|
|
|
|
|
|
|
long nAllocPrimaryDimension = getPrimaryDimension(rAllocation);
|
|
|
|
Size aRequisition = calculateRequisition();
|
|
|
|
long nHomogeneousDimension = ((getPrimaryDimension(aRequisition) -
|
|
|
|
(nVisibleChildren - 1) * m_nSpacing)) / nVisibleChildren;
|
|
|
|
|
2012-05-18 13:48:13 +01:00
|
|
|
Point aPos(0, 0);
|
2011-11-15 16:38:47 +00:00
|
|
|
long nPrimaryCoordinate = getPrimaryCoordinate(aPos);
|
2012-06-06 10:46:49 +01:00
|
|
|
|
|
|
|
//To-Do, other layout styles
|
|
|
|
switch (m_eLayoutStyle)
|
|
|
|
{
|
|
|
|
case VCL_BUTTONBOX_START:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "todo unimplemented layout style\n");
|
|
|
|
case VCL_BUTTONBOX_DEFAULT_STYLE:
|
|
|
|
case VCL_BUTTONBOX_END:
|
|
|
|
setPrimaryCoordinate(aPos, nPrimaryCoordinate + nAllocPrimaryDimension
|
|
|
|
- getPrimaryDimension(aRequisition));
|
|
|
|
break;
|
|
|
|
}
|
2011-11-15 16:38:47 +00:00
|
|
|
|
2012-04-16 15:14:42 +01:00
|
|
|
for (Window *pChild = GetWindow(WINDOW_FIRSTCHILD); pChild; pChild = pChild->GetWindow(WINDOW_NEXT))
|
2011-11-15 16:38:47 +00:00
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
|
|
|
|
Size aChildSize;
|
|
|
|
setSecondaryDimension(aChildSize, getSecondaryDimension(aSize));
|
|
|
|
setPrimaryDimension(aChildSize, nHomogeneousDimension);
|
|
|
|
|
|
|
|
pChild->SetPosSizePixel(aPos, aChildSize);
|
|
|
|
|
|
|
|
nPrimaryCoordinate = getPrimaryCoordinate(aPos);
|
2012-05-18 13:48:13 +01:00
|
|
|
setPrimaryCoordinate(aPos, nPrimaryCoordinate + nHomogeneousDimension + m_nSpacing);
|
2011-11-15 16:38:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
VclGrid::array_type VclGrid::assembleGrid() const
|
2012-02-01 10:12:42 +00:00
|
|
|
{
|
|
|
|
array_type A;
|
|
|
|
|
|
|
|
rtl::OString sLeftAttach(RTL_CONSTASCII_STRINGPARAM("left-attach"));
|
|
|
|
rtl::OString sWidth(RTL_CONSTASCII_STRINGPARAM("width"));
|
|
|
|
rtl::OString sTopAttach(RTL_CONSTASCII_STRINGPARAM("top-attach"));
|
|
|
|
rtl::OString sHeight(RTL_CONSTASCII_STRINGPARAM("height"));
|
|
|
|
|
|
|
|
for (Window* pChild = GetWindow(WINDOW_FIRSTCHILD); pChild;
|
|
|
|
pChild = pChild->GetWindow(WINDOW_NEXT))
|
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
|
|
|
|
sal_Int32 nLeftAttach = pChild->getWidgetProperty<sal_Int32>(sLeftAttach);
|
|
|
|
sal_Int32 nWidth = pChild->getWidgetProperty<sal_Int32>(sWidth, 1);
|
|
|
|
sal_Int32 nMaxXPos = nLeftAttach+nWidth-1;
|
|
|
|
|
|
|
|
sal_Int32 nTopAttach = pChild->getWidgetProperty<sal_Int32>(sTopAttach);
|
|
|
|
sal_Int32 nHeight = pChild->getWidgetProperty<sal_Int32>(sHeight, 1);
|
|
|
|
sal_Int32 nMaxYPos = nTopAttach+nHeight-1;
|
|
|
|
|
|
|
|
sal_Int32 nCurrentMaxXPos = A.shape()[0]-1;
|
|
|
|
sal_Int32 nCurrentMaxYPos = A.shape()[1]-1;
|
|
|
|
if (nMaxXPos > nCurrentMaxXPos || nMaxYPos > nCurrentMaxYPos)
|
|
|
|
{
|
|
|
|
nCurrentMaxXPos = std::max(nMaxXPos, nCurrentMaxXPos);
|
|
|
|
nCurrentMaxYPos = std::max(nMaxYPos, nCurrentMaxYPos);
|
|
|
|
A.resize(boost::extents[nCurrentMaxXPos+1][nCurrentMaxYPos+1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
A[nLeftAttach][nTopAttach] = pChild;
|
|
|
|
}
|
|
|
|
|
|
|
|
return A;
|
|
|
|
}
|
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
bool VclGrid::isNullGrid(const array_type &A) const
|
2012-02-01 10:12:42 +00:00
|
|
|
{
|
|
|
|
sal_Int32 nMaxX = A.shape()[0];
|
|
|
|
sal_Int32 nMaxY = A.shape()[1];
|
|
|
|
|
|
|
|
if (!nMaxX || !nMaxY)
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
void VclGrid::calcMaxs(const array_type &A, std::vector<long> &rWidths, std::vector<long> &rHeights) const
|
2012-02-01 10:12:42 +00:00
|
|
|
{
|
|
|
|
sal_Int32 nMaxX = A.shape()[0];
|
|
|
|
sal_Int32 nMaxY = A.shape()[1];
|
|
|
|
|
|
|
|
rWidths.resize(nMaxX);
|
|
|
|
rHeights.resize(nMaxY);
|
|
|
|
|
2012-02-01 10:49:43 +00:00
|
|
|
rtl::OString sWidth(RTL_CONSTASCII_STRINGPARAM("width"));
|
|
|
|
rtl::OString sHeight(RTL_CONSTASCII_STRINGPARAM("height"));
|
|
|
|
|
2012-02-01 10:12:42 +00:00
|
|
|
for (sal_Int32 x = 0; x < nMaxX; ++x)
|
|
|
|
{
|
|
|
|
for (sal_Int32 y = 0; y < nMaxY; ++y)
|
|
|
|
{
|
|
|
|
const Window *pChild = A[x][y];
|
|
|
|
if (!pChild)
|
|
|
|
continue;
|
2012-02-06 14:57:38 +01:00
|
|
|
Size aChildSize = pChild->get_preferred_size();
|
2012-02-01 10:49:43 +00:00
|
|
|
|
|
|
|
sal_Int32 nWidth = pChild->getWidgetProperty<sal_Int32>(sWidth, 1);
|
|
|
|
for (sal_Int32 nSpanX = 0; nSpanX < nWidth; ++nSpanX)
|
|
|
|
rWidths[x+nSpanX] = std::max(rWidths[x+nSpanX], aChildSize.Width()/nWidth);
|
|
|
|
|
|
|
|
sal_Int32 nHeight = pChild->getWidgetProperty<sal_Int32>(sHeight, 1);
|
|
|
|
for (sal_Int32 nSpanY = 0; nSpanY < nHeight; ++nSpanY)
|
|
|
|
rHeights[y+nSpanY] = std::max(rHeights[y+nSpanY], aChildSize.Height()/nHeight);
|
2012-02-01 10:12:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
Size VclGrid::calculateRequisition() const
|
2012-02-01 10:12:42 +00:00
|
|
|
{
|
|
|
|
array_type A = assembleGrid();
|
|
|
|
|
|
|
|
if (isNullGrid(A))
|
|
|
|
return Size();
|
|
|
|
|
|
|
|
std::vector<long> aWidths;
|
|
|
|
std::vector<long> aHeights;
|
|
|
|
calcMaxs(A, aWidths, aHeights);
|
|
|
|
|
|
|
|
long nTotalWidth = 0;
|
|
|
|
if (get_column_homogeneous())
|
|
|
|
{
|
|
|
|
nTotalWidth = *std::max_element(aWidths.begin(), aWidths.end());
|
|
|
|
nTotalWidth *= aWidths.size();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nTotalWidth = std::accumulate(aWidths.begin(), aWidths.end(), 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
nTotalWidth += get_column_spacing() * (aWidths.size()-1);
|
|
|
|
|
|
|
|
long nTotalHeight = 0;
|
|
|
|
if (get_row_homogeneous())
|
|
|
|
{
|
|
|
|
nTotalHeight = *std::max_element(aHeights.begin(), aHeights.end());
|
|
|
|
nTotalHeight *= aHeights.size();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nTotalHeight = std::accumulate(aHeights.begin(), aHeights.end(), 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
nTotalHeight += get_row_spacing() * (aHeights.size()-1);
|
|
|
|
|
|
|
|
return Size(nTotalWidth, nTotalHeight);
|
|
|
|
}
|
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
void VclGrid::setAllocation(const Size& rAllocation)
|
2012-02-01 10:12:42 +00:00
|
|
|
{
|
|
|
|
array_type A = assembleGrid();
|
|
|
|
|
|
|
|
if (isNullGrid(A))
|
|
|
|
return;
|
|
|
|
|
|
|
|
sal_Int32 nMaxX = A.shape()[0];
|
|
|
|
sal_Int32 nMaxY = A.shape()[1];
|
|
|
|
|
|
|
|
Size aRequisition;
|
|
|
|
std::vector<long> aWidths(nMaxX);
|
|
|
|
std::vector<long> aHeights(nMaxY);
|
|
|
|
if (!get_column_homogeneous() || !get_row_homogeneous())
|
|
|
|
{
|
|
|
|
aRequisition = calculateRequisition();
|
|
|
|
calcMaxs(A, aWidths, aHeights);
|
|
|
|
}
|
|
|
|
|
|
|
|
long nAvailableWidth = rAllocation.Width() - (get_column_spacing() * nMaxX);
|
|
|
|
if (get_column_homogeneous())
|
|
|
|
std::fill(aWidths.begin(), aWidths.end(), nAvailableWidth/nMaxX);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
long nExtraWidth = (rAllocation.Width() - aRequisition.Width()) / nMaxX;
|
|
|
|
for (sal_Int32 x = 0; x < nMaxX; ++x)
|
|
|
|
aWidths[x] += nExtraWidth;
|
|
|
|
}
|
|
|
|
|
|
|
|
long nAvailableHeight = rAllocation.Height() - (get_row_spacing() * nMaxY);
|
|
|
|
if (get_row_homogeneous())
|
|
|
|
std::fill(aHeights.begin(), aHeights.end(), nAvailableHeight/nMaxY);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
long nExtraHeight = (rAllocation.Height() - aRequisition.Height()) / nMaxY;
|
|
|
|
for (sal_Int32 y = 0; y < nMaxY; ++y)
|
|
|
|
aHeights[y] += nExtraHeight;
|
|
|
|
}
|
|
|
|
|
2012-02-01 10:49:43 +00:00
|
|
|
rtl::OString sWidth(RTL_CONSTASCII_STRINGPARAM("width"));
|
|
|
|
rtl::OString sHeight(RTL_CONSTASCII_STRINGPARAM("height"));
|
|
|
|
|
2012-02-01 10:12:42 +00:00
|
|
|
Point aPosition(0, 0);
|
|
|
|
for (sal_Int32 x = 0; x < nMaxX; ++x)
|
|
|
|
{
|
|
|
|
for (sal_Int32 y = 0; y < nMaxY; ++y)
|
|
|
|
{
|
|
|
|
Window *pChild = A[x][y];
|
|
|
|
if (pChild)
|
2012-02-01 10:49:43 +00:00
|
|
|
{
|
2012-06-07 16:54:09 +01:00
|
|
|
Size aChildSize(0, 0);
|
|
|
|
|
2012-02-01 10:49:43 +00:00
|
|
|
sal_Int32 nWidth = pChild->getWidgetProperty<sal_Int32>(sWidth, 1);
|
2012-06-07 16:54:09 +01:00
|
|
|
for (sal_Int32 nSpanX = 0; nSpanX < nWidth; ++nSpanX)
|
|
|
|
aChildSize.Width() += aWidths[x+nSpanX];
|
|
|
|
aChildSize.Width() += get_column_spacing()*(nWidth-1);
|
|
|
|
|
2012-02-01 10:49:43 +00:00
|
|
|
sal_Int32 nHeight = pChild->getWidgetProperty<sal_Int32>(sHeight, 1);
|
2012-06-07 16:54:09 +01:00
|
|
|
for (sal_Int32 nSpanY = 0; nSpanY < nHeight; ++nSpanY)
|
|
|
|
aChildSize.Height() += aHeights[y+nSpanY];
|
|
|
|
aChildSize.Height() += get_row_spacing()*(nHeight-1);
|
|
|
|
|
|
|
|
pChild->SetPosSizePixel(aPosition, aChildSize);
|
2012-02-01 10:49:43 +00:00
|
|
|
}
|
2012-02-01 10:12:42 +00:00
|
|
|
aPosition.Y() += aHeights[y] + get_row_spacing();
|
|
|
|
}
|
|
|
|
aPosition.X() += aWidths[x] + get_column_spacing();
|
|
|
|
aPosition.Y() = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-16 11:05:57 +01:00
|
|
|
bool toBool(const rtl::OString &rValue)
|
|
|
|
{
|
|
|
|
return (rValue[0] == 't' || rValue[0] == 'T' || rValue[0] == '1');
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VclGrid::set_property(const rtl::OString &rKey, const rtl::OString &rValue)
|
|
|
|
{
|
|
|
|
if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("row-spacing")))
|
|
|
|
set_row_spacing(rValue.toInt32());
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("column-spacing")))
|
2012-06-07 15:51:23 +01:00
|
|
|
set_column_spacing(rValue.toInt32());
|
2012-04-16 11:05:57 +01:00
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("row-homogeneous")))
|
|
|
|
set_row_homogeneous(toBool(rValue));
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("column-homogeneous")))
|
|
|
|
set_column_homogeneous(toBool(rValue));
|
2012-04-30 09:53:09 +01:00
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("n-rows")))
|
|
|
|
/*nothing to do*/;
|
2012-04-16 11:05:57 +01:00
|
|
|
else
|
2012-06-06 10:46:49 +01:00
|
|
|
return VclContainer::set_property(rKey, rValue);
|
2012-04-16 11:05:57 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-02-06 19:30:22 +00:00
|
|
|
void setGridAttach(Window &rWidget, sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nWidth, sal_Int32 nHeight)
|
|
|
|
{
|
|
|
|
rtl::OString sLeftAttach(RTL_CONSTASCII_STRINGPARAM("left-attach"));
|
|
|
|
rWidget.setChildProperty<sal_Int32>(sLeftAttach, nLeft);
|
|
|
|
rtl::OString sTopAttach(RTL_CONSTASCII_STRINGPARAM("top-attach"));
|
|
|
|
rWidget.setChildProperty<sal_Int32>(sTopAttach, nTop);
|
|
|
|
rtl::OString sWidth(RTL_CONSTASCII_STRINGPARAM("width"));
|
|
|
|
rWidget.setChildProperty<sal_Int32>(sWidth, nWidth);
|
|
|
|
rtl::OString sHeight(RTL_CONSTASCII_STRINGPARAM("height"));
|
|
|
|
rWidget.setChildProperty<sal_Int32>(sHeight, nHeight);
|
|
|
|
}
|
|
|
|
|
2012-04-16 10:12:57 +01:00
|
|
|
const Window *VclBin::get_child() const
|
|
|
|
{
|
|
|
|
const WindowImpl* pWindowImpl = ImplGetWindowImpl();
|
|
|
|
|
2012-05-18 15:54:03 +01:00
|
|
|
return pWindowImpl->mpFirstChild;
|
2012-04-16 10:12:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Window *VclBin::get_child()
|
|
|
|
{
|
|
|
|
return const_cast<Window*>(const_cast<const VclBin*>(this)->get_child());
|
|
|
|
}
|
|
|
|
|
2012-06-07 15:11:02 +01:00
|
|
|
Size VclBin::calculateRequisition() const
|
|
|
|
{
|
|
|
|
const Window *pChild = get_child();
|
|
|
|
if (pChild && pChild->IsVisible())
|
|
|
|
return pChild->GetOptimalSize(WINDOWSIZE_PREFERRED);
|
|
|
|
return Size(0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void VclBin::setAllocation(const Size &rAllocation)
|
|
|
|
{
|
|
|
|
Window *pChild = get_child();
|
|
|
|
if (pChild && pChild->IsVisible())
|
|
|
|
pChild->SetPosSizePixel(Point(0, 0), rAllocation);
|
|
|
|
}
|
|
|
|
|
2012-04-11 11:41:54 +01:00
|
|
|
//To-Do, hook a DecorationView into VclFrame ?
|
|
|
|
|
|
|
|
Size VclFrame::calculateRequisition() const
|
|
|
|
{
|
|
|
|
Size aRet(0, 0);
|
|
|
|
|
|
|
|
WindowImpl* pWindowImpl = ImplGetWindowImpl();
|
|
|
|
|
2012-04-16 10:12:57 +01:00
|
|
|
const Window *pChild = get_child();
|
2012-05-18 15:54:03 +01:00
|
|
|
const Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild : NULL;
|
2012-04-11 11:41:54 +01:00
|
|
|
|
|
|
|
if (pChild && pChild->IsVisible())
|
|
|
|
aRet = pChild->GetOptimalSize(WINDOWSIZE_PREFERRED);
|
|
|
|
|
|
|
|
if (pLabel && pLabel->IsVisible())
|
|
|
|
{
|
|
|
|
Size aLabelSize = pLabel->GetOptimalSize(WINDOWSIZE_PREFERRED);
|
|
|
|
aRet.Height() += aLabelSize.Height();
|
|
|
|
aRet.Width() = std::max(aLabelSize.Width(), aRet.Width());
|
|
|
|
}
|
|
|
|
|
2012-05-18 13:48:13 +01:00
|
|
|
const FrameStyle &rFrameStyle =
|
|
|
|
GetSettings().GetStyleSettings().GetFrameStyle();
|
|
|
|
aRet.Width() += rFrameStyle.left + rFrameStyle.right;
|
|
|
|
aRet.Height() += rFrameStyle.top + rFrameStyle.bottom;
|
|
|
|
|
2012-04-11 11:41:54 +01:00
|
|
|
return aRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VclFrame::setAllocation(const Size &rAllocation)
|
|
|
|
{
|
2012-05-18 13:48:13 +01:00
|
|
|
const FrameStyle &rFrameStyle =
|
|
|
|
GetSettings().GetStyleSettings().GetFrameStyle();
|
|
|
|
Size aAllocation(rAllocation.Width() - rFrameStyle.left - rFrameStyle.right,
|
|
|
|
rAllocation.Height() - rFrameStyle.top - rFrameStyle.bottom);
|
|
|
|
Point aChildPos(rFrameStyle.left, rFrameStyle.top);
|
2012-04-11 11:41:54 +01:00
|
|
|
|
|
|
|
WindowImpl* pWindowImpl = ImplGetWindowImpl();
|
|
|
|
|
|
|
|
//The label widget is the last (of two) children
|
2012-04-16 10:12:57 +01:00
|
|
|
Window *pChild = get_child();
|
2012-05-18 15:54:03 +01:00
|
|
|
Window *pLabel = pChild != pWindowImpl->mpLastChild ? pWindowImpl->mpLastChild : NULL;
|
2012-04-11 11:41:54 +01:00
|
|
|
|
|
|
|
if (pLabel && pLabel->IsVisible())
|
|
|
|
{
|
|
|
|
Size aLabelSize = pLabel->GetOptimalSize(WINDOWSIZE_PREFERRED);
|
|
|
|
aLabelSize.Height() = std::min(aLabelSize.Height(), aAllocation.Height());
|
|
|
|
aLabelSize.Width() = std::min(aLabelSize.Width(), aAllocation.Width());
|
|
|
|
pLabel->SetPosSizePixel(aChildPos, aLabelSize);
|
|
|
|
aAllocation.Height() -= aLabelSize.Height();
|
|
|
|
aChildPos.Y() += aLabelSize.Height();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pChild && pChild->IsVisible())
|
|
|
|
pChild->SetPosSizePixel(aChildPos, aAllocation);
|
|
|
|
}
|
|
|
|
|
2012-04-16 10:12:57 +01:00
|
|
|
Size VclAlignment::calculateRequisition() const
|
|
|
|
{
|
|
|
|
Size aRet(m_nLeftPadding + m_nRightPadding,
|
|
|
|
m_nTopPadding + m_nBottomPadding);
|
|
|
|
|
|
|
|
const Window *pChild = get_child();
|
|
|
|
if (pChild && pChild->IsVisible())
|
|
|
|
{
|
|
|
|
Size aChildSize = pChild->GetOptimalSize(WINDOWSIZE_PREFERRED);
|
|
|
|
aRet.Width() += aChildSize.Width();
|
|
|
|
aRet.Height() += aChildSize.Height();
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VclAlignment::setAllocation(const Size &rAllocation)
|
|
|
|
{
|
|
|
|
Window *pChild = get_child();
|
|
|
|
if (!pChild || !pChild->IsVisible())
|
|
|
|
return;
|
|
|
|
|
|
|
|
Point aChildPos(m_nLeftPadding, m_nTopPadding);
|
|
|
|
|
|
|
|
Size aAllocation;
|
|
|
|
aAllocation.Width() = rAllocation.Width() - (m_nLeftPadding + m_nRightPadding);
|
|
|
|
aAllocation.Height() = rAllocation.Height() - (m_nTopPadding + m_nBottomPadding);
|
|
|
|
|
|
|
|
pChild->SetPosSizePixel(aChildPos, aAllocation);
|
|
|
|
}
|
|
|
|
|
2012-04-16 10:50:23 +01:00
|
|
|
bool VclAlignment::set_property(const rtl::OString &rKey, const rtl::OString &rValue)
|
|
|
|
{
|
|
|
|
if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("bottom-padding")))
|
|
|
|
m_nBottomPadding = rValue.toInt32();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("left-padding")))
|
|
|
|
m_nLeftPadding = rValue.toInt32();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("right-padding")))
|
|
|
|
m_nRightPadding = rValue.toInt32();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("top-padding")))
|
|
|
|
m_nTopPadding = rValue.toInt32();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("xalign")))
|
|
|
|
m_fXAlign = rValue.toFloat();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("xscale")))
|
|
|
|
m_fXScale = rValue.toFloat();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("yalign")))
|
|
|
|
m_fYAlign = rValue.toFloat();
|
|
|
|
else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("yscale")))
|
|
|
|
m_fYScale = rValue.toFloat();
|
|
|
|
else
|
2012-06-06 10:46:49 +01:00
|
|
|
return VclBin::set_property(rKey, rValue);
|
2012-04-16 10:50:23 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-12-01 11:49:36 +00:00
|
|
|
Size getLegacyBestSizeForChildren(const Window &rWindow)
|
|
|
|
{
|
|
|
|
Rectangle aBounds;
|
|
|
|
|
2012-04-16 10:12:57 +01:00
|
|
|
for (const Window* pChild = rWindow.GetWindow(WINDOW_FIRSTCHILD); pChild;
|
2011-12-01 11:49:36 +00:00
|
|
|
pChild = pChild->GetWindow(WINDOW_NEXT))
|
|
|
|
{
|
|
|
|
if (!pChild->IsVisible())
|
|
|
|
continue;
|
|
|
|
|
|
|
|
Rectangle aChildBounds(pChild->GetPosPixel(), pChild->GetSizePixel());
|
|
|
|
aBounds.Union(aChildBounds);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aBounds.IsEmpty())
|
|
|
|
return rWindow.GetSizePixel();
|
|
|
|
|
|
|
|
Size aRet(aBounds.GetSize());
|
|
|
|
Point aTopLeft(aBounds.TopLeft());
|
|
|
|
aRet.Width() += aTopLeft.X()*2;
|
|
|
|
aRet.Height() += aTopLeft.Y()*2;
|
|
|
|
|
|
|
|
return aRet;
|
|
|
|
}
|
2011-11-15 16:38:47 +00:00
|
|
|
|
2012-03-21 11:26:30 +00:00
|
|
|
Window* getLegacyNonLayoutParent(Window *pParent)
|
|
|
|
{
|
|
|
|
while (pParent && dynamic_cast<const VclContainer*>(pParent))
|
|
|
|
{
|
|
|
|
pParent = pParent->GetParent();
|
|
|
|
}
|
|
|
|
return pParent;
|
|
|
|
}
|
|
|
|
|
2011-11-09 22:58:42 +00:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|