Files
libreoffice/vcl/source/window/tabdlg.cxx

291 lines
9.8 KiB
C++
Raw Normal View History

2000-09-18 16:07:07 +00:00
/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 16:07:07 +00:00
*
* $RCSfile: tabdlg.cxx,v $
2000-09-18 16:07:07 +00:00
*
* $Revision: 1.7 $
2000-09-18 16:07:07 +00:00
*
* last change: $Author: obo $ $Date: 2006-09-17 12:22:15 $
2000-09-18 16:07:07 +00:00
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
2000-09-18 16:07:07 +00:00
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
2000-09-18 16:07:07 +00:00
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
2000-09-18 16:07:07 +00:00
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
2000-09-18 16:07:07 +00:00
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
2000-09-18 16:07:07 +00:00
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_vcl.hxx"
2000-09-18 16:07:07 +00:00
#ifndef _SV_FIXED_HXX
#include <fixed.hxx>
#endif
#ifndef _SV_TABCTRL_HXX
#include <tabctrl.hxx>
#endif
#ifndef _SV_TABDLG_HXX
#include <tabdlg.hxx>
#endif
#ifndef _SV_RC_H
#include <tools/rc.h>
2000-09-18 16:07:07 +00:00
#endif
2000-09-18 16:07:07 +00:00
// =======================================================================
void TabDialog::ImplInitTabDialogData()
2000-09-18 16:07:07 +00:00
{
mpFixedLine = NULL;
mpViewWindow = NULL;
meViewAlign = WINDOWALIGN_LEFT;
mbPosControls = TRUE;
}
// -----------------------------------------------------------------------
void TabDialog::ImplPosControls()
{
Size aCtrlSize( IMPL_MINSIZE_BUTTON_WIDTH, IMPL_MINSIZE_BUTTON_HEIGHT );
long nDownCtrl = 0;
long nOffY = 0;
TabControl* pTabControl = NULL;
Window* pChild = GetWindow( WINDOW_FIRSTCHILD );
while ( pChild )
{
if ( pChild->IsVisible() && (pChild != mpViewWindow) )
{
if ( pChild->GetType() == WINDOW_TABCONTROL )
pTabControl = (TabControl*)pChild;
else if ( pTabControl )
{
long nTxtWidth = pChild->GetCtrlTextWidth( pChild->GetText() );
nTxtWidth += IMPL_EXTRA_BUTTON_WIDTH;
if ( nTxtWidth > aCtrlSize.Width() )
aCtrlSize.Width() = nTxtWidth;
long nTxtHeight = pChild->GetTextHeight();
nTxtHeight += IMPL_EXTRA_BUTTON_HEIGHT;
if ( nTxtHeight > aCtrlSize.Height() )
aCtrlSize.Height() = nTxtHeight;
nDownCtrl++;
}
else
{
long nHeight = pChild->GetSizePixel().Height();
if ( nHeight > nOffY )
nOffY = nHeight;
}
}
pChild = pChild->GetWindow( WINDOW_NEXT );
}
// Haben wir ueberhaupt ein TabControl
if ( pTabControl )
{
// Offset bei weiteren Controls um einen weiteren Abstand anpassen
if ( nOffY )
nOffY += IMPL_DIALOG_BAR_OFFSET*2 + 2;
Point aTabOffset( IMPL_DIALOG_OFFSET, IMPL_DIALOG_OFFSET+nOffY );
Size aTabSize = pTabControl->GetSizePixel();
Size aDlgSize( aTabSize.Width() + IMPL_DIALOG_OFFSET*2,
aTabSize.Height() + IMPL_DIALOG_OFFSET*2 + nOffY );
long nBtnEx = 0;
// Preview-Fenster beruecksichtigen und die Groessen/Offsets anpassen
if ( mpViewWindow && mpViewWindow->IsVisible() )
{
long nViewOffX = 0;
long nViewOffY = 0;
long nViewWidth = 0;
long nViewHeight = 0;
USHORT nViewPosFlags = WINDOW_POSSIZE_POS;
Size aViewSize = mpViewWindow->GetSizePixel();
if ( meViewAlign == WINDOWALIGN_TOP )
{
nViewOffX = aTabOffset.X();
nViewOffY = nOffY+IMPL_DIALOG_OFFSET;
nViewWidth = aTabSize.Width();
nViewPosFlags |= WINDOW_POSSIZE_WIDTH;
aTabOffset.Y() += aViewSize.Height()+IMPL_DIALOG_OFFSET;
aDlgSize.Height() += aViewSize.Height()+IMPL_DIALOG_OFFSET;
}
else if ( meViewAlign == WINDOWALIGN_BOTTOM )
{
nViewOffX = aTabOffset.X();
nViewOffY = aTabOffset.Y()+aTabSize.Height()+IMPL_DIALOG_OFFSET;
nViewWidth = aTabSize.Width();
nViewPosFlags |= WINDOW_POSSIZE_WIDTH;
aDlgSize.Height() += aViewSize.Height()+IMPL_DIALOG_OFFSET;
}
else if ( meViewAlign == WINDOWALIGN_RIGHT )
{
nViewOffX = aTabOffset.X()+aTabSize.Width()+IMPL_DIALOG_OFFSET;
nViewOffY = aTabOffset.Y();
nViewHeight = aTabSize.Height();
nViewPosFlags |= WINDOW_POSSIZE_HEIGHT;
aDlgSize.Width() += aViewSize.Width()+IMPL_DIALOG_OFFSET;
nBtnEx = aViewSize.Width()+IMPL_DIALOG_OFFSET;
}
else // meViewAlign == WINDOWALIGN_LEFT
{
nViewOffX = IMPL_DIALOG_OFFSET;
nViewOffY = aTabOffset.Y();
nViewHeight = aTabSize.Height();
nViewPosFlags |= WINDOW_POSSIZE_HEIGHT;
aTabOffset.X() += aViewSize.Width()+IMPL_DIALOG_OFFSET;
aDlgSize.Width() += aViewSize.Width()+IMPL_DIALOG_OFFSET;
nBtnEx = aViewSize.Width()+IMPL_DIALOG_OFFSET;
}
mpViewWindow->SetPosSizePixel( nViewOffX, nViewOffY,
nViewWidth, nViewHeight,
nViewPosFlags );
}
// Positionierung vornehmen
pTabControl->SetPosPixel( aTabOffset );
// Alle anderen Childs positionieren
BOOL bTabCtrl = FALSE;
int nLines = 0;
long nX;
long nY = aDlgSize.Height();
long nTopX = IMPL_DIALOG_OFFSET;
// Unter Windows 95 werden die Buttons rechtsbuendig angeordnet
nX = IMPL_DIALOG_OFFSET;
long nCtrlBarWidth = ((aCtrlSize.Width()+IMPL_DIALOG_OFFSET)*nDownCtrl)-IMPL_DIALOG_OFFSET;
if ( nCtrlBarWidth <= (aTabSize.Width()+nBtnEx) )
nX = (aTabSize.Width()+nBtnEx) - nCtrlBarWidth + IMPL_DIALOG_OFFSET;
Window* pChild2 = GetWindow( WINDOW_FIRSTCHILD );
while ( pChild2 )
2000-09-18 16:07:07 +00:00
{
if ( pChild2->IsVisible() && (pChild2 != mpViewWindow) )
2000-09-18 16:07:07 +00:00
{
if ( pChild2 == pTabControl )
2000-09-18 16:07:07 +00:00
bTabCtrl = TRUE;
else if ( bTabCtrl )
{
if ( !nLines )
nLines = 1;
if ( nX+aCtrlSize.Width()-IMPL_DIALOG_OFFSET > (aTabSize.Width()+nBtnEx) )
{
nY += aCtrlSize.Height()+IMPL_DIALOG_OFFSET;
nX = IMPL_DIALOG_OFFSET;
nLines++;
}
pChild2->SetPosSizePixel( Point( nX, nY ), aCtrlSize );
2000-09-18 16:07:07 +00:00
nX += aCtrlSize.Width()+IMPL_DIALOG_OFFSET;
}
else
{
Size aChildSize = pChild2->GetSizePixel();
pChild2->SetPosPixel( Point( nTopX, (nOffY-aChildSize.Height())/2 ) );
2000-09-18 16:07:07 +00:00
nTopX += aChildSize.Width()+2;
}
}
pChild2 = pChild2->GetWindow( WINDOW_NEXT );
2000-09-18 16:07:07 +00:00
}
aDlgSize.Height() += nLines * (aCtrlSize.Height()+IMPL_DIALOG_OFFSET);
SetOutputSizePixel( aDlgSize );
}
// Offset merken
if ( nOffY )
{
Size aDlgSize = GetOutputSizePixel();
if ( !mpFixedLine )
mpFixedLine = new FixedLine( this );
mpFixedLine->SetPosSizePixel( Point( 0, nOffY ),
Size( aDlgSize.Width(), 2 ) );
mpFixedLine->Show();
}
mbPosControls = FALSE;
}
// -----------------------------------------------------------------------
TabDialog::TabDialog( Window* pParent, WinBits nStyle ) :
Dialog( WINDOW_TABDIALOG )
{
ImplInitTabDialogData();
2000-09-18 16:07:07 +00:00
ImplInit( pParent, nStyle );
}
// -----------------------------------------------------------------------
TabDialog::TabDialog( Window* pParent, const ResId& rResId ) :
Dialog( WINDOW_TABDIALOG )
{
ImplInitTabDialogData();
2000-09-18 16:07:07 +00:00
rResId.SetRT( RSC_TABDIALOG );
ImplInit( pParent, ImplInitRes( rResId ) );
ImplLoadRes( rResId );
}
// -----------------------------------------------------------------------
TabDialog::~TabDialog()
{
if ( mpFixedLine )
delete mpFixedLine;
}
// -----------------------------------------------------------------------
void TabDialog::Resize()
{
// !!! In the future the controls should be automaticly rearrange
// !!! if the window is resized
// !!! if ( !IsRollUp() )
// !!! ImplPosControls();
}
// -----------------------------------------------------------------------
void TabDialog::StateChanged( StateChangedType nType )
{
if ( nType == STATE_CHANGE_INITSHOW )
{
// Calculate the Layout only for the initialized state
if ( mbPosControls )
ImplPosControls();
}
Dialog::StateChanged( nType );
}
// -----------------------------------------------------------------------
void TabDialog::AdjustLayout()
{
ImplPosControls();
}