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_cui.hxx" 26 27 #include "dbregister.hxx" 28 #include "dbregister.hrc" 29 #include "dbregistersettings.hxx" 30 #include "connpooloptions.hxx" 31 #include <svl/filenotation.hxx> 32 #include <cuires.hrc> 33 #include "helpid.hrc" 34 #include <svtools/editbrowsebox.hxx> 35 #include <cuires.hrc> 36 #include <vcl/field.hxx> 37 #include <svl/eitem.hxx> 38 #include <comphelper/processfactory.hxx> 39 #include <com/sun/star/uno/Exception.hpp> 40 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 41 #include <com/sun/star/ui/dialogs/XFilePicker.hpp> 42 #include <com/sun/star/ui/dialogs/XFilterManager.hpp> 43 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 44 #include <vcl/msgbox.hxx> 45 #include <svtools/svtabbx.hxx> 46 #include <svl/itemset.hxx> 47 #include "doclinkdialog.hxx" 48 #include <tools/urlobj.hxx> 49 #include <unotools/localfilehelper.hxx> 50 #include "optHeaderTabListbox.hxx" 51 #include <sfx2/docfilt.hxx> 52 #include <dialmgr.hxx> 53 #include "dbregisterednamesconfig.hxx" 54 #include <svx/dialogs.hrc> 55 56 #define TAB_WIDTH1 80 57 #define TAB_WIDTH_MIN 10 58 #define TAB_WIDTH2 1000 59 #define ITEMID_TYPE 1 60 #define ITEMID_PATH 2 61 //........................................................................ 62 namespace svx 63 { 64 //........................................................................ 65 66 using namespace ::com::sun::star::lang; 67 using namespace ::com::sun::star::ui::dialogs; 68 using namespace ::com::sun::star::uno; 69 using namespace ::svt; 70 71 // class RegistrationItemSetHolder ------------------------------------------------- 72 73 RegistrationItemSetHolder::RegistrationItemSetHolder( const SfxItemSet& _rMasterSet ) 74 :m_aRegistrationItems( _rMasterSet ) 75 { 76 DbRegisteredNamesConfig::GetOptions( m_aRegistrationItems ); 77 } 78 79 RegistrationItemSetHolder::~RegistrationItemSetHolder() 80 { 81 } 82 83 // class DatabaseRegistrationDialog ------------------------------------------------ 84 85 DatabaseRegistrationDialog::DatabaseRegistrationDialog( Window* pParent, const SfxItemSet& rInAttrs ) 86 :RegistrationItemSetHolder( rInAttrs ) 87 ,SfxSingleTabDialog( pParent, getRegistrationItems(), RID_SFXPAGE_DBREGISTER ) 88 { 89 SfxTabPage* page = DbRegistrationOptionsPage::Create( this, getRegistrationItems() ); 90 91 SetTabPage( page ); 92 SetText( page->GetText() ); 93 } 94 95 DatabaseRegistrationDialog::~DatabaseRegistrationDialog() 96 { 97 } 98 99 short DatabaseRegistrationDialog::Execute() 100 { 101 short result = SfxSingleTabDialog::Execute(); 102 if ( result == RET_OK ) 103 { 104 DBG_ASSERT( GetOutputItemSet(), "DatabaseRegistrationDialog::Execute: no output items!" ); 105 if ( GetOutputItemSet() ) 106 DbRegisteredNamesConfig::SetOptions( *GetOutputItemSet() ); 107 } 108 return result; 109 } 110 111 // class DbRegistrationOptionsPage -------------------------------------------------- 112 113 DbRegistrationOptionsPage::DbRegistrationOptionsPage( Window* pParent, const SfxItemSet& rSet ) : 114 115 SfxTabPage( pParent, CUI_RES( RID_SFXPAGE_DBREGISTER), rSet ), 116 117 aStdBox ( this, CUI_RES( GB_STD ) ), 118 aTypeText ( this, CUI_RES( FT_TYPE ) ), 119 aPathText ( this, CUI_RES( FT_PATH ) ), 120 aPathCtrl ( this, CUI_RES( LB_PATH ) ), 121 m_aNew ( this, CUI_RES( BTN_NEW ) ), 122 m_aEdit ( this, CUI_RES( BTN_EDIT ) ), 123 m_aDelete ( this, CUI_RES( BTN_DELETE ) ), 124 pHeaderBar ( NULL ), 125 pPathBox ( NULL ), 126 m_pCurEntry ( NULL ), 127 m_nOldCount ( 0 ), 128 m_bModified ( sal_False ) 129 { 130 m_aNew.SetClickHdl( LINK( this, DbRegistrationOptionsPage, NewHdl ) ); 131 m_aEdit.SetClickHdl( LINK( this, DbRegistrationOptionsPage, EditHdl ) ); 132 m_aDelete.SetClickHdl( LINK( this, DbRegistrationOptionsPage, DeleteHdl ) ); 133 134 Size aBoxSize = aPathCtrl.GetOutputSizePixel(); 135 136 137 WinBits nBits = WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP; 138 pPathBox = new ::svx::OptHeaderTabListBox( &aPathCtrl, nBits ); 139 140 pHeaderBar = new HeaderBar( &aPathCtrl, WB_BUTTONSTYLE | WB_BOTTOMBORDER ); 141 pHeaderBar->SetPosSizePixel( Point( 0, 0 ), Size( aBoxSize.Width(), 16 ) ); 142 pHeaderBar->SetSelectHdl( LINK( this, DbRegistrationOptionsPage, HeaderSelect_Impl ) ); 143 pHeaderBar->SetEndDragHdl( LINK( this, DbRegistrationOptionsPage, HeaderEndDrag_Impl ) ); 144 Size aSz; 145 aSz.Width() = TAB_WIDTH1; 146 pHeaderBar->InsertItem( ITEMID_TYPE, aTypeText.GetText(), 147 LogicToPixel( aSz, MapMode( MAP_APPFONT ) ).Width(), 148 HIB_LEFT | HIB_VCENTER | HIB_CLICKABLE | HIB_UPARROW ); 149 aSz.Width() = TAB_WIDTH2; 150 pHeaderBar->InsertItem( ITEMID_PATH, aPathText.GetText(), 151 LogicToPixel( aSz, MapMode( MAP_APPFONT ) ).Width(), 152 HIB_LEFT | HIB_VCENTER ); 153 154 static long nTabs[] = {3, 0, TAB_WIDTH1, TAB_WIDTH1 + TAB_WIDTH2 }; 155 Size aHeadSize = pHeaderBar->GetSizePixel(); 156 157 aPathCtrl.SetFocusControl( pPathBox ); 158 pPathBox->SetStyle( pPathBox->GetStyle()|nBits ); 159 pPathBox->SetDoubleClickHdl( LINK( this, DbRegistrationOptionsPage, EditHdl ) ); 160 pPathBox->SetSelectHdl( LINK( this, DbRegistrationOptionsPage, PathSelect_Impl ) ); 161 pPathBox->SetSelectionMode( SINGLE_SELECTION ); 162 pPathBox->SetPosSizePixel( Point( 0, aHeadSize.Height() ), 163 Size( aBoxSize.Width(), aBoxSize.Height() - aHeadSize.Height() ) ); 164 pPathBox->SetTabs( &nTabs[0], MAP_APPFONT ); 165 pPathBox->InitHeaderBar( pHeaderBar ); 166 pPathBox->SetHighlightRange(); 167 168 pPathBox->SetHelpId( HID_DBPATH_CTL_PATH ); 169 pHeaderBar->SetHelpId( HID_DBPATH_HEADERBAR ); 170 171 pPathBox->Show(); 172 pHeaderBar->Show(); 173 174 FreeResource(); 175 } 176 177 // ----------------------------------------------------------------------- 178 179 DbRegistrationOptionsPage::~DbRegistrationOptionsPage() 180 { 181 // #110603# do not grab focus to a destroyed window !!! 182 aPathCtrl.SetFocusControl( NULL ); 183 184 pHeaderBar->Hide(); 185 for ( sal_uInt16 i = 0; i < pPathBox->GetEntryCount(); ++i ) 186 delete static_cast< DatabaseRegistration* >( pPathBox->GetEntry(i)->GetUserData() ); 187 delete pPathBox; 188 delete pHeaderBar; 189 } 190 191 // ----------------------------------------------------------------------- 192 193 SfxTabPage* DbRegistrationOptionsPage::Create( Window* pParent, 194 const SfxItemSet& rAttrSet ) 195 { 196 return ( new DbRegistrationOptionsPage( pParent, rAttrSet ) ); 197 } 198 199 // ----------------------------------------------------------------------- 200 201 sal_Bool DbRegistrationOptionsPage::FillItemSet( SfxItemSet& rCoreSet ) 202 { 203 // the settings for the single drivers 204 sal_Bool bModified = sal_False; 205 DatabaseRegistrations aRegistrations; 206 sal_uLong nCount = pPathBox->GetEntryCount(); 207 for ( sal_uLong i = 0; i < nCount; ++i ) 208 { 209 SvLBoxEntry* pEntry = pPathBox->GetEntry(i); 210 DatabaseRegistration* pRegistration = static_cast< DatabaseRegistration* >( pEntry->GetUserData() ); 211 if ( pRegistration && pRegistration->sLocation.getLength() ) 212 { 213 ::rtl::OUString sName( pPathBox->GetEntryText( pEntry, 0 ) ); 214 OFileNotation aTransformer( pRegistration->sLocation ); 215 aRegistrations[ sName ] = DatabaseRegistration( aTransformer.get( OFileNotation::N_URL ), pRegistration->bReadOnly ); 216 } 217 } 218 if ( m_nOldCount != aRegistrations.size() || m_bModified ) 219 { 220 rCoreSet.Put(DatabaseMapItem( SID_SB_DB_REGISTER, aRegistrations ), SID_SB_DB_REGISTER); 221 bModified = sal_True; 222 } 223 224 return bModified; 225 } 226 227 // ----------------------------------------------------------------------- 228 229 void DbRegistrationOptionsPage::Reset( const SfxItemSet& rSet ) 230 { 231 // the settings for the single drivers 232 SFX_ITEMSET_GET( rSet, pRegistrations, DatabaseMapItem, SID_SB_DB_REGISTER, sal_True ); 233 if ( !pRegistrations ) 234 return; 235 236 pPathBox->Clear(); 237 238 const DatabaseRegistrations& rRegistrations = pRegistrations->getRegistrations(); 239 m_nOldCount = rRegistrations.size(); 240 DatabaseRegistrations::const_iterator aIter = rRegistrations.begin(); 241 DatabaseRegistrations::const_iterator aEnd = rRegistrations.end(); 242 for ( ; aIter != aEnd; ++aIter ) 243 { 244 OFileNotation aTransformer( aIter->second.sLocation ); 245 insertNewEntry( aIter->first, aTransformer.get( OFileNotation::N_SYSTEM ), aIter->second.bReadOnly ); 246 } 247 248 String aUserData = GetUserData(); 249 if ( aUserData.Len() ) 250 { 251 // Spaltenbreite restaurieren 252 pHeaderBar->SetItemSize( ITEMID_TYPE, aUserData.GetToken(0).ToInt32() ); 253 HeaderEndDrag_Impl( NULL ); 254 // Sortierrichtung restaurieren 255 sal_Bool bUp = (sal_Bool)(sal_uInt16)aUserData.GetToken(1).ToInt32(); 256 HeaderBarItemBits nBits = pHeaderBar->GetItemBits(ITEMID_TYPE); 257 258 if ( bUp ) 259 { 260 nBits &= ~HIB_UPARROW; 261 nBits |= HIB_DOWNARROW; 262 } 263 else 264 { 265 nBits &= ~HIB_DOWNARROW; 266 nBits |= HIB_UPARROW; 267 } 268 pHeaderBar->SetItemBits( ITEMID_TYPE, nBits ); 269 HeaderSelect_Impl( NULL ); 270 } 271 } 272 273 // ----------------------------------------------------------------------- 274 275 void DbRegistrationOptionsPage::FillUserData() 276 { 277 String aUserData = String::CreateFromInt32( pHeaderBar->GetItemSize( ITEMID_TYPE ) ); 278 aUserData += ';'; 279 HeaderBarItemBits nBits = pHeaderBar->GetItemBits( ITEMID_TYPE ); 280 sal_Bool bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW ); 281 aUserData += bUp ? '1' : '0'; 282 SetUserData( aUserData ); 283 } 284 // ----------------------------------------------------------------------- 285 286 IMPL_LINK( DbRegistrationOptionsPage, DeleteHdl, void *, EMPTYARG ) 287 { 288 SvLBoxEntry* pEntry = pPathBox->FirstSelected(); 289 if ( pEntry ) 290 { 291 QueryBox aQuery(this,CUI_RES(QUERY_DELETE_CONFIRM)); 292 if ( aQuery.Execute() == RET_YES ) 293 pPathBox->GetModel()->Remove(pEntry); 294 } 295 return 0; 296 } 297 // ----------------------------------------------------------------------- 298 IMPL_LINK( DbRegistrationOptionsPage, NewHdl, void *, EMPTYARG ) 299 { 300 String sNewName,sNewLocation; 301 openLinkDialog(sNewName,sNewLocation); 302 return 0; 303 } 304 305 // ----------------------------------------------------------------------- 306 307 IMPL_LINK( DbRegistrationOptionsPage, EditHdl, void *, EMPTYARG ) 308 { 309 SvLBoxEntry* pEntry = pPathBox->GetCurEntry(); 310 if ( !pEntry ) 311 return 0L; 312 313 DatabaseRegistration* pOldRegistration = static_cast< DatabaseRegistration* >( pEntry->GetUserData() ); 314 if ( !pOldRegistration || pOldRegistration->bReadOnly ) 315 return 0L; 316 317 String sOldName = pPathBox->GetEntryText(pEntry,0); 318 m_pCurEntry = pEntry; 319 openLinkDialog( sOldName, pOldRegistration->sLocation, pEntry ); 320 m_pCurEntry = NULL; 321 322 return 1L; 323 } 324 325 // ----------------------------------------------------------------------- 326 327 IMPL_LINK( DbRegistrationOptionsPage, HeaderSelect_Impl, HeaderBar*, pBar ) 328 { 329 if ( pBar && pBar->GetCurItemId() != ITEMID_TYPE ) 330 return 0; 331 332 HeaderBarItemBits nBits = pHeaderBar->GetItemBits(ITEMID_TYPE); 333 sal_Bool bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW ); 334 SvSortMode eMode = SortAscending; 335 336 if ( bUp ) 337 { 338 nBits &= ~HIB_UPARROW; 339 nBits |= HIB_DOWNARROW; 340 eMode = SortDescending; 341 } 342 else 343 { 344 nBits &= ~HIB_DOWNARROW; 345 nBits |= HIB_UPARROW; 346 } 347 pHeaderBar->SetItemBits( ITEMID_TYPE, nBits ); 348 SvTreeList* pModel = pPathBox->GetModel(); 349 pModel->SetSortMode( eMode ); 350 pModel->Resort(); 351 return 1; 352 } 353 354 // ----------------------------------------------------------------------- 355 356 IMPL_LINK( DbRegistrationOptionsPage, HeaderEndDrag_Impl, HeaderBar*, pBar ) 357 { 358 if ( pBar && !pBar->GetCurItemId() ) 359 return 0; 360 361 if ( !pHeaderBar->IsItemMode() ) 362 { 363 Size aSz; 364 sal_uInt16 nTabs = pHeaderBar->GetItemCount(); 365 long nTmpSz = 0; 366 long nWidth = pHeaderBar->GetItemSize(ITEMID_TYPE); 367 long nBarWidth = pHeaderBar->GetSizePixel().Width(); 368 369 if(nWidth < TAB_WIDTH_MIN) 370 pHeaderBar->SetItemSize( ITEMID_TYPE, TAB_WIDTH_MIN); 371 else if ( ( nBarWidth - nWidth ) < TAB_WIDTH_MIN ) 372 pHeaderBar->SetItemSize( ITEMID_TYPE, nBarWidth - TAB_WIDTH_MIN ); 373 374 for ( sal_uInt16 i = 1; i <= nTabs; ++i ) 375 { 376 long _nWidth = pHeaderBar->GetItemSize(i); 377 aSz.Width() = _nWidth + nTmpSz; 378 nTmpSz += _nWidth; 379 pPathBox->SetTab( i, PixelToLogic( aSz, MapMode(MAP_APPFONT) ).Width(), MAP_APPFONT ); 380 } 381 } 382 return 1; 383 } 384 // ----------------------------------------------------------------------- 385 386 IMPL_LINK( DbRegistrationOptionsPage, PathSelect_Impl, SvTabListBox *, EMPTYARG ) 387 { 388 SvLBoxEntry* pEntry = pPathBox->FirstSelected(); 389 390 bool bReadOnly = true; 391 if ( pEntry ) 392 { 393 DatabaseRegistration* pRegistration = static_cast< DatabaseRegistration* >( pEntry->GetUserData() ); 394 bReadOnly = pRegistration->bReadOnly; 395 } 396 397 m_aEdit.Enable( !bReadOnly ); 398 m_aDelete.Enable( !bReadOnly ); 399 return 0; 400 } 401 // ----------------------------------------------------------------------------- 402 void DbRegistrationOptionsPage::insertNewEntry( const ::rtl::OUString& _sName,const ::rtl::OUString& _sLocation, const bool _bReadOnly ) 403 { 404 String aStr( _sName ); 405 aStr += '\t'; 406 aStr += String(_sLocation); 407 408 SvLBoxEntry* pEntry = NULL; 409 if ( _bReadOnly ) 410 { 411 sal_Bool bHighContrast = pPathBox->GetDisplayBackground().GetColor().IsDark(); 412 Image aLocked( CUI_RES( bHighContrast ? RID_SVXBMP_LOCK_HC : RID_SVXBMP_LOCK ) ); 413 pEntry = pPathBox->InsertEntry( aStr, aLocked, aLocked ); 414 } 415 else 416 { 417 pEntry = pPathBox->InsertEntry( aStr ); 418 } 419 420 pEntry->SetUserData( new DatabaseRegistration( _sLocation, _bReadOnly ) ); 421 } 422 423 // ----------------------------------------------------------------------------- 424 void DbRegistrationOptionsPage::openLinkDialog(const String& _sOldName,const String& _sOldLocation,SvLBoxEntry* _pEntry) 425 { 426 ODocumentLinkDialog aDlg(this,_pEntry == NULL); 427 428 aDlg.set(_sOldName,_sOldLocation); 429 aDlg.setNameValidator(LINK( this, DbRegistrationOptionsPage, NameValidator ) ); 430 431 if ( aDlg.Execute() == RET_OK ) 432 { 433 String sNewName,sNewLocation; 434 aDlg.get(sNewName,sNewLocation); 435 if ( _pEntry == NULL || sNewName != _sOldName || sNewLocation != _sOldLocation ) 436 { 437 if ( _pEntry ) 438 { 439 delete static_cast< DatabaseRegistration* >( _pEntry->GetUserData() ); 440 pPathBox->GetModel()->Remove( _pEntry ); 441 } 442 insertNewEntry( sNewName, sNewLocation, false ); 443 m_bModified = sal_True; 444 } 445 } 446 } 447 // ----------------------------------------------------------------------------- 448 IMPL_LINK( DbRegistrationOptionsPage, NameValidator, String*, _pName ) 449 { 450 if ( _pName ) 451 { 452 sal_uLong nCount = pPathBox->GetEntryCount(); 453 for ( sal_uLong i = 0; i < nCount; ++i ) 454 { 455 SvLBoxEntry* pEntry = pPathBox->GetEntry(i); 456 if ( (!m_pCurEntry || m_pCurEntry != pEntry) && pPathBox->GetEntryText(pEntry,0) == *_pName ) 457 return 0L; 458 } 459 } 460 return 1L; 461 } 462 //........................................................................ 463 } // namespace svx 464 //........................................................................ 465