1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_vcl.hxx" 30 #include <vcl/fixed.hxx> 31 #include <vcl/tabctrl.hxx> 32 #include <vcl/tabdlg.hxx> 33 #ifndef _SV_RC_H 34 #include <tools/rc.h> 35 #endif 36 37 38 39 // ======================================================================= 40 41 void TabDialog::ImplInitTabDialogData() 42 { 43 mpFixedLine = NULL; 44 mpViewWindow = NULL; 45 meViewAlign = WINDOWALIGN_LEFT; 46 mbPosControls = sal_True; 47 } 48 49 // ----------------------------------------------------------------------- 50 51 void TabDialog::ImplPosControls() 52 { 53 Size aCtrlSize( IMPL_MINSIZE_BUTTON_WIDTH, IMPL_MINSIZE_BUTTON_HEIGHT ); 54 long nDownCtrl = 0; 55 long nOffY = 0; 56 TabControl* pTabControl = NULL; 57 58 Window* pChild = GetWindow( WINDOW_FIRSTCHILD ); 59 while ( pChild ) 60 { 61 if ( pChild->IsVisible() && (pChild != mpViewWindow) ) 62 { 63 if ( pChild->GetType() == WINDOW_TABCONTROL ) 64 pTabControl = (TabControl*)pChild; 65 else if ( pTabControl ) 66 { 67 long nTxtWidth = pChild->GetCtrlTextWidth( pChild->GetText() ); 68 nTxtWidth += IMPL_EXTRA_BUTTON_WIDTH; 69 if ( nTxtWidth > aCtrlSize.Width() ) 70 aCtrlSize.Width() = nTxtWidth; 71 long nTxtHeight = pChild->GetTextHeight(); 72 nTxtHeight += IMPL_EXTRA_BUTTON_HEIGHT; 73 if ( nTxtHeight > aCtrlSize.Height() ) 74 aCtrlSize.Height() = nTxtHeight; 75 nDownCtrl++; 76 } 77 else 78 { 79 long nHeight = pChild->GetSizePixel().Height(); 80 if ( nHeight > nOffY ) 81 nOffY = nHeight; 82 } 83 } 84 85 pChild = pChild->GetWindow( WINDOW_NEXT ); 86 } 87 88 // Haben wir ueberhaupt ein TabControl 89 if ( pTabControl ) 90 { 91 // Offset bei weiteren Controls um einen weiteren Abstand anpassen 92 if ( nOffY ) 93 nOffY += IMPL_DIALOG_BAR_OFFSET*2 + 2; 94 95 Point aTabOffset( IMPL_DIALOG_OFFSET, IMPL_DIALOG_OFFSET+nOffY ); 96 Size aTabSize = pTabControl->GetSizePixel(); 97 Size aDlgSize( aTabSize.Width() + IMPL_DIALOG_OFFSET*2, 98 aTabSize.Height() + IMPL_DIALOG_OFFSET*2 + nOffY ); 99 long nBtnEx = 0; 100 101 // Preview-Fenster beruecksichtigen und die Groessen/Offsets anpassen 102 if ( mpViewWindow && mpViewWindow->IsVisible() ) 103 { 104 long nViewOffX = 0; 105 long nViewOffY = 0; 106 long nViewWidth = 0; 107 long nViewHeight = 0; 108 sal_uInt16 nViewPosFlags = WINDOW_POSSIZE_POS; 109 Size aViewSize = mpViewWindow->GetSizePixel(); 110 if ( meViewAlign == WINDOWALIGN_TOP ) 111 { 112 nViewOffX = aTabOffset.X(); 113 nViewOffY = nOffY+IMPL_DIALOG_OFFSET; 114 nViewWidth = aTabSize.Width(); 115 nViewPosFlags |= WINDOW_POSSIZE_WIDTH; 116 aTabOffset.Y() += aViewSize.Height()+IMPL_DIALOG_OFFSET; 117 aDlgSize.Height() += aViewSize.Height()+IMPL_DIALOG_OFFSET; 118 } 119 else if ( meViewAlign == WINDOWALIGN_BOTTOM ) 120 { 121 nViewOffX = aTabOffset.X(); 122 nViewOffY = aTabOffset.Y()+aTabSize.Height()+IMPL_DIALOG_OFFSET; 123 nViewWidth = aTabSize.Width(); 124 nViewPosFlags |= WINDOW_POSSIZE_WIDTH; 125 aDlgSize.Height() += aViewSize.Height()+IMPL_DIALOG_OFFSET; 126 } 127 else if ( meViewAlign == WINDOWALIGN_RIGHT ) 128 { 129 nViewOffX = aTabOffset.X()+aTabSize.Width()+IMPL_DIALOG_OFFSET; 130 nViewOffY = aTabOffset.Y(); 131 nViewHeight = aTabSize.Height(); 132 nViewPosFlags |= WINDOW_POSSIZE_HEIGHT; 133 aDlgSize.Width() += aViewSize.Width()+IMPL_DIALOG_OFFSET; 134 nBtnEx = aViewSize.Width()+IMPL_DIALOG_OFFSET; 135 } 136 else // meViewAlign == WINDOWALIGN_LEFT 137 { 138 nViewOffX = IMPL_DIALOG_OFFSET; 139 nViewOffY = aTabOffset.Y(); 140 nViewHeight = aTabSize.Height(); 141 nViewPosFlags |= WINDOW_POSSIZE_HEIGHT; 142 aTabOffset.X() += aViewSize.Width()+IMPL_DIALOG_OFFSET; 143 aDlgSize.Width() += aViewSize.Width()+IMPL_DIALOG_OFFSET; 144 nBtnEx = aViewSize.Width()+IMPL_DIALOG_OFFSET; 145 } 146 147 mpViewWindow->SetPosSizePixel( nViewOffX, nViewOffY, 148 nViewWidth, nViewHeight, 149 nViewPosFlags ); 150 } 151 152 // Positionierung vornehmen 153 pTabControl->SetPosPixel( aTabOffset ); 154 155 // Alle anderen Childs positionieren 156 sal_Bool bTabCtrl = sal_False; 157 int nLines = 0; 158 long nX; 159 long nY = aDlgSize.Height(); 160 long nTopX = IMPL_DIALOG_OFFSET; 161 162 // Unter Windows 95 werden die Buttons rechtsbuendig angeordnet 163 nX = IMPL_DIALOG_OFFSET; 164 long nCtrlBarWidth = ((aCtrlSize.Width()+IMPL_DIALOG_OFFSET)*nDownCtrl)-IMPL_DIALOG_OFFSET; 165 if ( nCtrlBarWidth <= (aTabSize.Width()+nBtnEx) ) 166 nX = (aTabSize.Width()+nBtnEx) - nCtrlBarWidth + IMPL_DIALOG_OFFSET; 167 168 Window* pChild2 = GetWindow( WINDOW_FIRSTCHILD ); 169 while ( pChild2 ) 170 { 171 if ( pChild2->IsVisible() && (pChild2 != mpViewWindow) ) 172 { 173 if ( pChild2 == pTabControl ) 174 bTabCtrl = sal_True; 175 else if ( bTabCtrl ) 176 { 177 if ( !nLines ) 178 nLines = 1; 179 180 if ( nX+aCtrlSize.Width()-IMPL_DIALOG_OFFSET > (aTabSize.Width()+nBtnEx) ) 181 { 182 nY += aCtrlSize.Height()+IMPL_DIALOG_OFFSET; 183 nX = IMPL_DIALOG_OFFSET; 184 nLines++; 185 } 186 187 pChild2->SetPosSizePixel( Point( nX, nY ), aCtrlSize ); 188 nX += aCtrlSize.Width()+IMPL_DIALOG_OFFSET; 189 } 190 else 191 { 192 Size aChildSize = pChild2->GetSizePixel(); 193 pChild2->SetPosPixel( Point( nTopX, (nOffY-aChildSize.Height())/2 ) ); 194 nTopX += aChildSize.Width()+2; 195 } 196 } 197 198 pChild2 = pChild2->GetWindow( WINDOW_NEXT ); 199 } 200 201 aDlgSize.Height() += nLines * (aCtrlSize.Height()+IMPL_DIALOG_OFFSET); 202 SetOutputSizePixel( aDlgSize ); 203 } 204 205 // Offset merken 206 if ( nOffY ) 207 { 208 Size aDlgSize = GetOutputSizePixel(); 209 if ( !mpFixedLine ) 210 mpFixedLine = new FixedLine( this ); 211 mpFixedLine->SetPosSizePixel( Point( 0, nOffY ), 212 Size( aDlgSize.Width(), 2 ) ); 213 mpFixedLine->Show(); 214 } 215 216 mbPosControls = sal_False; 217 } 218 219 // ----------------------------------------------------------------------- 220 221 TabDialog::TabDialog( Window* pParent, WinBits nStyle ) : 222 Dialog( WINDOW_TABDIALOG ) 223 { 224 ImplInitTabDialogData(); 225 ImplInit( pParent, nStyle ); 226 } 227 228 // ----------------------------------------------------------------------- 229 230 TabDialog::TabDialog( Window* pParent, const ResId& rResId ) : 231 Dialog( WINDOW_TABDIALOG ) 232 { 233 ImplInitTabDialogData(); 234 rResId.SetRT( RSC_TABDIALOG ); 235 ImplInit( pParent, ImplInitRes( rResId ) ); 236 ImplLoadRes( rResId ); 237 } 238 239 // ----------------------------------------------------------------------- 240 241 TabDialog::~TabDialog() 242 { 243 if ( mpFixedLine ) 244 delete mpFixedLine; 245 } 246 247 // ----------------------------------------------------------------------- 248 249 void TabDialog::Resize() 250 { 251 // !!! In the future the controls should be automaticly rearrange 252 // !!! if the window is resized 253 // !!! if ( !IsRollUp() ) 254 // !!! ImplPosControls(); 255 } 256 257 // ----------------------------------------------------------------------- 258 259 void TabDialog::StateChanged( StateChangedType nType ) 260 { 261 if ( nType == STATE_CHANGE_INITSHOW ) 262 { 263 // Calculate the Layout only for the initialized state 264 if ( mbPosControls ) 265 ImplPosControls(); 266 } 267 Dialog::StateChanged( nType ); 268 } 269 270 // ----------------------------------------------------------------------- 271 272 void TabDialog::AdjustLayout() 273 { 274 ImplPosControls(); 275 } 276 277