blob: ed53060beaf8d80d7568ea2a2c1c32a58f6ba365 [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_vcl.hxx"
#include <tools/ref.hxx>
#include <tools/debug.hxx>
#include <tools/rc.h>
#include <svdata.hxx>
#include <vcl/button.hxx>
#include <vcl/btndlg.hxx>
// =======================================================================
struct ImplBtnDlgItem
{
sal_uInt16 mnId;
sal_Bool mbOwnButton;
sal_Bool mbDummyAlign;
long mnSepSize;
PushButton* mpPushButton;
};
DECLARE_LIST( ImplBtnDlgItemList, ImplBtnDlgItem* )
// =======================================================================
void ButtonDialog::ImplInitButtonDialogData()
{
mpItemList = new ImplBtnDlgItemList( 8, 8 );
mnButtonSize = 0;
mnCurButtonId = 0;
mnFocusButtonId = BUTTONDIALOG_BUTTON_NOTFOUND;
mbFormat = sal_True;
}
// -----------------------------------------------------------------------
ButtonDialog::ButtonDialog( WindowType nType ) :
Dialog( nType )
{
ImplInitButtonDialogData();
}
// -----------------------------------------------------------------------
ButtonDialog::ButtonDialog( Window* pParent, WinBits nStyle ) :
Dialog( WINDOW_BUTTONDIALOG )
{
ImplInitButtonDialogData();
ImplInit( pParent, nStyle );
}
// -----------------------------------------------------------------------
ButtonDialog::ButtonDialog( Window* pParent, const ResId& rResId ) :
Dialog( WINDOW_BUTTONDIALOG )
{
ImplInitButtonDialogData();
rResId.SetRT( RSC_DIALOG ); // !!!!!!!!!! RSC_BUTTONDIALOG !!!!!!!!
ImplInit( pParent, ImplInitRes( rResId ) );
ImplLoadRes( rResId );
}
// -----------------------------------------------------------------------
ButtonDialog::~ButtonDialog()
{
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
if ( pItem->mpPushButton && pItem->mbOwnButton )
delete pItem->mpPushButton;
delete pItem;
pItem = mpItemList->Next();
}
delete mpItemList;
}
// -----------------------------------------------------------------------
PushButton* ButtonDialog::ImplCreatePushButton( sal_uInt16 nBtnFlags )
{
PushButton* pBtn;
WinBits nStyle = 0;
if ( nBtnFlags & BUTTONDIALOG_DEFBUTTON )
nStyle |= WB_DEFBUTTON;
if ( nBtnFlags & BUTTONDIALOG_CANCELBUTTON )
pBtn = new CancelButton( this, nStyle );
else if ( nBtnFlags & BUTTONDIALOG_OKBUTTON )
pBtn = new OKButton( this, nStyle );
else if ( nBtnFlags & BUTTONDIALOG_HELPBUTTON )
pBtn = new HelpButton( this, nStyle );
else
pBtn = new PushButton( this, nStyle );
if ( !(nBtnFlags & BUTTONDIALOG_HELPBUTTON) )
pBtn->SetClickHdl( LINK( this, ButtonDialog, ImplClickHdl ) );
return pBtn;
}
// -----------------------------------------------------------------------
ImplBtnDlgItem* ButtonDialog::ImplGetItem( sal_uInt16 nId ) const
{
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
if ( pItem->mnId == nId )
return pItem;
pItem = mpItemList->Next();
}
return NULL;
}
// -----------------------------------------------------------------------
long ButtonDialog::ImplGetButtonSize()
{
if ( !mbFormat )
return mnButtonSize;
// Calculate ButtonSize
long nLastSepSize = 0;
long nSepSize = 0;
long nButtonCount = 0;
maCtrlSize = Size( IMPL_MINSIZE_BUTTON_WIDTH, IMPL_MINSIZE_BUTTON_HEIGHT );
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
nSepSize += nLastSepSize;
long nTxtWidth = pItem->mpPushButton->GetCtrlTextWidth( pItem->mpPushButton->GetText() );
nTxtWidth += IMPL_EXTRA_BUTTON_WIDTH;
if ( nTxtWidth > maCtrlSize.Width() )
maCtrlSize.Width() = nTxtWidth;
long nTxtHeight = pItem->mpPushButton->GetTextHeight();
nTxtHeight += IMPL_EXTRA_BUTTON_HEIGHT;
if ( nTxtHeight > maCtrlSize.Height() )
maCtrlSize.Height() = nTxtHeight;
nSepSize += pItem->mnSepSize;
if ( GetStyle() & WB_HORZ )
nLastSepSize = IMPL_SEP_BUTTON_X;
else
nLastSepSize = IMPL_SEP_BUTTON_Y;
nButtonCount++;
pItem = mpItemList->Next();
}
if ( GetStyle() & WB_HORZ )
mnButtonSize = nSepSize + (nButtonCount*maCtrlSize.Width());
else
mnButtonSize = nSepSize + (nButtonCount*maCtrlSize.Height());
return mnButtonSize;
}
// -----------------------------------------------------------------------
void ButtonDialog::ImplPosControls()
{
if ( !mbFormat )
return;
// Create PushButtons and determine Sizes
ImplGetButtonSize();
// determine dialog size
ImplBtnDlgItem* pItem;
Size aDlgSize = maPageSize;
long nX;
long nY;
if ( GetStyle() & WB_HORZ )
{
if ( mnButtonSize+(IMPL_DIALOG_OFFSET*2) > aDlgSize.Width() )
aDlgSize.Width() = mnButtonSize+(IMPL_DIALOG_OFFSET*2);
if ( GetStyle() & WB_LEFT )
nX = IMPL_DIALOG_OFFSET;
else if ( GetStyle() & WB_RIGHT )
nX = aDlgSize.Width()-mnButtonSize-IMPL_DIALOG_OFFSET;
else
nX = (aDlgSize.Width()-mnButtonSize)/2;
aDlgSize.Height() += IMPL_DIALOG_OFFSET+maCtrlSize.Height();
nY = aDlgSize.Height()-maCtrlSize.Height()-IMPL_DIALOG_OFFSET;
}
else
{
if ( mnButtonSize+(IMPL_DIALOG_OFFSET*2) > aDlgSize.Height() )
aDlgSize.Height() = mnButtonSize+(IMPL_DIALOG_OFFSET*2);
if ( GetStyle() & WB_BOTTOM )
nY = aDlgSize.Height()-mnButtonSize-IMPL_DIALOG_OFFSET;
else if ( GetStyle() & WB_VCENTER )
nY = (aDlgSize.Height()-mnButtonSize)/2;
else
nY = IMPL_DIALOG_OFFSET;
aDlgSize.Width() += IMPL_DIALOG_OFFSET+maCtrlSize.Width();
nX = aDlgSize.Width()-maCtrlSize.Width()-IMPL_DIALOG_OFFSET;
}
// Arrange PushButtons
pItem = mpItemList->First();
while ( pItem )
{
if ( GetStyle() & WB_HORZ )
nX += pItem->mnSepSize;
else
nY += pItem->mnSepSize;
pItem->mpPushButton->SetPosSizePixel( Point( nX, nY ), maCtrlSize );
pItem->mpPushButton->Show();
if ( GetStyle() & WB_HORZ )
nX += maCtrlSize.Width()+IMPL_SEP_BUTTON_X;
else
nY += maCtrlSize.Height()+IMPL_SEP_BUTTON_Y;
pItem = mpItemList->Next();
}
SetOutputSizePixel( aDlgSize );
mbFormat = sal_False;
}
// -----------------------------------------------------------------------
IMPL_LINK( ButtonDialog, ImplClickHdl, PushButton*, pBtn )
{
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
if ( pItem->mpPushButton == pBtn )
{
mnCurButtonId = pItem->mnId;
Click();
break;
}
pItem = mpItemList->Next();
}
return 0;
}
// -----------------------------------------------------------------------
void ButtonDialog::Resize()
{
}
// -----------------------------------------------------------------------
void ButtonDialog::StateChanged( StateChangedType nType )
{
if ( nType == STATE_CHANGE_INITSHOW )
{
ImplPosControls();
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
if ( pItem->mpPushButton && pItem->mbOwnButton )
pItem->mpPushButton->SetZOrder(0, WINDOW_ZORDER_LAST);
pItem = mpItemList->Next();
}
// Focus evt. auf den entsprechenden Button setzen
if ( mnFocusButtonId != BUTTONDIALOG_BUTTON_NOTFOUND )
{
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
if ( pItem->mnId == mnFocusButtonId )
{
if ( pItem->mpPushButton->IsVisible() )
pItem->mpPushButton->GrabFocus();
break;
}
pItem = mpItemList->Next();
}
}
}
Dialog::StateChanged( nType );
}
// -----------------------------------------------------------------------
void ButtonDialog::Click()
{
if ( !maClickHdl )
{
if ( IsInExecute() )
EndDialog( GetCurButtonId() );
}
else
maClickHdl.Call( this );
}
// -----------------------------------------------------------------------
void ButtonDialog::AddButton( const XubString& rText, sal_uInt16 nId,
sal_uInt16 nBtnFlags, long nSepPixel )
{
// PageItem anlegen
ImplBtnDlgItem* pItem = new ImplBtnDlgItem;
pItem->mnId = nId;
pItem->mbOwnButton = sal_True;
pItem->mnSepSize = nSepPixel;
pItem->mpPushButton = ImplCreatePushButton( nBtnFlags );
if ( rText.Len() )
pItem->mpPushButton->SetText( rText );
// In die Liste eintragen
mpItemList->Insert( pItem, LIST_APPEND );
if ( nBtnFlags & BUTTONDIALOG_FOCUSBUTTON )
mnFocusButtonId = nId;
mbFormat = sal_True;
}
// -----------------------------------------------------------------------
void ButtonDialog::AddButton( StandardButtonType eType, sal_uInt16 nId,
sal_uInt16 nBtnFlags, long nSepPixel )
{
// PageItem anlegen
ImplBtnDlgItem* pItem = new ImplBtnDlgItem;
pItem->mnId = nId;
pItem->mbOwnButton = sal_True;
pItem->mnSepSize = nSepPixel;
if ( eType == BUTTON_OK )
nBtnFlags |= BUTTONDIALOG_OKBUTTON;
else if ( eType == BUTTON_HELP )
nBtnFlags |= BUTTONDIALOG_HELPBUTTON;
else if ( (eType == BUTTON_CANCEL) || (eType == BUTTON_CLOSE) )
nBtnFlags |= BUTTONDIALOG_CANCELBUTTON;
pItem->mpPushButton = ImplCreatePushButton( nBtnFlags );
// Standard-Buttons have the right text already
if ( !((eType == BUTTON_OK) && (pItem->mpPushButton->GetType() == WINDOW_OKBUTTON)) ||
!((eType == BUTTON_CANCEL) && (pItem->mpPushButton->GetType() == WINDOW_CANCELBUTTON)) ||
!((eType == BUTTON_HELP) && (pItem->mpPushButton->GetType() == WINDOW_HELPBUTTON)) )
{
pItem->mpPushButton->SetText( Button::GetStandardText( eType ) );
pItem->mpPushButton->SetHelpText( Button::GetStandardHelpText( eType ) );
}
if ( nBtnFlags & BUTTONDIALOG_FOCUSBUTTON )
mnFocusButtonId = nId;
// In die Liste eintragen
mpItemList->Insert( pItem, LIST_APPEND );
mbFormat = sal_True;
}
// -----------------------------------------------------------------------
void ButtonDialog::AddButton( PushButton* pBtn, sal_uInt16 nId,
sal_uInt16 nBtnFlags, long nSepPixel )
{
// PageItem anlegen
ImplBtnDlgItem* pItem = new ImplBtnDlgItem;
pItem->mnId = nId;
pItem->mbOwnButton = sal_False;
pItem->mnSepSize = nSepPixel;
pItem->mpPushButton = pBtn;
if ( nBtnFlags & BUTTONDIALOG_FOCUSBUTTON )
mnFocusButtonId = nId;
// In die View-Liste eintragen
mpItemList->Insert( pItem, LIST_APPEND );
mbFormat = sal_True;
}
// -----------------------------------------------------------------------
void ButtonDialog::RemoveButton( sal_uInt16 nId )
{
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
if ( pItem->mnId == nId )
{
pItem->mpPushButton->Hide();
if ( pItem->mbOwnButton )
delete pItem->mpPushButton;
delete pItem;
mpItemList->Remove();
mbFormat = sal_True;
break;
}
pItem = mpItemList->Next();
}
DBG_ERRORFILE( "ButtonDialog::RemoveButton(): ButtonId invalid" );
}
// -----------------------------------------------------------------------
void ButtonDialog::Clear()
{
ImplBtnDlgItem* pItem = mpItemList->First();
while ( pItem )
{
pItem->mpPushButton->Hide();
if ( pItem->mbOwnButton )
delete pItem->mpPushButton;
delete pItem;
pItem = mpItemList->Next();
}
mpItemList->Clear();
mbFormat = sal_True;
}
// -----------------------------------------------------------------------
sal_uInt16 ButtonDialog::GetButtonCount() const
{
return (sal_uInt16)mpItemList->Count();
}
// -----------------------------------------------------------------------
sal_uInt16 ButtonDialog::GetButtonId( sal_uInt16 nButton ) const
{
if ( nButton < mpItemList->Count() )
return (sal_uInt16)mpItemList->GetObject( nButton )->mnId;
else
return BUTTONDIALOG_BUTTON_NOTFOUND;
}
// -----------------------------------------------------------------------
PushButton* ButtonDialog::GetPushButton( sal_uInt16 nId ) const
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
if ( pItem )
return pItem->mpPushButton;
else
return NULL;
}
// -----------------------------------------------------------------------
void ButtonDialog::SetButtonText( sal_uInt16 nId, const XubString& rText )
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
if ( pItem )
{
pItem->mpPushButton->SetText( rText );
mbFormat = sal_True;
}
}
// -----------------------------------------------------------------------
XubString ButtonDialog::GetButtonText( sal_uInt16 nId ) const
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
if ( pItem )
return pItem->mpPushButton->GetText();
else
return ImplGetSVEmptyStr();
}
// -----------------------------------------------------------------------
void ButtonDialog::SetButtonHelpText( sal_uInt16 nId, const XubString& rText )
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
if ( pItem )
pItem->mpPushButton->SetHelpText( rText );
}
// -----------------------------------------------------------------------
XubString ButtonDialog::GetButtonHelpText( sal_uInt16 nId ) const
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
if ( pItem )
return pItem->mpPushButton->GetHelpText();
else
return ImplGetSVEmptyStr();
}
// -----------------------------------------------------------------------
void ButtonDialog::SetButtonHelpId( sal_uInt16 nId, const rtl::OString& rHelpId )
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
if ( pItem )
pItem->mpPushButton->SetHelpId( rHelpId );
}
// -----------------------------------------------------------------------
rtl::OString ButtonDialog::GetButtonHelpId( sal_uInt16 nId ) const
{
ImplBtnDlgItem* pItem = ImplGetItem( nId );
return pItem ? rtl::OString( pItem->mpPushButton->GetHelpId() ) : rtl::OString();
}