blob: 307a0a23f35d881920df56f5d8eda963f8e956ca [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <awt/vclxbutton.hxx>
#include <tools/debug.hxx>
#include <toolkit/awt/vclxwindows.hxx>
#include <vcl/button.hxx>
#include "dialogbuttonhbox.hxx"
#include "flow.hxx"
#include "proplist.hxx"
#if TEST_LAYOUT && !defined( DBG_UTIL )
#undef DBG_ERROR
#define DBG_ERROR OSL_TRACE
#undef DBG_ERROR1
#define DBG_ERROR1 OSL_TRACE
#undef DBG_ERROR2
#define DBG_ERROR2 OSL_TRACE
#endif /* TEST_LAYOUT && !DBG_UTIL */
namespace layoutimpl
{
using namespace css;
//FIXME: how to set platform-dependant variables?
DialogButtonHBox::Ordering const DialogButtonHBox::DEFAULT_ORDERING =
#if defined( MACOSX )
DialogButtonHBox::MACOS;
#elif defined( SAL_W32 )
DialogButtonHBox::WINDOWS;
#elif defined( ENABLE_KDE )
DialogButtonHBox::KDE;
#else /* !MACOSX && !SAL_W32 && !ENABLE_KDE */
DialogButtonHBox::GNOME;
#endif /* !MACOSX && !SAL_W32 && !ENABLE_KDE */
DialogButtonHBox::DialogButtonHBox()
: HBox()
, mnOrdering( DEFAULT_ORDERING )
, mFlow()
, mpAction( 0 )
, mpAffirmative( 0 )
, mpAlternate( 0 )
, mpApply( 0 )
, mpCancel( 0 )
, mpFlow( createChild( uno::Reference< awt::XLayoutConstrains > ( &mFlow ) ) )
, mpHelp( 0 )
, mpReset( 0 )
{
mbHomogeneous = true;
}
void
DialogButtonHBox::setOrdering( rtl::OUString const& ordering )
{
if ( ordering.equalsIgnoreAsciiCaseAscii( "GNOME" ) )
mnOrdering = GNOME;
else if ( ordering.equalsIgnoreAsciiCaseAscii( "KDE" ) )
mnOrdering = KDE;
else if ( ordering.equalsIgnoreAsciiCaseAscii( "MacOS" ) )
mnOrdering = MACOS;
else if ( ordering.equalsIgnoreAsciiCaseAscii( "Windows" ) )
mnOrdering = WINDOWS;
else
{
DBG_ERROR1( "DialogButtonHBox: no such ordering: %s", OUSTRING_CSTR( ordering ) );
}
}
void
DialogButtonHBox::addChild( uno::Reference< awt::XLayoutConstrains > const& xChild )
throw ( uno::RuntimeException, awt::MaxChildrenException )
{
if ( !xChild.is() )
return;
ChildData *p = createChild( xChild );
#define IS_BUTTON(t) dynamic_cast<VCLX##t##Button *>( xChild.get () )
/* Sort Retry as Action */
if ( !mpAction && IS_BUTTON( Retry ) )
mpAction = p;
else if ( !mpAffirmative && IS_BUTTON( OK ) )
mpAffirmative = p;
else if ( !mpAffirmative && IS_BUTTON( Yes ) )
mpAffirmative = p;
else if ( !mpAlternate && IS_BUTTON( No ) )
mpAlternate = p;
/* Sort Ignore as Alternate */
else if ( !mpAlternate && IS_BUTTON( Ignore ) )
mpAlternate = p;
else if ( !mpApply && IS_BUTTON( Apply ) )
mpApply = p;
else if ( !mpCancel && IS_BUTTON( Cancel ) )
mpCancel = p;
/* Let the user overwrite Flow */
else if ( /* !mpFlow && */ dynamic_cast<Flow *>( xChild.get () ) )
mpFlow = p;
else if ( !mpHelp && IS_BUTTON( Help ) )
mpHelp = p;
else if ( !mpReset && IS_BUTTON( Reset ) )
mpReset = p;
else
maOther.push_back( p );
orderChildren();
setChildParent( xChild );
queueResize();
}
void
DialogButtonHBox::orderChildren()
{
if ( mnOrdering == WINDOWS )
windowsOrdering();
else if ( mnOrdering == MACOS )
macosOrdering();
else if ( mnOrdering == KDE )
kdeOrdering();
else if ( 1 || mnOrdering == GNOME )
gnomeOrdering();
}
void SAL_CALL
DialogButtonHBox::removeChild( uno::Reference< awt::XLayoutConstrains > const& xChild )
throw ( uno::RuntimeException)
{
if ( !xChild.is ())
return;
Box_Base::ChildData *p = 0;
if ( mpAction && mpAction->mxChild == xChild )
p = mpAction;
else if ( mpAffirmative && mpAffirmative->mxChild == xChild )
p = mpAffirmative;
else if ( mpAlternate && mpAlternate->mxChild == xChild )
p = mpAlternate;
else if ( mpApply && mpApply->mxChild == xChild )
p = mpApply;
else if ( mpCancel && mpCancel->mxChild == xChild )
p = mpCancel;
else if ( mpFlow && mpFlow->mxChild == xChild )
p = mpFlow;
else if ( mpReset && mpReset->mxChild == xChild )
p = mpReset;
else if ( mpHelp && mpHelp->mxChild == xChild )
p = mpHelp;
else
p = removeChildData( maOther, xChild );
if ( p )
{
delete p;
unsetChildParent( xChild );
orderChildren();
queueResize();
}
else
{
DBG_ERROR( "DialogButtonHBox: removeChild: no such child" );
}
}
void
DialogButtonHBox::gnomeOrdering()
{
std::list< Box_Base::ChildData * > ordered;
if ( mpHelp )
ordered.push_back( mpHelp );
if ( mpReset )
ordered.push_back( mpReset );
if ( mpFlow && ( mpHelp || mpReset ) )
ordered.push_back( mpFlow );
ordered.insert( ordered.end(), maOther.begin(), maOther.end() );
if ( mpAction )
ordered.push_back( mpAction );
if ( mpApply )
ordered.push_back( mpApply );
if ( mpAlternate )
ordered.push_back( mpAlternate );
if ( mpCancel )
ordered.push_back( mpCancel );
if ( mpAffirmative )
ordered.push_back( mpAffirmative );
maChildren = ordered;
}
void
DialogButtonHBox::kdeOrdering()
{
std::list< Box_Base::ChildData * > ordered;
if ( mpHelp )
ordered.push_back( mpHelp );
if ( mpReset )
ordered.push_back( mpReset );
if ( mpFlow && ( mpHelp || mpReset ) )
ordered.push_back( mpFlow );
ordered.insert( ordered.end(), maOther.begin(), maOther.end() );
if ( mpAction )
ordered.push_back( mpAction );
if ( mpAffirmative )
ordered.push_back( mpAffirmative );
if ( mpApply )
ordered.push_back( mpApply );
if ( mpAlternate )
ordered.push_back( mpAlternate );
if ( mpCancel )
ordered.push_back( mpCancel );
maChildren = ordered;
}
void
DialogButtonHBox::macosOrdering()
{
std::list< Box_Base::ChildData * > ordered;
if ( mpHelp )
ordered.push_back( mpHelp );
if ( mpReset )
ordered.push_back( mpReset );
if ( mpApply )
ordered.push_back( mpApply );
if ( mpAction )
ordered.push_back( mpAction );
ordered.insert( ordered.end(), maOther.begin(), maOther.end() );
if ( mpFlow ) // Always flow? && ( maOther.size () || mpHelp || mpReset || mpAction ) )
ordered.push_back( mpFlow );
if ( mpAlternate )
ordered.push_back( mpAlternate );
if ( mpFlow && mpAlternate )
ordered.push_back( mpFlow );
if ( mpCancel )
ordered.push_back( mpCancel );
if ( mpAffirmative )
ordered.push_back( mpAffirmative );
maChildren = ordered;
}
void
DialogButtonHBox::windowsOrdering()
{
std::list< Box_Base::ChildData * > ordered;
if ( mpReset )
ordered.push_back( mpReset );
if ( mpReset && mpFlow )
ordered.push_back( mpFlow );
if ( mpAffirmative )
ordered.push_back( mpAffirmative );
if ( mpAlternate )
ordered.push_back( mpAlternate );
if ( mpAction )
ordered.push_back( mpAction );
if ( mpCancel )
ordered.push_back( mpCancel );
if ( mpApply )
ordered.push_back( mpApply );
ordered.insert( ordered.end(), maOther.begin(), maOther.end() );
if ( mpHelp )
ordered.push_back( mpHelp );
maChildren = ordered;
}
} // namespace layoutimpl