/************************************************************** * * 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 #include #include #include #include #include // ======================================================================= 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(); }