1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svtools.hxx" 26 27 #define _SV_FIELCTRL_CXX 28 #include <tools/urlobj.hxx> 29 #include <svtools/svtdata.hxx> 30 #include <svtools/filectrl.hxx> 31 #include <filectrl.hrc> 32 33 // ======================================================================= 34 35 FileControl::FileControl( Window* pParent, WinBits nStyle, FileControlMode nFlags ) : 36 Window( pParent, nStyle|WB_DIALOGCONTROL ), 37 maEdit( this, (nStyle&(~WB_BORDER))|WB_NOTABSTOP ), 38 maButton( this, (nStyle&(~WB_BORDER))|WB_NOLIGHTBORDER|WB_NOPOINTERFOCUS|WB_NOTABSTOP ), 39 maButtonText( SvtResId( STR_FILECTRL_BUTTONTEXT ) ), 40 mnFlags( nFlags ), 41 mnInternalFlags( FILECTRL_ORIGINALBUTTONTEXT ) 42 { 43 maButton.SetClickHdl( LINK( this, FileControl, ButtonHdl ) ); 44 mbOpenDlg = sal_True; 45 46 maButton.Show(); 47 maEdit.Show(); 48 49 SetCompoundControl( sal_True ); 50 51 SetStyle( ImplInitStyle( GetStyle() ) ); 52 } 53 54 // ----------------------------------------------------------------------- 55 56 WinBits FileControl::ImplInitStyle( WinBits nStyle ) 57 { 58 if ( !( nStyle & WB_NOTABSTOP ) ) 59 { 60 maEdit.SetStyle( (maEdit.GetStyle()|WB_TABSTOP)&(~WB_NOTABSTOP) ); 61 maButton.SetStyle( (maButton.GetStyle()|WB_TABSTOP)&(~WB_NOTABSTOP) ); 62 } 63 else 64 { 65 maEdit.SetStyle( (maEdit.GetStyle()|WB_NOTABSTOP)&(~WB_TABSTOP) ); 66 maButton.SetStyle( (maButton.GetStyle()|WB_NOTABSTOP)&(~WB_TABSTOP) ); 67 } 68 69 const WinBits nAlignmentStyle = ( WB_TOP | WB_VCENTER | WB_BOTTOM ); 70 maEdit.SetStyle( ( maEdit.GetStyle() & ~nAlignmentStyle ) | ( nStyle & nAlignmentStyle ) ); 71 72 if ( !(nStyle & WB_NOGROUP) ) 73 nStyle |= WB_GROUP; 74 75 if ( !(nStyle & WB_NOBORDER ) ) 76 nStyle |= WB_BORDER; 77 78 nStyle &= ~WB_TABSTOP; 79 80 return nStyle; 81 } 82 83 // ----------------------------------------------------------------------- 84 85 FileControl::~FileControl() 86 { 87 } 88 89 // ----------------------------------------------------------------------- 90 91 void FileControl::SetText( const XubString& rStr ) 92 { 93 maEdit.SetText( rStr ); 94 if ( mnFlags & FILECTRL_RESIZEBUTTONBYPATHLEN ) 95 Resize(); 96 } 97 98 // ----------------------------------------------------------------------- 99 100 XubString FileControl::GetText() const 101 { 102 return maEdit.GetText(); 103 } 104 105 // ----------------------------------------------------------------------- 106 107 void FileControl::StateChanged( StateChangedType nType ) 108 { 109 if ( nType == STATE_CHANGE_ENABLE ) 110 { 111 maEdit.Enable( IsEnabled() ); 112 maButton.Enable( IsEnabled() ); 113 } 114 else if ( nType == STATE_CHANGE_ZOOM ) 115 { 116 GetEdit().SetZoom( GetZoom() ); 117 GetButton().SetZoom( GetZoom() ); 118 } 119 else if ( nType == STATE_CHANGE_STYLE ) 120 { 121 SetStyle( ImplInitStyle( GetStyle() ) ); 122 } 123 else if ( nType == STATE_CHANGE_CONTROLFONT ) 124 { 125 GetEdit().SetControlFont( GetControlFont() ); 126 // Fuer den Button nur die Hoehe uebernehmen, weil in 127 // HTML immer Courier eingestellt wird. 128 Font aFont = GetButton().GetControlFont(); 129 aFont.SetSize( GetControlFont().GetSize() ); 130 GetButton().SetControlFont( aFont ); 131 } 132 else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) 133 { 134 GetEdit().SetControlForeground( GetControlForeground() ); 135 GetButton().SetControlForeground( GetControlForeground() ); 136 } 137 else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) 138 { 139 GetEdit().SetControlBackground( GetControlBackground() ); 140 GetButton().SetControlBackground( GetControlBackground() ); 141 } 142 Window::StateChanged( nType ); 143 } 144 145 // ----------------------------------------------------------------------- 146 147 void FileControl::Resize() 148 { 149 static long ButtonBorder = 10; 150 151 if( mnInternalFlags & FILECTRL_INRESIZE ) 152 return; 153 mnInternalFlags |= FILECTRL_INRESIZE;//InResize = sal_True 154 155 Size aOutSz = GetOutputSizePixel(); 156 long nButtonTextWidth = maButton.GetTextWidth( maButtonText ); 157 if ( ((mnInternalFlags & FILECTRL_ORIGINALBUTTONTEXT) == 0) || 158 ( nButtonTextWidth < aOutSz.Width()/3 && 159 ( mnFlags & FILECTRL_RESIZEBUTTONBYPATHLEN 160 ? ( maEdit.GetTextWidth( maEdit.GetText() ) 161 <= aOutSz.Width() - nButtonTextWidth - ButtonBorder ) 162 : sal_True ) ) 163 ) 164 { 165 maButton.SetText( maButtonText ); 166 } 167 else 168 { 169 XubString aSmallText( RTL_CONSTASCII_USTRINGPARAM( "..." ) ); 170 maButton.SetText( aSmallText ); 171 nButtonTextWidth = maButton.GetTextWidth( aSmallText ); 172 } 173 174 long nButtonWidth = nButtonTextWidth+ButtonBorder; 175 maEdit.SetPosSizePixel( 0, 0, aOutSz.Width()-nButtonWidth, aOutSz.Height() ); 176 maButton.SetPosSizePixel( aOutSz.Width()-nButtonWidth, 0, nButtonWidth, aOutSz.Height() ); 177 178 mnInternalFlags &= ~FILECTRL_INRESIZE; //InResize = sal_False 179 } 180 181 // ----------------------------------------------------------------------- 182 183 IMPL_LINK( FileControl, ButtonHdl, PushButton*, EMPTYARG ) 184 { 185 ImplBrowseFile( ); 186 187 return 0; 188 } 189 190 // ----------------------------------------------------------------------- 191 192 void FileControl::GetFocus() 193 { 194 maEdit.GrabFocus(); 195 } 196 197 // ----------------------------------------------------------------------- 198 199 void FileControl::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) 200 { 201 WinBits nOldEditStyle = GetEdit().GetStyle(); 202 if ( GetStyle() & WB_BORDER ) 203 GetEdit().SetStyle( nOldEditStyle|WB_BORDER ); 204 GetEdit().Draw( pDev, rPos, rSize, nFlags ); 205 if ( GetStyle() & WB_BORDER ) 206 GetEdit().SetStyle( nOldEditStyle ); 207 } 208 209 // ----------------------------------------------------------------------- 210 211 void FileControl::SetButtonText( const XubString& rStr ) 212 { 213 mnInternalFlags &= ~FILECTRL_ORIGINALBUTTONTEXT; 214 maButtonText = rStr; 215 Resize(); 216 } 217 218 // ----------------------------------------------------------------------- 219 220 void FileControl::ResetButtonText() 221 { 222 mnInternalFlags |= FILECTRL_ORIGINALBUTTONTEXT; 223 maButtonText = XubString( SvtResId( STR_FILECTRL_BUTTONTEXT ) ); 224 Resize(); 225 } 226 227 228