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 #include "templwin.hxx" 27 #include <svtools/templdlg.hxx> 28 #include <svtools/svtdata.hxx> 29 #include <unotools/pathoptions.hxx> 30 #include <unotools/dynamicmenuoptions.hxx> 31 #include <unotools/extendedsecurityoptions.hxx> 32 #include <svtools/xtextedt.hxx> 33 #include <svl/inettype.hxx> 34 #include <svtools/imagemgr.hxx> 35 #include <svtools/miscopt.hxx> 36 #include <svtools/templatefoldercache.hxx> 37 #include <svtools/imgdef.hxx> 38 #include <svtools/txtattr.hxx> 39 #include <svtools/svtools.hrc> 40 #include "templwin.hrc" 41 #include <svtools/helpid.hrc> 42 #include <unotools/pathoptions.hxx> 43 #include <unotools/viewoptions.hxx> 44 #include <unotools/ucbhelper.hxx> 45 #include "unotools/configmgr.hxx" 46 #include <com/sun/star/awt/XWindow.hpp> 47 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 48 #include <com/sun/star/frame/XFrame.hpp> 49 #include <toolkit/helper/vclunohelper.hxx> 50 #include <com/sun/star/util/URL.hpp> 51 #include <com/sun/star/util/XURLTransformer.hpp> 52 #include <com/sun/star/util/XOfficeInstallationDirectories.hpp> 53 #include <com/sun/star/frame/XDispatchProvider.hpp> 54 #include <com/sun/star/frame/XDocumentTemplates.hpp> 55 #include <com/sun/star/frame/XComponentLoader.hpp> 56 #include <com/sun/star/beans/PropertyValue.hpp> 57 #include <com/sun/star/ucb/XContent.hpp> 58 #include <com/sun/star/ucb/XCommandEnvironment.hpp> 59 #include <com/sun/star/view/XPrintable.hpp> 60 #include <com/sun/star/awt/XWindow.hpp> 61 #include <com/sun/star/document/XDocumentProperties.hpp> 62 #include <com/sun/star/beans/XPropertySet.hpp> 63 #include <com/sun/star/beans/XMultiPropertySet.hpp> 64 #include <com/sun/star/beans/XPropertySetInfo.hpp> 65 #include <com/sun/star/io/IOException.hpp> 66 #include <com/sun/star/util/DateTime.hpp> 67 #include <com/sun/star/script/XTypeConverter.hpp> 68 #include <com/sun/star/system/SystemShellExecute.hpp> 69 #include <com/sun/star/system/SystemShellExecuteFlags.hpp> 70 #include <unotools/localedatawrapper.hxx> 71 #include <com/sun/star/container/XNameContainer.hpp> 72 #include <vcl/waitobj.hxx> 73 #include <comphelper/processfactory.hxx> 74 #include <tools/urlobj.hxx> 75 #include <tools/datetime.hxx> 76 #include <vcl/svapp.hxx> 77 #include <vcl/split.hxx> 78 #include <vcl/msgbox.hxx> 79 #include <svtools/DocumentInfoPreview.hxx> 80 #include <vcl/mnemonic.hxx> 81 82 #include <ucbhelper/content.hxx> 83 #include <comphelper/string.hxx> 84 85 86 using namespace ::com::sun::star; 87 using namespace ::com::sun::star::beans; 88 using namespace ::com::sun::star::container; 89 using namespace ::com::sun::star::frame; 90 using namespace ::com::sun::star::document; 91 using namespace ::com::sun::star::lang; 92 using namespace ::com::sun::star::ucb; 93 using namespace ::com::sun::star::uno; 94 using namespace ::com::sun::star::view; 95 using namespace svtools; 96 97 extern ::rtl::OUString CreateExactSizeText_Impl( sal_Int64 nSize ); // fileview.cxx 98 99 #define SPLITSET_ID 0 100 #define COLSET_ID 1 101 #define ICONWIN_ID 2 102 #define FILEWIN_ID 3 103 #define FRAMEWIN_ID 4 104 105 #define ICON_POS_NEWDOC 0 106 #define ICON_POS_TEMPLATES 1 107 #define ICON_POS_MYDOCS 2 108 #define ICON_POS_SAMPLES 3 109 110 #define ASCII_STR(s) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(s) ) 111 #define VIEWSETTING_NEWFROMTEMPLATE ASCII_STR("NewFromTemplate") 112 #define VIEWSETTING_SELECTEDGROUP ASCII_STR("SelectedGroup") 113 #define VIEWSETTING_SELECTEDVIEW ASCII_STR("SelectedView") 114 #define VIEWSETTING_SPLITRATIO ASCII_STR("SplitRatio") 115 #define VIEWSETTING_LASTFOLDER ASCII_STR("LastFolder") 116 117 struct FolderHistory 118 { 119 String m_sURL; 120 sal_uLong m_nGroup; 121 122 FolderHistory( const String& _rURL, sal_Int32 _nGroup ) : 123 m_sURL( _rURL ), m_nGroup( _nGroup ) {} 124 }; 125 126 DECLARE_LIST( HistoryList_Impl, FolderHistory* ) 127 DECLARE_LIST( NewDocList_Impl, ::rtl::OUString* ) 128 129 ODocumentInfoPreview::ODocumentInfoPreview( Window* pParent ,WinBits _nBits) : Window(pParent,WB_DIALOGCONTROL) 130 { 131 m_pEditWin = new SvtExtendedMultiLineEdit_Impl(this,_nBits); 132 m_pEditWin->Show(); 133 m_pEditWin->EnableCursor( sal_False ); 134 m_pInfoTable = new SvtDocInfoTable_Impl(); 135 // detect application language 136 m_aLocale = SvtPathOptions().GetLocale(); 137 } 138 // ----------------------------------------------------------------------------- 139 ODocumentInfoPreview::~ODocumentInfoPreview() 140 { 141 delete m_pEditWin; 142 delete m_pInfoTable; 143 } 144 // ----------------------------------------------------------------------------- 145 void ODocumentInfoPreview::Resize() 146 { 147 Size aOutputSize( GetOutputSize() ); 148 m_pEditWin->SetPosSizePixel( Point(0,0),aOutputSize); 149 } 150 // ----------------------------------------------------------------------------- 151 void ODocumentInfoPreview::Clear() 152 { 153 m_pEditWin->Clear(); 154 } 155 // ----------------------------------------------------------------------------- 156 157 void lcl_insertDateTimeEntry(SvtExtendedMultiLineEdit_Impl* i_pEditWin, 158 const ::rtl::OUString & i_rName, const util::DateTime & i_rUDT) 159 { 160 DateTime aToolsDT = 161 DateTime( Date( i_rUDT.Day, i_rUDT.Month, i_rUDT.Year ), 162 Time( i_rUDT.Hours, i_rUDT.Minutes, 163 i_rUDT.Seconds, i_rUDT.HundredthSeconds ) ); 164 if ( aToolsDT.IsValid() ) 165 { 166 LocaleDataWrapper aLocaleWrapper( 167 ::comphelper::getProcessServiceFactory(), 168 Application::GetSettings().GetLocale() ); 169 String aDateStr = aLocaleWrapper.getDate( aToolsDT ); 170 aDateStr += String( RTL_CONSTASCII_STRINGPARAM(", ") ); 171 aDateStr += aLocaleWrapper.getTime( aToolsDT ); 172 i_pEditWin->InsertEntry( i_rName, aDateStr ); 173 } 174 } 175 176 void ODocumentInfoPreview::fill( 177 const Reference< XDocumentProperties >& i_xDocProps, const String& i_rURL) 178 { 179 if (!i_xDocProps.is()) throw RuntimeException(); 180 181 ::rtl::OUString aStr; 182 m_pEditWin->SetAutoScroll( sal_False ); 183 184 aStr = i_xDocProps->getTitle(); 185 if (aStr.getLength()) { 186 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_TITLE ), aStr ); 187 } 188 189 aStr = i_xDocProps->getAuthor(); 190 if (aStr.getLength()) { 191 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_FROM ), aStr ); 192 } 193 194 lcl_insertDateTimeEntry(m_pEditWin, 195 m_pInfoTable->GetString( DI_DATE ), 196 i_xDocProps->getCreationDate()); 197 198 aStr = i_xDocProps->getModifiedBy(); 199 if (aStr.getLength()) { 200 m_pEditWin->InsertEntry( m_pInfoTable->GetString(DI_MODIFIEDBY), aStr ); 201 } 202 203 lcl_insertDateTimeEntry(m_pEditWin, 204 m_pInfoTable->GetString( DI_MODIFIEDDATE ), 205 i_xDocProps->getModificationDate()); 206 207 aStr = i_xDocProps->getPrintedBy(); 208 if (aStr.getLength()) { 209 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_PRINTBY ), aStr ); 210 } 211 212 lcl_insertDateTimeEntry(m_pEditWin, 213 m_pInfoTable->GetString( DI_PRINTDATE ), 214 i_xDocProps->getPrintDate()); 215 216 aStr = i_xDocProps->getSubject(); 217 if (aStr.getLength()) { 218 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_THEME ), aStr ); 219 } 220 221 aStr = 222 ::comphelper::string::convertCommaSeparated(i_xDocProps->getKeywords()); 223 if (aStr.getLength()) { 224 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_KEYWORDS ), aStr ); 225 } 226 227 aStr = i_xDocProps->getDescription(); 228 if (aStr.getLength()) { 229 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_DESCRIPTION ), 230 aStr ); 231 } 232 233 // size 234 if ( i_rURL.Len() > 0 ) 235 { 236 sal_uLong nDocSize = ::utl::UCBContentHelper::GetSize( i_rURL ); 237 m_pEditWin->InsertEntry( 238 m_pInfoTable->GetString( DI_SIZE ), 239 CreateExactSizeText_Impl( nDocSize ) ); 240 } 241 242 // MIMEType 243 if ( i_rURL.Len() > 0 ) 244 { 245 INetContentType eTypeID = 246 INetContentTypes::GetContentTypeFromURL( i_rURL ); 247 if ( eTypeID != CONTENT_TYPE_APP_OCTSTREAM ) { 248 aStr = INetContentTypes::GetPresentation( eTypeID, m_aLocale ); 249 } else { 250 aStr = SvFileInformationManager::GetDescription( 251 INetURLObject(i_rURL) ); 252 } 253 if (aStr.getLength()) { 254 m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_MIMETYPE ), 255 aStr ); 256 } 257 } 258 259 // user-defined (custom) properties 260 Reference< XPropertySet > xUserDefined( 261 i_xDocProps->getUserDefinedProperties(), UNO_QUERY_THROW ); 262 Reference< XPropertySetInfo > xUDInfo = xUserDefined->getPropertySetInfo(); 263 Sequence< Property > props = xUDInfo->getProperties(); 264 for (sal_Int32 i = 0; i < props.getLength(); ++i) { 265 const ::rtl::OUString name = props[i].Name; 266 uno::Any aAny; 267 try { 268 aAny = xUserDefined->getPropertyValue(name); 269 uno::Reference < script::XTypeConverter > xConverter( 270 comphelper::getProcessServiceFactory()->createInstance( 271 ASCII_STR("com.sun.star.script.Converter")), 272 UNO_QUERY ); 273 uno::Any aNew; 274 aNew = xConverter->convertToSimpleType( aAny, TypeClass_STRING ); 275 if ((aNew >>= aStr) && aStr.getLength()) { 276 m_pEditWin->InsertEntry( name, aStr); 277 } 278 } catch (uno::Exception &) { 279 // ignore 280 } 281 } 282 283 m_pEditWin->SetSelection( Selection( 0, 0 ) ); 284 m_pEditWin->SetAutoScroll( sal_True ); 285 } 286 287 // ----------------------------------------------------------------------------- 288 void ODocumentInfoPreview::InsertEntry( const String& rTitle, const String& rValue ) 289 { 290 m_pEditWin->InsertEntry( rTitle, rValue); 291 } 292 // ----------------------------------------------------------------------------- 293 294 // class SvtDummyHeaderBar_Impl ------------------------------------------ 295 296 void SvtDummyHeaderBar_Impl::UpdateBackgroundColor() 297 { 298 SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) ); 299 } 300 301 SvtDummyHeaderBar_Impl::SvtDummyHeaderBar_Impl( Window* pPar ) : Window( pPar ) 302 { 303 SetSizePixel( HeaderBar( this, 0 ).CalcWindowSizePixel() ); // HeaderBar used only to calculate size 304 305 UpdateBackgroundColor(); 306 } 307 308 SvtDummyHeaderBar_Impl::~SvtDummyHeaderBar_Impl() 309 { 310 } 311 312 void SvtDummyHeaderBar_Impl::DataChanged( const DataChangedEvent& r ) 313 { 314 Window::DataChanged( r ); 315 if( r.GetType() == DATACHANGED_SETTINGS ) 316 UpdateBackgroundColor(); 317 } 318 319 // class SvtIconWindow_Impl ---------------------------------------------- 320 321 SvtIconWindow_Impl::SvtIconWindow_Impl( Window* pParent ) : 322 323 Window( pParent, WB_DIALOGCONTROL | WB_BORDER | WB_3DLOOK ), 324 325 aDummyHeaderBar( this ), 326 aIconCtrl( this, WB_ICON | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | /*!WB_NOSELECTION |*/ 327 WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN ), 328 aNewDocumentRootURL( ASCII_STR("private:newdoc") ), 329 aMyDocumentsRootURL( SvtPathOptions().GetWorkPath() ), 330 aSamplesFolderRootURL( SvtPathOptions(). 331 SubstituteVariable( String( ASCII_STR("$(insturl)/share/samples/$(vlang)") ) ) ), 332 nMaxTextLength( 0 ) 333 334 { 335 aDummyHeaderBar.Show(); 336 337 aIconCtrl.SetAccessibleName( String( RTL_CONSTASCII_USTRINGPARAM("Groups") ) ); 338 aIconCtrl.SetHelpId( HID_TEMPLATEDLG_ICONCTRL ); 339 aIconCtrl.SetChoiceWithCursor( sal_True ); 340 aIconCtrl.SetSelectionMode( SINGLE_SELECTION ); 341 aIconCtrl.Show(); 342 343 // detect the root URL of templates 344 Reference< XDocumentTemplates > xTemplates( ::comphelper::getProcessServiceFactory()-> 345 createInstance( ASCII_STR("com.sun.star.frame.DocumentTemplates") ), UNO_QUERY ); 346 347 if ( xTemplates.is() ) 348 { 349 Reference < XContent > aRootContent = xTemplates->getContent(); 350 Reference < XCommandEnvironment > aCmdEnv; 351 352 if ( aRootContent.is() ) 353 aTemplateRootURL = aRootContent->getIdentifier()->getContentIdentifier(); 354 } 355 356 // insert the categories 357 // "New Document" 358 sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 359 Image aImage( SvtResId( bHiContrast ? IMG_SVT_NEWDOC_HC : IMG_SVT_NEWDOC ) ); 360 nMaxTextLength = aImage.GetSizePixel().Width(); 361 String aEntryStr = String( SvtResId( STR_SVT_NEWDOC ) ); 362 SvxIconChoiceCtrlEntry* pEntry = 363 aIconCtrl.InsertEntry( aEntryStr, aImage, ICON_POS_NEWDOC ); 364 pEntry->SetUserData( new String( aNewDocumentRootURL ) ); 365 pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_NEWDOC_HELP ) ) ); 366 DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" ); 367 long nTemp = pEntry->GetBoundRect().GetSize().Width(); 368 if (nTemp > nMaxTextLength) 369 nMaxTextLength = nTemp; 370 371 // "Templates" 372 if( aTemplateRootURL.Len() > 0 ) 373 { 374 aEntryStr = String( SvtResId( STR_SVT_TEMPLATES ) ); 375 pEntry = aIconCtrl.InsertEntry( 376 aEntryStr, Image( SvtResId( bHiContrast ? IMG_SVT_TEMPLATES_HC : IMG_SVT_TEMPLATES ) ), ICON_POS_TEMPLATES ); 377 pEntry->SetUserData( new String( aTemplateRootURL ) ); 378 pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_TEMPLATES_HELP ) ) ); 379 DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" ); 380 nTemp = pEntry->GetBoundRect().GetSize().Width(); 381 if (nTemp > nMaxTextLength) 382 nMaxTextLength = nTemp; 383 } 384 385 // "My Documents" 386 aEntryStr = String( SvtResId( STR_SVT_MYDOCS ) ); 387 pEntry = aIconCtrl.InsertEntry( 388 aEntryStr, Image( SvtResId( bHiContrast ? IMG_SVT_MYDOCS_HC : IMG_SVT_MYDOCS ) ), ICON_POS_MYDOCS ); 389 pEntry->SetUserData( new String( aMyDocumentsRootURL ) ); 390 pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_MYDOCS_HELP ) ) ); 391 DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" ); 392 nTemp = pEntry->GetBoundRect().GetSize().Width(); 393 if( nTemp > nMaxTextLength ) 394 nMaxTextLength = nTemp; 395 396 // "Samples" 397 aEntryStr = String( SvtResId( STR_SVT_SAMPLES ) ); 398 pEntry = aIconCtrl.InsertEntry( 399 aEntryStr, Image( SvtResId( bHiContrast ? IMG_SVT_SAMPLES_HC : IMG_SVT_SAMPLES ) ), ICON_POS_SAMPLES ); 400 pEntry->SetUserData( new String( aSamplesFolderRootURL ) ); 401 pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_SAMPLES_HELP ) ) ); 402 DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" ); 403 nTemp = pEntry->GetBoundRect().GetSize().Width(); 404 if (nTemp > nMaxTextLength) 405 nMaxTextLength = nTemp; 406 407 aIconCtrl.CreateAutoMnemonics(); 408 } 409 410 SvtIconWindow_Impl::~SvtIconWindow_Impl() 411 { 412 for ( sal_uLong i = 0; i < aIconCtrl.GetEntryCount(); ++i ) 413 { 414 SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( i ); 415 delete (String*)pEntry->GetUserData(); 416 } 417 } 418 419 SvxIconChoiceCtrlEntry* SvtIconWindow_Impl::GetEntry( const String& rURL ) const 420 { 421 SvxIconChoiceCtrlEntry* pEntry = NULL; 422 for ( sal_uLong i = 0; i < aIconCtrl.GetEntryCount(); ++i ) 423 { 424 SvxIconChoiceCtrlEntry* pTemp = aIconCtrl.GetEntry( i ); 425 String aURL( *( (String*)pTemp->GetUserData() ) ); 426 if ( aURL == rURL ) 427 { 428 pEntry = pTemp; 429 break; 430 } 431 } 432 433 return pEntry; 434 } 435 436 void SvtIconWindow_Impl::Resize() 437 { 438 Size aWinSize = GetOutputSizePixel(); 439 Size aHeaderSize = aDummyHeaderBar.GetSizePixel(); 440 aHeaderSize.Width() = aWinSize.Width(); 441 aDummyHeaderBar.SetSizePixel( aHeaderSize ); 442 long nHeaderHeight = aHeaderSize.Height(); 443 aWinSize.Height() -= nHeaderHeight; 444 aIconCtrl.SetPosSizePixel( Point( 0, nHeaderHeight ), aWinSize ); 445 aIconCtrl.ArrangeIcons(); 446 } 447 448 String SvtIconWindow_Impl::GetCursorPosIconURL() const 449 { 450 String aURL; 451 SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetCursor( ); 452 if ( pEntry ) 453 aURL = *static_cast<String*>(pEntry->GetUserData()); 454 return aURL; 455 456 } 457 458 String SvtIconWindow_Impl::GetSelectedIconURL() const 459 { 460 sal_uLong nPos; 461 SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetSelectedEntry( nPos ); 462 String aURL; 463 if ( pEntry ) 464 aURL = *static_cast<String*>(pEntry->GetUserData()); 465 return aURL; 466 } 467 468 String SvtIconWindow_Impl::GetSelectedIconText() const 469 { 470 sal_uLong nPos; 471 return MnemonicGenerator::EraseAllMnemonicChars( aIconCtrl.GetSelectedEntry( nPos )->GetText() ); 472 } 473 474 String SvtIconWindow_Impl::GetIconText( const String& rURL ) const 475 { 476 String aText; 477 SvxIconChoiceCtrlEntry* pEntry = GetEntry( rURL ); 478 if ( pEntry ) 479 aText = MnemonicGenerator::EraseAllMnemonicChars( pEntry->GetText() ); 480 return aText; 481 } 482 483 void SvtIconWindow_Impl::InvalidateIconControl() 484 { 485 aIconCtrl.Invalidate(); 486 } 487 488 sal_uLong SvtIconWindow_Impl::GetCursorPos() const 489 { 490 sal_uLong nPos = ~sal_uLong(0); 491 492 SvxIconChoiceCtrlEntry* pCursorEntry = aIconCtrl.GetCursor( ); 493 if ( pCursorEntry ) 494 nPos = aIconCtrl.GetEntryListPos( pCursorEntry ); 495 496 return nPos; 497 } 498 499 sal_uLong SvtIconWindow_Impl::GetSelectEntryPos() const 500 { 501 sal_uLong nPos; 502 if ( !aIconCtrl.GetSelectedEntry( nPos ) ) 503 nPos = ~sal_uLong(0); 504 return nPos; 505 } 506 507 void SvtIconWindow_Impl::SetCursorPos( sal_uLong nPos ) 508 { 509 SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( nPos ); 510 aIconCtrl.SetCursor( pEntry ); 511 aIconCtrl.Invalidate(); 512 aIconCtrl.Update(); 513 } 514 515 void SvtIconWindow_Impl::SetFocus() 516 { 517 aIconCtrl.GrabFocus(); 518 } 519 520 long SvtIconWindow_Impl::CalcHeight() const 521 { 522 // calculate the required height of the IconControl 523 long nHeight = 0; 524 sal_uLong nCount = aIconCtrl.GetEntryCount(); 525 if ( nCount > 0 ) 526 // bottom of the last icon 527 nHeight = aIconCtrl.GetEntry(nCount-1)->GetBoundRect().Bottom(); 528 529 // + headerbar height 530 nHeight += aDummyHeaderBar.GetSizePixel().Height(); 531 532 return nHeight; 533 } 534 535 sal_Bool SvtIconWindow_Impl::IsRootURL( const String& rURL ) const 536 { 537 return rURL == aNewDocumentRootURL || 538 rURL == aTemplateRootURL || 539 rURL == aMyDocumentsRootURL || 540 rURL == aSamplesFolderRootURL; 541 } 542 543 sal_uLong SvtIconWindow_Impl::GetRootPos( const String& rURL ) const 544 { 545 sal_uLong nPos = ~sal_uLong(0); 546 if ( aNewDocumentRootURL.Match( rURL ) == STRING_MATCH ) 547 nPos = 0; 548 else if ( aTemplateRootURL.Match( rURL ) == STRING_MATCH ) 549 nPos = 1; 550 else if ( aMyDocumentsRootURL.Match( rURL ) == STRING_MATCH ) 551 nPos = 2; 552 else if ( aSamplesFolderRootURL.Match( rURL ) == STRING_MATCH ) 553 nPos = 3; 554 else if ( rURL.Match( aMyDocumentsRootURL ) == STRING_MATCH ) 555 nPos = 2; 556 else 557 { 558 DBG_WARNING( "SvtIconWindow_Impl::GetRootPos(): invalid position" ); 559 nPos = 2; 560 } 561 562 return nPos; 563 } 564 565 void SvtIconWindow_Impl::UpdateIcons( sal_Bool _bHiContrast ) 566 { 567 aIconCtrl.GetEntry( ICON_POS_NEWDOC )->SetImage( 568 Image( SvtResId( _bHiContrast ? IMG_SVT_NEWDOC_HC : IMG_SVT_NEWDOC ) ) ); 569 aIconCtrl.GetEntry( ICON_POS_TEMPLATES )->SetImage( 570 Image( SvtResId( _bHiContrast ? IMG_SVT_TEMPLATES_HC : IMG_SVT_TEMPLATES ) ) ); 571 aIconCtrl.GetEntry( ICON_POS_MYDOCS )->SetImage( 572 Image( SvtResId( _bHiContrast ? IMG_SVT_MYDOCS_HC : IMG_SVT_MYDOCS ) ) ); 573 aIconCtrl.GetEntry( ICON_POS_SAMPLES )->SetImage( 574 Image( SvtResId( _bHiContrast ? IMG_SVT_SAMPLES_HC : IMG_SVT_SAMPLES ) ) ); 575 } 576 /* -----------------27.11.2002 16:58----------------- 577 * 578 * --------------------------------------------------*/ 579 void SvtIconWindow_Impl::SelectFolder(sal_Int32 nFolderPosition) 580 { 581 SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( nFolderPosition ); 582 if(pEntry) 583 { 584 aIconCtrl.SetCursor( pEntry ); 585 aIconCtrl.GetClickHdl().Call(&aIconCtrl); 586 } 587 } 588 589 // class SvtFileViewWindow_Impl -----------------------------------------_ 590 591 SvtFileViewWindow_Impl::SvtFileViewWindow_Impl( SvtTemplateWindow* pParent ) : 592 593 Window( pParent, WB_DIALOGCONTROL | WB_TABSTOP | WB_BORDER | WB_3DLOOK ), 594 595 rParent ( *pParent ), 596 aFileView ( this, SvtResId( CTRL_FILEVIEW ), FILEVIEW_SHOW_TITLE ), 597 bIsTemplateFolder ( sal_False ) 598 599 { 600 aFileView.SetStyle( aFileView.GetStyle() | WB_DIALOGCONTROL | WB_TABSTOP ); 601 aFileView.SetHelpId( HID_TEMPLATEDLG_FILEVIEW ); 602 aFileView.Show(); 603 aFileView.SetPosPixel( Point( 0, 0 ) ); 604 aFileView.EnableAutoResize(); 605 aFileView.EnableContextMenu( sal_False ); 606 aFileView.EnableDelete( sal_False ); 607 } 608 609 SvtFileViewWindow_Impl::~SvtFileViewWindow_Impl() 610 { 611 } 612 613 void GetMenuEntry_Impl 614 ( 615 Sequence< PropertyValue >& aDynamicMenuEntry, 616 ::rtl::OUString& rTitle, 617 ::rtl::OUString& rURL, 618 ::rtl::OUString& rFrame, 619 ::rtl::OUString& rImageId 620 ) 621 { 622 for ( int i = 0; i < aDynamicMenuEntry.getLength(); i++ ) 623 { 624 if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_URL ) 625 aDynamicMenuEntry[i].Value >>= rURL; 626 else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TITLE ) 627 aDynamicMenuEntry[i].Value >>= rTitle; 628 else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_IMAGEIDENTIFIER ) 629 aDynamicMenuEntry[i].Value >>= rImageId; 630 else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TARGETNAME ) 631 aDynamicMenuEntry[i].Value >>= rFrame; 632 } 633 } 634 Sequence< ::rtl::OUString > SvtFileViewWindow_Impl::GetNewDocContents() const 635 { 636 NewDocList_Impl aNewDocs; 637 Sequence< Sequence< PropertyValue > > aDynamicMenuEntries; 638 aDynamicMenuEntries = SvtDynamicMenuOptions().GetMenu( E_NEWMENU ); 639 640 ::rtl::OUString aTitle; 641 ::rtl::OUString aURL; 642 ::rtl::OUString aImageURL; 643 ::rtl::OUString aTargetFrame; 644 645 sal_uInt32 i, nCount = aDynamicMenuEntries.getLength(); 646 ::rtl::OUString sSeparator( ASCII_STR("private:separator") ); 647 ::rtl::OUString sSlotURL( ASCII_STR("slot:5500") ); 648 649 for ( i = 0; i < nCount; ++i ) 650 { 651 GetMenuEntry_Impl( aDynamicMenuEntries[i], aTitle, aURL, aTargetFrame, aImageURL ); 652 653 if ( aURL == sSeparator || aURL == sSlotURL ) 654 continue; 655 else 656 { 657 // title 658 String aRow = MnemonicGenerator::EraseAllMnemonicChars( String( aTitle ) ); 659 aRow += '\t'; 660 // no type 661 aRow += '\t'; 662 // no size 663 aRow += '\t'; 664 // no date 665 aRow += '\t'; 666 // url 667 aRow += String( aURL ); 668 aRow += '\t'; 669 // folder == false 670 aRow += '0'; 671 // image url? 672 if ( aImageURL.getLength() > 0 ) 673 { 674 aRow += '\t'; 675 aRow += String( aImageURL ); 676 } 677 678 ::rtl::OUString* pRow = new ::rtl::OUString( aRow ); 679 aNewDocs.Insert( pRow, LIST_APPEND ); 680 } 681 } 682 683 nCount = aNewDocs.Count(); 684 Sequence < ::rtl::OUString > aRet( nCount ); 685 ::rtl::OUString* pRet = aRet.getArray(); 686 for ( i = 0; i < nCount; ++i ) 687 { 688 ::rtl::OUString* pNewDoc = aNewDocs.GetObject(i); 689 pRet[i] = *( pNewDoc ); 690 delete pNewDoc; 691 } 692 693 return aRet; 694 } 695 696 void SvtFileViewWindow_Impl::Resize() 697 { 698 Size aWinSize = GetOutputSizePixel(); 699 700 static int x = 0; 701 static int y = 0; 702 703 aWinSize.nA += x; 704 aWinSize.nB += y; 705 aFileView.SetSizePixel( aWinSize ); 706 } 707 708 String SvtFileViewWindow_Impl::GetSelectedFile() const 709 { 710 return aFileView.GetCurrentURL(); 711 } 712 713 void SvtFileViewWindow_Impl::OpenFolder( const String& rURL ) 714 { 715 aFolderURL = rURL; 716 717 rParent.SetPrevLevelButtonState( rURL ); 718 719 aFileView.SetUrlFilter( &aURLFilter ); 720 721 INetProtocol eProt = INetURLObject( rURL ).GetProtocol(); 722 bIsTemplateFolder = ( eProt == INET_PROT_VND_SUN_STAR_HIER ); 723 bool isNewDocumentFolder = ( eProt == INET_PROT_PRIVATE ); 724 725 aURLFilter.enableFilter( !bIsTemplateFolder && !isNewDocumentFolder ); 726 727 if ( isNewDocumentFolder ) 728 { 729 aFileView.EnableNameReplacing( sal_False ); 730 aFileView.Initialize( GetNewDocContents() ); 731 } 732 else 733 { 734 xub_StrLen nSampFoldLen = aSamplesFolderURL.Len(); 735 aFileView.EnableNameReplacing( 736 nSampFoldLen && rURL.CompareTo( aSamplesFolderURL, nSampFoldLen ) == COMPARE_EQUAL ); 737 aFileView.Initialize( rURL, String(), NULL ); 738 } 739 aNewFolderLink.Call( this ); 740 } 741 742 sal_Bool SvtFileViewWindow_Impl::HasPreviousLevel( String& rURL ) const 743 { 744 INetURLObject aViewObj( aFileView.GetViewURL() ); 745 INetURLObject aRootObj( aCurrentRootURL ); 746 INetURLObject aMyDocObj( aMyDocumentsURL ); 747 748 return ( ( aViewObj != aRootObj || aRootObj == aMyDocObj ) && aFileView.GetParentURL( rURL ) ); 749 } 750 751 String SvtFileViewWindow_Impl::GetFolderTitle() const 752 { 753 String aTitle; 754 ::utl::UCBContentHelper::GetTitle( aFolderURL, aTitle ); 755 return aTitle; 756 } 757 758 void SvtFileViewWindow_Impl::SetFocus() 759 { 760 aFileView.SetFocus(); 761 } 762 763 // class SvtDocInfoTable_Impl -------------------------------------------- 764 765 SvtDocInfoTable_Impl::SvtDocInfoTable_Impl() : 766 767 ResStringArray( SvtResId( STRARY_SVT_DOCINFO ) ) 768 769 { 770 } 771 // ----------------------------------------------------------------------------- 772 // class SvtExtendedMultiLineEdit_Impl -------------------------------------------- 773 SvtExtendedMultiLineEdit_Impl::SvtExtendedMultiLineEdit_Impl( Window* pParent,WinBits _nBits ) : 774 775 ExtMultiLineEdit( pParent, _nBits ) 776 777 { 778 SetLeftMargin( 10 ); 779 } 780 // ----------------------------------------------------------------------------- 781 void SvtExtendedMultiLineEdit_Impl::InsertEntry( const String& rTitle, const String& rValue ) 782 { 783 String aText( '\n' ); 784 aText += rTitle; 785 aText += ':'; 786 InsertText( aText ); 787 sal_uLong nPara = GetParagraphCount() - 1; 788 SetAttrib( TextAttribFontWeight( WEIGHT_BOLD ), nPara, 0, aText.Len() ); 789 790 aText = '\n'; 791 aText += rValue; 792 InsertText( aText ); 793 nPara = GetParagraphCount() - 1; 794 SetAttrib( TextAttribFontWeight( WEIGHT_NORMAL ), nPara, 0, aText.Len() ); 795 796 InsertText( String( '\n' ) ); 797 } 798 // ----------------------------------------------------------------------------- 799 800 // ----------------------------------------------------------------------- 801 802 const String& SvtDocInfoTable_Impl::GetString( long nId ) const 803 { 804 sal_uInt32 nPos( FindIndex( nId ) ); 805 806 if ( RESARRAY_INDEX_NOTFOUND != nPos ) 807 return ResStringArray::GetString( nPos ); 808 else 809 return aEmptyString; 810 } 811 812 // class SvtFrameWindow_Impl --------------------------------------------- 813 814 SvtFrameWindow_Impl::SvtFrameWindow_Impl( Window* pParent ) : 815 816 Window( pParent ) 817 818 { 819 // detect application language 820 aLocale= SvtPathOptions().GetLocale(); 821 822 // create windows and frame 823 pEditWin = new ODocumentInfoPreview( this ,WB_LEFT | WB_VSCROLL | WB_READONLY | WB_BORDER | WB_3DLOOK); 824 pTextWin = new Window( this ); 825 xFrame = Reference < XFrame > ( ::comphelper::getProcessServiceFactory()-> 826 createInstance( ASCII_STR("com.sun.star.frame.Frame") ), UNO_QUERY ); 827 xWindow = VCLUnoHelper::GetInterface( pTextWin ); 828 xFrame->initialize( xWindow ); 829 830 // create docinfo instance 831 m_xDocProps.set( ::comphelper::getProcessServiceFactory()->createInstance( 832 ASCII_STR("com.sun.star.document.DocumentProperties") ), 833 UNO_QUERY ); 834 835 pEmptyWin = new Window( this, WB_BORDER | WB_3DLOOK ); 836 } 837 838 SvtFrameWindow_Impl::~SvtFrameWindow_Impl() 839 { 840 delete pEditWin; 841 delete pEmptyWin; 842 xFrame->dispose(); 843 } 844 845 void SvtFrameWindow_Impl::ViewEditWin() 846 { 847 pEmptyWin->Hide(); 848 xWindow->setVisible( sal_False ); 849 pTextWin->Hide(); 850 pEditWin->Show(); 851 } 852 853 void SvtFrameWindow_Impl::ViewTextWin() 854 { 855 pEmptyWin->Hide(); 856 pEditWin->Hide(); 857 xWindow->setVisible( sal_True ); 858 pTextWin->Show(); 859 } 860 861 void SvtFrameWindow_Impl::ViewEmptyWin() 862 { 863 xWindow->setVisible( sal_False ); 864 pTextWin->Hide(); 865 pEditWin->Hide(); 866 pEmptyWin->Show(); 867 } 868 869 void SvtFrameWindow_Impl::ViewNonEmptyWin() 870 { 871 if( bDocInfo ) 872 ViewEditWin(); 873 else 874 ViewTextWin(); 875 } 876 877 IMPL_STATIC_LINK_NOINSTANCE( SvtFrameWindow_Impl, ExecuteHdl_Impl, SvtExecuteInfo*, pExecuteInfo ) 878 { 879 try 880 { 881 pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, Sequence < PropertyValue >() ); 882 } 883 catch ( Exception& ) 884 { 885 } 886 887 delete pExecuteInfo; 888 return 0; 889 } 890 891 void SvtFrameWindow_Impl::ShowDocInfo( const String& rURL ) 892 { 893 try 894 { 895 uno::Reference < task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance( 896 ::rtl::OUString::createFromAscii("com.sun.star.task.InteractionHandler") ), uno::UNO_QUERY ); 897 uno::Sequence < beans::PropertyValue> aProps(1); 898 aProps[0].Name = ::rtl::OUString::createFromAscii("InteractionHandler"); 899 aProps[0].Value <<= xInteractionHandler; 900 m_xDocProps->loadFromMedium( rURL, aProps ); 901 pEditWin->fill( m_xDocProps, rURL ); 902 } 903 catch ( UnknownPropertyException& ) {} 904 catch ( Exception& ) {} 905 } 906 907 void SvtFrameWindow_Impl::Resize() 908 { 909 Size aWinSize = GetOutputSizePixel(); 910 pEditWin->SetSizePixel( aWinSize ); 911 pTextWin->SetSizePixel( aWinSize ); 912 pEmptyWin->SetSizePixel( aWinSize ); 913 } 914 915 void SvtFrameWindow_Impl::OpenFile( const String& rURL, sal_Bool bPreview, sal_Bool bIsTemplate, sal_Bool bAsTemplate ) 916 { 917 if ( bPreview ) 918 aCurrentURL = rURL; 919 920 ViewNonEmptyWin(); 921 pEditWin->Clear(); 922 923 if ( rURL.Len() > 0 && bPreview && m_xDocProps.is() ) 924 ShowDocInfo( rURL ); 925 926 if ( rURL.Len() == 0 ) 927 { 928 xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() ); 929 ViewEmptyWin(); 930 } 931 else if ( !::utl::UCBContentHelper::IsFolder( rURL ) ) 932 { 933 com::sun::star::util::URL aURL; 934 aURL.Complete = rURL; 935 Reference < com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()-> 936 createInstance( ASCII_STR("com.sun.star.util.URLTransformer" ) ), UNO_QUERY ); 937 xTrans->parseStrict( aURL ); 938 939 String aTarget; 940 Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY ); 941 if ( bPreview ) 942 aTarget = ASCII_STR("_self"); 943 else 944 { 945 // can be removed if the database application change its URL 946 String sServiceScheme( RTL_CONSTASCII_STRINGPARAM( "service:" ) ); 947 if ( rURL.Match( sServiceScheme ) != sServiceScheme.Len() ) 948 // service URL has no default target 949 aTarget = ASCII_STR("_default"); 950 xProv = Reference < XDispatchProvider >( ::comphelper::getProcessServiceFactory()-> 951 createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY ); 952 } 953 954 Reference < XDispatch > xDisp = xProv.is() ? 955 xProv->queryDispatch( aURL, aTarget, 0 ) : Reference < XDispatch >(); 956 957 if ( xDisp.is() ) 958 { 959 if ( bPreview ) 960 { 961 if ( m_aOpenURL != aURL.Complete ) 962 { 963 WaitObject aWaitCursor( GetParent() ); 964 // disabling must be done here, does not work in ctor because 965 // execute of the dialog will overwrite it 966 // ( own execute method would help ) 967 pTextWin->EnableInput( sal_False, sal_True ); 968 if ( pTextWin->IsReallyVisible() ) 969 { 970 sal_Bool b = sal_True; 971 Sequence < PropertyValue > aArgs( 4 ); 972 aArgs[0].Name = ASCII_STR("Preview"); 973 aArgs[0].Value.setValue( &b, ::getBooleanCppuType() ); 974 aArgs[1].Name = ASCII_STR("ReadOnly"); 975 aArgs[1].Value.setValue( &b, ::getBooleanCppuType() ); 976 aArgs[2].Name = ASCII_STR("AsTemplate"); // prevents getting an empty URL with getURL()! 977 978 uno::Reference < task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance( 979 ::rtl::OUString::createFromAscii("com.sun.star.task.InteractionHandler") ), uno::UNO_QUERY ); 980 aArgs[3].Name = ::rtl::OUString::createFromAscii("InteractionHandler"); 981 aArgs[3].Value <<= xInteractionHandler; 982 983 b = sal_False; 984 aArgs[2].Value.setValue( &b, ::getBooleanCppuType() ); 985 xDisp->dispatch( aURL, aArgs ); 986 987 ::rtl::OUString aDispURL; 988 Reference< ::com::sun::star::frame::XController > xCtrl = xFrame->getController(); 989 if( xCtrl.is() ) 990 { 991 Reference< ::com::sun::star::frame::XModel > xMdl = xCtrl->getModel(); 992 if( xMdl.is() ) 993 aDispURL = xMdl->getURL(); 994 } 995 996 if( aDispURL != aURL.Complete ) 997 { 998 xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() ); 999 ViewEmptyWin(); 1000 m_aOpenURL = rtl::OUString(); 1001 } 1002 else 1003 m_aOpenURL = aDispURL; 1004 } 1005 } 1006 } 1007 else if ( bIsTemplate ) 1008 { 1009 Sequence < PropertyValue > aArgs( 1 ); 1010 aArgs[0].Name = ASCII_STR("AsTemplate"); 1011 aArgs[0].Value <<= bAsTemplate; 1012 xDisp->dispatch( aURL, aArgs ); 1013 m_aOpenURL = rtl::OUString(); 1014 } 1015 else 1016 { 1017 /* 1018 SvtExecuteInfo* pExecuteInfo = new SvtExecuteInfo; 1019 pExecuteInfo->xDispatch = xDisp; 1020 pExecuteInfo->aTargetURL = aURL; 1021 Application::PostUserEvent( 1022 STATIC_LINK(0, SvtFrameWindow_Impl, ExecuteHdl_Impl), pExecuteInfo ); 1023 */ 1024 Sequence < PropertyValue > aArgs; 1025 xDisp->dispatch( aURL, aArgs ); 1026 m_aOpenURL = rtl::OUString(); 1027 } 1028 } 1029 } 1030 } 1031 1032 void SvtFrameWindow_Impl::ToggleView( sal_Bool bDI ) 1033 { 1034 bDocInfo = bDI; 1035 1036 // view is set properly in OpenFile() 1037 1038 OpenFile( aCurrentURL, sal_True, sal_False, sal_False ); 1039 } 1040 1041 // class SvtTemplateWindow ----------------------------------------------- 1042 1043 SvtTemplateWindow::SvtTemplateWindow( Window* pParent ) : 1044 1045 Window( pParent, WB_DIALOGCONTROL ), 1046 1047 aFileViewTB ( this, SvtResId( TB_SVT_FILEVIEW ) ), 1048 aFrameWinTB ( this, SvtResId( TB_SVT_FRAMEWIN ) ), 1049 aSplitWin ( this, WB_DIALOGCONTROL | WB_NOSPLITDRAW ), 1050 pHistoryList ( NULL ) 1051 1052 { 1053 // create windows 1054 pIconWin = new SvtIconWindow_Impl( this ); 1055 pFileWin = new SvtFileViewWindow_Impl( this ); 1056 pFileWin->SetMyDocumentsURL( pIconWin->GetMyDocumentsRootURL() ); 1057 pFileWin->SetSamplesFolderURL( pIconWin->GetSamplesFolderURL() ); 1058 pFrameWin = new SvtFrameWindow_Impl( this ); 1059 1060 // set handlers 1061 pIconWin->SetClickHdl( LINK( this, SvtTemplateWindow, IconClickHdl_Impl ) ); 1062 pFileWin->SetSelectHdl( LINK( this, SvtTemplateWindow, FileSelectHdl_Impl ) ); 1063 pFileWin->SetDoubleClickHdl( LINK( this, SvtTemplateWindow, FileDblClickHdl_Impl ) ); 1064 pFileWin->SetNewFolderHdl( LINK( this, SvtTemplateWindow, NewFolderHdl_Impl ) ); 1065 1066 // create the split items 1067 aSplitWin.SetAlign( WINDOWALIGN_LEFT ); 1068 long nWidth = pIconWin->GetMaxTextLength() * 8 / 7 + 1; // extra space for border 1069 aSplitWin.InsertItem( ICONWIN_ID, pIconWin, nWidth, SPLITWINDOW_APPEND, 0, SWIB_FIXED ); 1070 aSplitWin.InsertItem( FILEWIN_ID, pFileWin, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE ); 1071 aSplitWin.InsertItem( FRAMEWIN_ID, pFrameWin, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE ); 1072 aSplitWin.SetSplitHdl( LINK( this, SvtTemplateWindow, ResizeHdl_Impl ) ); 1073 1074 // show the windows 1075 pIconWin->Show(); 1076 pFileWin->Show(); 1077 pFrameWin->Show(); 1078 aSplitWin.Show(); 1079 1080 // initialize the timers 1081 aSelectTimer.SetTimeout( 200 ); 1082 aSelectTimer.SetTimeoutHdl( LINK( this, SvtTemplateWindow, TimeoutHdl_Impl ) ); 1083 1084 // initialize the toolboxes and then show them 1085 InitToolBoxes(); 1086 aFileViewTB.Show(); 1087 aFrameWinTB.Show(); 1088 1089 ReadViewSettings( ); 1090 1091 Application::PostUserEvent( LINK( this, SvtTemplateWindow, ResizeHdl_Impl ) ); 1092 } 1093 1094 // ------------------------------------------------------------------------ 1095 1096 SvtTemplateWindow::~SvtTemplateWindow() 1097 { 1098 WriteViewSettings( ); 1099 1100 delete pIconWin; 1101 delete pFileWin; 1102 delete pFrameWin; 1103 if ( pHistoryList ) 1104 { 1105 for ( sal_uInt32 i = 0; i < pHistoryList->Count(); ++i ) 1106 delete pHistoryList->GetObject(i); 1107 delete pHistoryList; 1108 } 1109 } 1110 1111 // ------------------------------------------------------------------------ 1112 1113 IMPL_LINK ( SvtTemplateWindow , IconClickHdl_Impl, SvtIconChoiceCtrl *, EMPTYARG ) 1114 { 1115 String aURL = pIconWin->GetSelectedIconURL(); 1116 if ( !aURL.Len() ) 1117 aURL = pIconWin->GetCursorPosIconURL(); 1118 if ( pFileWin->GetRootURL() != aURL ) 1119 { 1120 pFileWin->OpenRoot( aURL ); 1121 pIconWin->InvalidateIconControl(); 1122 aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, sal_False ); 1123 } 1124 return 0; 1125 } 1126 1127 // ------------------------------------------------------------------------ 1128 1129 IMPL_LINK ( SvtTemplateWindow , FileSelectHdl_Impl, SvtFileView *, EMPTYARG ) 1130 { 1131 aSelectTimer.Start(); 1132 return 0; 1133 } 1134 1135 // ------------------------------------------------------------------------ 1136 1137 IMPL_LINK ( SvtTemplateWindow , FileDblClickHdl_Impl, SvtFileView *, EMPTYARG ) 1138 { 1139 if ( aSelectTimer.IsActive() ) 1140 aSelectTimer.Stop(); 1141 1142 String aURL = pFileWin->GetSelectedFile(); 1143 if ( aURL.Len() > 0 ) 1144 { 1145 if ( ::utl::UCBContentHelper::IsFolder( aURL ) ) 1146 pFileWin->OpenFolder( aURL ); 1147 else 1148 aDoubleClickHdl.Call( this ); 1149 } 1150 1151 return 0; 1152 } 1153 1154 // ------------------------------------------------------------------------ 1155 1156 IMPL_LINK ( SvtTemplateWindow , NewFolderHdl_Impl, SvtFileView *, EMPTYARG ) 1157 { 1158 pFrameWin->OpenFile( String(), sal_True, sal_False, sal_False ); 1159 aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, sal_False ); 1160 1161 String sURL = pFileWin->GetFolderURL(); 1162 sal_uLong nPos = pIconWin->GetRootPos( sURL ); 1163 AppendHistoryURL( sURL, nPos ); 1164 1165 aNewFolderHdl.Call( this ); 1166 return 0; 1167 } 1168 1169 // ------------------------------------------------------------------------ 1170 1171 IMPL_LINK ( SvtTemplateWindow , TimeoutHdl_Impl, Timer *, EMPTYARG ) 1172 { 1173 aSelectHdl.Call( this ); 1174 String sURL = pFileWin->GetSelectedFile(); 1175 sal_Bool bIsNewDoc = ( pIconWin->GetSelectEntryPos() == ICON_POS_NEWDOC ); 1176 sal_Bool bIsFile = ( sURL.Len() != 0 && !::utl::UCBContentHelper::IsFolder( sURL ) && 1177 INetURLObject( sURL ).GetProtocol() != INET_PROT_PRIVATE && !bIsNewDoc ); 1178 aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, bIsFile ); 1179 aFrameWinTB.EnableItem( TI_DOCTEMPLATE_PREVIEW, !bIsNewDoc ); 1180 1181 if ( bIsFile ) 1182 pFrameWin->OpenFile( sURL, sal_True, sal_False, sal_False ); 1183 else if ( bIsNewDoc && aFrameWinTB.IsItemChecked( TI_DOCTEMPLATE_PREVIEW ) ) 1184 { 1185 aFrameWinTB.CheckItem( TI_DOCTEMPLATE_DOCINFO ); 1186 DoAction( TI_DOCTEMPLATE_DOCINFO ); 1187 } 1188 return 0; 1189 } 1190 1191 // ------------------------------------------------------------------------ 1192 1193 IMPL_LINK ( SvtTemplateWindow , ClickHdl_Impl, ToolBox *, pToolBox ) 1194 { 1195 DoAction( pToolBox->GetCurItemId() ); 1196 return 0; 1197 } 1198 1199 // ------------------------------------------------------------------------ 1200 1201 IMPL_LINK ( SvtTemplateWindow , ResizeHdl_Impl, SplitWindow *, EMPTYARG ) 1202 { 1203 Resize(); 1204 return 0; 1205 } 1206 1207 // ------------------------------------------------------------------------ 1208 1209 void SvtTemplateWindow::PrintFile( const String& rURL ) 1210 { 1211 // open the file readonly and hidden 1212 Sequence < PropertyValue > aArgs( 2 ); 1213 aArgs[0].Name = ASCII_STR("ReadOnly"); 1214 aArgs[0].Value <<= sal_True; 1215 aArgs[1].Name = ASCII_STR("Hidden"); 1216 aArgs[1].Value <<= sal_True; 1217 1218 Reference < XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()-> 1219 createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY ); 1220 Reference < XModel > xModel( xDesktop->loadComponentFromURL( 1221 rURL, ASCII_STR("_blank"), 0, aArgs ), UNO_QUERY ); 1222 if ( xModel.is() ) 1223 { 1224 // print 1225 Reference < XPrintable > xPrintable( xModel, UNO_QUERY ); 1226 if ( xPrintable.is() ) 1227 xPrintable->print( Sequence < PropertyValue >() ); 1228 } 1229 } 1230 1231 // ------------------------------------------------------------------------ 1232 1233 void SvtTemplateWindow::AppendHistoryURL( const String& rURL, sal_uLong nGroup ) 1234 { 1235 sal_Bool bInsert = sal_True; 1236 if ( !pHistoryList ) 1237 pHistoryList = new HistoryList_Impl; 1238 else if ( pHistoryList->Count() > 0 ) 1239 { 1240 FolderHistory* pLastEntry = pHistoryList->GetObject( pHistoryList->Count() - 1 ); 1241 bInsert = ( rURL != pLastEntry->m_sURL); 1242 } 1243 1244 if ( bInsert ) 1245 { 1246 FolderHistory* pEntry = new FolderHistory( rURL, nGroup ); 1247 pHistoryList->Insert( pEntry, LIST_APPEND ); 1248 aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, pHistoryList->Count() > 1 ); 1249 } 1250 } 1251 1252 // ------------------------------------------------------------------------ 1253 1254 void SvtTemplateWindow::OpenHistory() 1255 { 1256 FolderHistory* pEntry = pHistoryList->Remove( pHistoryList->Count() - 1 ); 1257 pEntry = pHistoryList->Remove( pHistoryList->Count() - 1 ); 1258 aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, pHistoryList->Count() > 1 ); 1259 pFileWin->OpenFolder( pEntry->m_sURL ); 1260 pIconWin->SetCursorPos( pEntry->m_nGroup ); 1261 delete pEntry; 1262 } 1263 1264 // ------------------------------------------------------------------------ 1265 1266 void SvtTemplateWindow::DoAction( sal_uInt16 nAction ) 1267 { 1268 switch( nAction ) 1269 { 1270 case TI_DOCTEMPLATE_BACK : 1271 { 1272 if ( pHistoryList && pHistoryList->Count() > 1 ) 1273 OpenHistory(); 1274 break; 1275 } 1276 1277 case TI_DOCTEMPLATE_PREV : 1278 { 1279 String aURL; 1280 if ( pFileWin->HasPreviousLevel( aURL ) ) 1281 pFileWin->OpenFolder( aURL ); 1282 break; 1283 } 1284 1285 case TI_DOCTEMPLATE_PRINT : 1286 { 1287 String sPrintFile( pFileWin->GetSelectedFile() ); 1288 if ( sPrintFile.Len() > 0 ) 1289 PrintFile( sPrintFile ); 1290 break; 1291 } 1292 1293 case TI_DOCTEMPLATE_DOCINFO : 1294 case TI_DOCTEMPLATE_PREVIEW : 1295 { 1296 pFrameWin->ToggleView( TI_DOCTEMPLATE_DOCINFO == nAction ); 1297 break; 1298 } 1299 } 1300 } 1301 1302 // ------------------------------------------------------------------------ 1303 1304 void SvtTemplateWindow::InitToolBoxes() 1305 { 1306 InitToolBoxImages(); 1307 1308 Size aSize = aFileViewTB.CalcWindowSizePixel(); 1309 aSize.Height() += 4; 1310 aFileViewTB.SetPosSizePixel( Point( 0, 2 ), aSize ); 1311 aSize = aFrameWinTB.CalcWindowSizePixel(); 1312 aSize.Height() += 4; 1313 aFrameWinTB.SetPosSizePixel( Point( pFrameWin->GetPosPixel().X() + 2, 2 ), aSize ); 1314 1315 sal_Bool bFlat = ( SvtMiscOptions().GetToolboxStyle() == TOOLBOX_STYLE_FLAT ); 1316 if ( bFlat ) 1317 { 1318 aFileViewTB.SetOutStyle( TOOLBOX_STYLE_FLAT ); 1319 aFrameWinTB.SetOutStyle( TOOLBOX_STYLE_FLAT ); 1320 } 1321 1322 aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, sal_False ); 1323 aFileViewTB.EnableItem( TI_DOCTEMPLATE_PREV, sal_False ); 1324 aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, sal_False ); 1325 1326 Link aLink = LINK( this, SvtTemplateWindow, ClickHdl_Impl ); 1327 aFileViewTB.SetClickHdl( aLink ); 1328 aFrameWinTB.SetClickHdl( aLink ); 1329 } 1330 1331 // ------------------------------------------------------------------------ 1332 1333 void SvtTemplateWindow::InitToolBoxImages() 1334 { 1335 SvtMiscOptions aMiscOpt; 1336 sal_Bool bLarge = aMiscOpt.AreCurrentSymbolsLarge(); 1337 sal_Bool bHiContrast = aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode(); 1338 1339 aFileViewTB.SetItemImage( TI_DOCTEMPLATE_BACK, Image( SvtResId( 1340 bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_BACK_LARGE : IMG_SVT_DOCTEMPLATE_BACK_LARGE 1341 : bHiContrast ? IMG_SVT_DOCTEMPL_HC_BACK_SMALL : IMG_SVT_DOCTEMPLATE_BACK_SMALL ) ) ); 1342 aFileViewTB.SetItemImage( TI_DOCTEMPLATE_PREV, Image( SvtResId( 1343 bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREV_LARGE : IMG_SVT_DOCTEMPLATE_PREV_LARGE 1344 : bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREV_SMALL : IMG_SVT_DOCTEMPLATE_PREV_SMALL ) ) ); 1345 aFileViewTB.SetItemImage( TI_DOCTEMPLATE_PRINT, Image( SvtResId( 1346 bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_PRINT_LARGE : IMG_SVT_DOCTEMPLATE_PRINT_LARGE 1347 : bHiContrast ? IMG_SVT_DOCTEMPL_HC_PRINT_SMALL : IMG_SVT_DOCTEMPLATE_PRINT_SMALL ) ) ); 1348 1349 aFrameWinTB.SetItemImage( TI_DOCTEMPLATE_DOCINFO, Image( SvtResId( 1350 bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_DOCINFO_LARGE : IMG_SVT_DOCTEMPLATE_DOCINFO_LARGE 1351 : bHiContrast ? IMG_SVT_DOCTEMPL_HC_DOCINFO_SMALL : IMG_SVT_DOCTEMPLATE_DOCINFO_SMALL ) ) ); 1352 aFrameWinTB.SetItemImage( TI_DOCTEMPLATE_PREVIEW, Image( SvtResId( 1353 bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREVIEW_LARGE : IMG_SVT_DOCTEMPLATE_PREVIEW_LARGE 1354 : bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREVIEW_SMALL : IMG_SVT_DOCTEMPLATE_PREVIEW_SMALL ) ) ); 1355 } 1356 1357 // ------------------------------------------------------------------------ 1358 1359 void SvtTemplateWindow::UpdateIcons() 1360 { 1361 pIconWin->UpdateIcons( aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode() ); 1362 } 1363 1364 // ------------------------------------------------------------------------ 1365 1366 long SvtTemplateWindow::PreNotify( NotifyEvent& rNEvt ) 1367 { 1368 sal_uInt16 nType = rNEvt.GetType(); 1369 long nRet = 0; 1370 1371 if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() ) 1372 { 1373 const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); 1374 sal_uInt16 nCode = rKeyCode.GetCode(); 1375 1376 if ( KEY_BACKSPACE == nCode && !rKeyCode.GetModifier() && pFileWin->HasChildPathFocus() ) 1377 { 1378 DoAction( TI_DOCTEMPLATE_BACK ); 1379 nRet = 1; 1380 } 1381 else if ( pIconWin->ProcessKeyEvent( *rNEvt.GetKeyEvent() ) ) 1382 { 1383 nRet = 1; 1384 } 1385 } 1386 1387 return nRet ? nRet : Window::PreNotify( rNEvt ); 1388 } 1389 1390 // ----------------------------------------------------------------------------- 1391 1392 void SvtTemplateWindow::DataChanged( const DataChangedEvent& rDCEvt ) 1393 { 1394 Window::DataChanged( rDCEvt ); 1395 1396 if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || 1397 ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) && 1398 ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) 1399 { 1400 // update of the background for the area left of the FileView toolbox 1401 SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) ); 1402 // update of the images of the IconChoiceControl 1403 UpdateIcons(); 1404 // update of the toolbox images 1405 InitToolBoxImages(); 1406 } 1407 } 1408 // ------------------------------------------------------------------------ 1409 1410 void SvtTemplateWindow::Resize() 1411 { 1412 long nItemSize = aSplitWin.GetItemSize( ICONWIN_ID ); 1413 long nSplitterWidth = Splitter( this, 0 ).GetSizePixel().Width(); 1414 1415 Point aPos = aFileViewTB.GetPosPixel(); 1416 aPos.X() = nItemSize + nSplitterWidth / 2; 1417 aFileViewTB.SetPosPixel( aPos ); 1418 1419 Size aWinSize = GetOutputSizePixel(); 1420 long nWidth = aWinSize.Width() - aPos.X(); 1421 1422 nItemSize = nWidth * aSplitWin.GetItemSize( FILEWIN_ID ) / 100; 1423 aPos.X() = pFrameWin->GetPosPixel().X() + 2; 1424 aFrameWinTB.SetPosPixel( aPos ); 1425 1426 Size aSize = aFileViewTB.GetSizePixel(); 1427 aSize.Width() = nItemSize; 1428 aFileViewTB.SetSizePixel( aSize ); 1429 1430 aSize = aFrameWinTB.GetSizePixel(); 1431 aSize.Width() = nWidth - nItemSize; 1432 aFrameWinTB.SetSizePixel( aSize ); 1433 1434 long nToolBoxHeight = aSize.Height() + aFrameWinTB.GetPosPixel().Y(); 1435 aSize = aWinSize; 1436 aSize.Height() -= nToolBoxHeight; 1437 aSplitWin.SetPosSizePixel( Point( 0, nToolBoxHeight ), aSize ); 1438 } 1439 1440 // ------------------------------------------------------------------------ 1441 1442 String SvtTemplateWindow::GetSelectedFile() const 1443 { 1444 return pFileWin->GetSelectedFile(); 1445 } 1446 1447 // ------------------------------------------------------------------------ 1448 1449 sal_Bool SvtTemplateWindow::IsFileSelected() const 1450 { 1451 String aURL = pFileWin->GetSelectedFile(); 1452 sal_Bool bRet = ( aURL.Len() > 0 && !::utl::UCBContentHelper::IsFolder( aURL ) ); 1453 return bRet; 1454 } 1455 1456 // ------------------------------------------------------------------------ 1457 1458 void SvtTemplateWindow::OpenFile( sal_Bool bNotAsTemplate ) 1459 { 1460 String aURL = pFileWin->GetSelectedFile(); 1461 if ( aURL.Len() > 0 && !::utl::UCBContentHelper::IsFolder( aURL ) ) 1462 pFrameWin->OpenFile( aURL, sal_False, pFileWin->IsTemplateFolder(), !bNotAsTemplate ); 1463 } 1464 1465 // ------------------------------------------------------------------------ 1466 1467 String SvtTemplateWindow::GetFolderTitle() const 1468 { 1469 String sTitle; 1470 String sFolderURL = pFileWin->GetFolderURL(); 1471 if ( pIconWin->IsRootURL( sFolderURL ) ) 1472 sTitle = pIconWin->GetIconText( sFolderURL ); 1473 else 1474 sTitle = pFileWin->GetFolderTitle(); 1475 return sTitle; 1476 } 1477 1478 // ------------------------------------------------------------------------ 1479 1480 String SvtTemplateWindow::GetFolderURL() const 1481 { 1482 return pFileWin->GetFolderURL(); 1483 } 1484 1485 1486 // ------------------------------------------------------------------------ 1487 1488 void SvtTemplateWindow::SetFocus( sal_Bool bIconWin ) 1489 { 1490 if ( bIconWin ) 1491 pIconWin->SetFocus(); 1492 else 1493 pFileWin->SetFocus(); 1494 } 1495 1496 // ------------------------------------------------------------------------ 1497 1498 void SvtTemplateWindow::OpenTemplateRoot() 1499 { 1500 pFileWin->OpenFolder( pIconWin->GetTemplateRootURL() ); 1501 } 1502 1503 // ------------------------------------------------------------------------ 1504 1505 void SvtTemplateWindow::SetPrevLevelButtonState( const String& rURL ) 1506 { 1507 // disable the prev level button on root folder of the icon pane (except My Documents) 1508 // and on the root of all (file:/// -> count == 0) 1509 INetURLObject aObj( rURL ); 1510 sal_Int32 nCount = aObj.getSegmentCount(); 1511 sal_Bool bEnable = 1512 ( nCount > 0 && 1513 ( !pIconWin->IsRootURL( rURL ) || rURL == pIconWin->GetMyDocumentsRootURL() ) ); 1514 aFileViewTB.EnableItem( TI_DOCTEMPLATE_PREV, bEnable ); 1515 } 1516 1517 // ------------------------------------------------------------------------ 1518 1519 void SvtTemplateWindow::ClearHistory() 1520 { 1521 if( pHistoryList ) 1522 pHistoryList->Clear(); 1523 } 1524 1525 // ------------------------------------------------------------------------ 1526 1527 long SvtTemplateWindow::CalcHeight() const 1528 { 1529 // toolbox height 1530 long nHeight = aFileViewTB.GetSizePixel().Height(); 1531 // + iconwin height 1532 nHeight += pIconWin->CalcHeight(); 1533 // + little offset 1534 nHeight += 8; 1535 return nHeight; 1536 } 1537 1538 // ------------------------------------------------------------------------ 1539 1540 void SvtTemplateWindow::ReadViewSettings() 1541 { 1542 // defaults 1543 sal_Int32 nSelectedGroup = ICON_POS_TEMPLATES; 1544 sal_Int32 nSelectedView = TI_DOCTEMPLATE_DOCINFO; 1545 double nSplitRatio = 0.5; 1546 ::rtl::OUString sLastFolder; 1547 1548 SvtViewOptions aViewSettings( E_DIALOG, VIEWSETTING_NEWFROMTEMPLATE ); 1549 if ( aViewSettings.Exists() ) 1550 { 1551 // read the settings 1552 Sequence< NamedValue > aSettings = aViewSettings.GetUserData( ); 1553 1554 aViewSettings.GetUserItem( VIEWSETTING_SELECTEDGROUP ) >>= nSelectedGroup; 1555 aViewSettings.GetUserItem( VIEWSETTING_SELECTEDVIEW ) >>= nSelectedView; 1556 aViewSettings.GetUserItem( VIEWSETTING_SPLITRATIO ) >>= nSplitRatio; 1557 aViewSettings.GetUserItem( VIEWSETTING_LASTFOLDER ) >>= sLastFolder; 1558 } 1559 // normalize 1560 if ( nSelectedGroup < ICON_POS_NEWDOC ) nSelectedGroup = ICON_POS_NEWDOC; 1561 if ( nSelectedGroup > ICON_POS_SAMPLES ) nSelectedGroup = ICON_POS_SAMPLES; 1562 1563 if ( ( TI_DOCTEMPLATE_DOCINFO != nSelectedView ) && ( TI_DOCTEMPLATE_PREVIEW != nSelectedView ) ) 1564 nSelectedView = TI_DOCTEMPLATE_DOCINFO; 1565 1566 if ( nSplitRatio < 0.2 ) nSplitRatio = 0.2; 1567 if ( nSplitRatio > 0.8 ) nSplitRatio = 0.8; 1568 1569 // change our view according to the settings 1570 1571 // the selected view (details or preview) 1572 pFrameWin->ToggleView( TI_DOCTEMPLATE_DOCINFO == nSelectedView ); 1573 aFrameWinTB.CheckItem( (sal_uInt16)nSelectedView, sal_True ); 1574 1575 // the split ratio 1576 sal_Int32 nSplitFileAndFrameSize = aSplitWin.GetItemSize( FILEWIN_ID ) + aSplitWin.GetItemSize( FRAMEWIN_ID ); 1577 sal_Int32 nSplitFileSize = (sal_Int32)(nSplitFileAndFrameSize * nSplitRatio); 1578 sal_Int32 nSplitFrameSize = nSplitFileAndFrameSize - nSplitFileSize; 1579 aSplitWin.SetItemSize( FILEWIN_ID, nSplitFileSize ); 1580 aSplitWin.SetItemSize( FRAMEWIN_ID, nSplitFrameSize ); 1581 Resize(); 1582 1583 // the selected folder 1584 pIconWin->SetCursorPos( nSelectedGroup ); 1585 1586 // open the last folder or the selected group 1587 if ( sLastFolder.getLength() > 0 ) 1588 pFileWin->OpenFolder( sLastFolder ); 1589 else 1590 IconClickHdl_Impl( NULL ); 1591 } 1592 1593 // ------------------------------------------------------------------------ 1594 1595 void SvtTemplateWindow::WriteViewSettings() 1596 { 1597 // collect 1598 Sequence< NamedValue > aSettings(4); 1599 1600 // the selected group 1601 aSettings[0].Name = VIEWSETTING_SELECTEDGROUP; 1602 pIconWin->SetFocus(); 1603 aSettings[0].Value <<= (sal_Int32)pIconWin->GetCursorPos( ); 1604 1605 // the selected view mode 1606 aSettings[1].Name = VIEWSETTING_SELECTEDVIEW; 1607 aSettings[1].Value <<= sal_Int32( aFrameWinTB.IsItemChecked( TI_DOCTEMPLATE_DOCINFO ) ? TI_DOCTEMPLATE_DOCINFO : TI_DOCTEMPLATE_PREVIEW ); 1608 1609 // the split ratio 1610 aSettings[2].Name = VIEWSETTING_SPLITRATIO; 1611 sal_Int32 nSplitFileSize = aSplitWin.GetItemSize( FILEWIN_ID ); 1612 sal_Int32 nSplitFileAndFrameSize = nSplitFileSize + aSplitWin.GetItemSize( FRAMEWIN_ID ); 1613 aSettings[2].Value <<= double( 1.0 * nSplitFileSize / nSplitFileAndFrameSize ); 1614 1615 // last folder 1616 aSettings[3].Name = VIEWSETTING_LASTFOLDER; 1617 aSettings[3].Value <<= ::rtl::OUString( pFileWin->GetFolderURL() ); 1618 1619 // write 1620 SvtViewOptions aViewSettings( E_DIALOG, VIEWSETTING_NEWFROMTEMPLATE ); 1621 aViewSettings.SetUserData( aSettings ); 1622 } 1623 /* -----------------27.11.2002 17:20----------------- 1624 * 1625 * --------------------------------------------------*/ 1626 1627 void SvtTemplateWindow::SelectFolder(sal_Int32 nFolderPosition) 1628 { 1629 pIconWin->SelectFolder(nFolderPosition); 1630 } 1631 // struct SvtTmplDlg_Impl ------------------------------------------------ 1632 1633 struct SvtTmplDlg_Impl 1634 { 1635 SvtTemplateWindow* pWin; 1636 String aTitle; 1637 Timer aUpdateTimer; 1638 sal_Bool bSelectNoOpen; 1639 1640 uno::Reference< util::XOfficeInstallationDirectories > m_xOfficeInstDirs; 1641 1642 1643 SvtTmplDlg_Impl( Window* pParent ) : pWin( new SvtTemplateWindow( pParent ) ) ,bSelectNoOpen( sal_False ) {} 1644 1645 ~SvtTmplDlg_Impl() { delete pWin; } 1646 1647 uno::Reference< util::XOfficeInstallationDirectories > getOfficeInstDirs(); 1648 }; 1649 1650 uno::Reference< util::XOfficeInstallationDirectories > SvtTmplDlg_Impl::getOfficeInstDirs() 1651 { 1652 if ( !m_xOfficeInstDirs.is() ) 1653 { 1654 try 1655 { 1656 uno::Reference< lang::XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory(); 1657 1658 uno::Reference< beans::XPropertySet > xPropSet( xSMgr, uno::UNO_QUERY ); 1659 if ( xPropSet.is() ) 1660 { 1661 uno::Reference< uno::XComponentContext > xCtx; 1662 xPropSet->getPropertyValue( 1663 rtl::OUString( 1664 RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ) 1665 >>= xCtx; 1666 1667 if ( xCtx.is() ) 1668 { 1669 xCtx->getValueByName( 1670 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 1671 "/singletons/com.sun.star.util.theOfficeInstallationDirectories" ) ) ) 1672 >>= m_xOfficeInstDirs; 1673 } 1674 } 1675 } 1676 catch( uno::Exception& ) 1677 {} 1678 } 1679 1680 return m_xOfficeInstDirs; 1681 } 1682 1683 // class SvtDocumentTemplateDialog --------------------------------------- 1684 1685 SvtDocumentTemplateDialog::SvtDocumentTemplateDialog( Window* _pParent, SelectOnly ) : 1686 ModalDialog( _pParent, SvtResId( DLG_DOCTEMPLATE ) ), 1687 1688 aMoreTemplatesLink ( this, SvtResId( FT_DOCTEMPLATE_LINK ) ), 1689 aLine ( this, SvtResId( FL_DOCTEMPLATE ) ), 1690 aManageBtn ( this, SvtResId( BTN_DOCTEMPLATE_MANAGE ) ), 1691 aEditBtn ( this, SvtResId( BTN_DOCTEMPLATE_EDIT ) ), 1692 aOKBtn ( this, SvtResId( BTN_DOCTEMPLATE_OPEN ) ), 1693 aCancelBtn ( this, SvtResId( BTN_DOCTEMPLATE_CANCEL ) ), 1694 aHelpBtn ( this, SvtResId( BTN_DOCTEMPLATE_HELP ) ), 1695 pImpl ( NULL ) 1696 { 1697 FreeResource(); 1698 InitImpl( ); 1699 1700 // no editing of templates 1701 aEditBtn.Hide(); 1702 1703 pImpl->bSelectNoOpen = sal_True; 1704 } 1705 1706 // ------------------------------------------------------------------------ 1707 1708 SvtDocumentTemplateDialog::SvtDocumentTemplateDialog( Window* pParent ) : 1709 1710 ModalDialog( pParent, SvtResId( DLG_DOCTEMPLATE ) ), 1711 1712 aMoreTemplatesLink ( this, SvtResId( FT_DOCTEMPLATE_LINK ) ), 1713 aLine ( this, SvtResId( FL_DOCTEMPLATE ) ), 1714 aManageBtn ( this, SvtResId( BTN_DOCTEMPLATE_MANAGE ) ), 1715 aEditBtn ( this, SvtResId( BTN_DOCTEMPLATE_EDIT ) ), 1716 aOKBtn ( this, SvtResId( BTN_DOCTEMPLATE_OPEN ) ), 1717 aCancelBtn ( this, SvtResId( BTN_DOCTEMPLATE_CANCEL ) ), 1718 aHelpBtn ( this, SvtResId( BTN_DOCTEMPLATE_HELP ) ), 1719 pImpl ( NULL ) 1720 { 1721 FreeResource(); 1722 InitImpl( ); 1723 } 1724 1725 // ------------------------------------------------------------------------ 1726 1727 void SvtDocumentTemplateDialog::InitImpl( ) 1728 { 1729 pImpl = new SvtTmplDlg_Impl( this ); 1730 pImpl->aTitle = GetText(); 1731 1732 bool bHideLink = ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() 1733 == SvtExtendedSecurityOptions::OPEN_NEVER ); 1734 if ( !bHideLink ) 1735 { 1736 aMoreTemplatesLink.SetURL( String( 1737 RTL_CONSTASCII_STRINGPARAM( "http://templates.services.openoffice.org/?cid=923508" ) ) ); 1738 aMoreTemplatesLink.SetClickHdl( LINK( this, SvtDocumentTemplateDialog, OpenLinkHdl_Impl ) ); 1739 } 1740 else 1741 aMoreTemplatesLink.Hide(); 1742 1743 aManageBtn.SetClickHdl( LINK( this, SvtDocumentTemplateDialog, OrganizerHdl_Impl ) ); 1744 Link aLink = LINK( this, SvtDocumentTemplateDialog, OKHdl_Impl ); 1745 aEditBtn.SetClickHdl( aLink ); 1746 aOKBtn.SetClickHdl( aLink ); 1747 1748 pImpl->pWin->SetSelectHdl( LINK( this, SvtDocumentTemplateDialog, SelectHdl_Impl ) ); 1749 pImpl->pWin->SetDoubleClickHdl( LINK( this, SvtDocumentTemplateDialog, DoubleClickHdl_Impl ) ); 1750 pImpl->pWin->SetNewFolderHdl( LINK( this, SvtDocumentTemplateDialog, NewFolderHdl_Impl ) ); 1751 pImpl->pWin->SetSendFocusHdl( LINK( this, SvtDocumentTemplateDialog, SendFocusHdl_Impl ) ); 1752 1753 // dynamic height adjustment 1754 long nHeight = pImpl->pWin->CalcHeight(); 1755 1756 Size aSize = GetOutputSizePixel(); 1757 Point aPos = aMoreTemplatesLink.GetPosPixel(); 1758 Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT ); 1759 if ( bHideLink ) 1760 aPos.Y() += aMoreTemplatesLink.GetSizePixel().Height(); 1761 else 1762 aPos.Y() -= a6Size.Height(); 1763 long nDelta = aPos.Y() - nHeight; 1764 aSize.Height() -= nDelta; 1765 SetOutputSizePixel( aSize ); 1766 1767 aSize.Height() = nHeight; 1768 aSize.Width() -= ( a6Size.Width() * 2 ); 1769 pImpl->pWin->SetPosSizePixel( Point( a6Size.Width(), 0 ), aSize ); 1770 1771 aPos = aMoreTemplatesLink.GetPosPixel(); 1772 aPos.Y() -= nDelta; 1773 aMoreTemplatesLink.SetPosPixel( aPos ); 1774 aPos = aLine.GetPosPixel(); 1775 aPos.Y() -= nDelta; 1776 aLine.SetPosPixel( aPos ); 1777 aPos = aManageBtn.GetPosPixel(); 1778 aPos.Y() -= nDelta; 1779 aManageBtn.SetPosPixel( aPos ); 1780 aPos = aEditBtn.GetPosPixel(); 1781 aPos.Y() -= nDelta; 1782 aEditBtn.SetPosPixel( aPos ); 1783 aPos = aOKBtn.GetPosPixel(); 1784 aPos.Y() -= nDelta; 1785 aOKBtn.SetPosPixel( aPos ); 1786 aPos = aCancelBtn.GetPosPixel(); 1787 aPos.Y() -= nDelta; 1788 aCancelBtn.SetPosPixel( aPos ); 1789 aPos = aHelpBtn.GetPosPixel(); 1790 aPos.Y() -= nDelta; 1791 aHelpBtn.SetPosPixel( aPos ); 1792 1793 pImpl->pWin->Show(); 1794 1795 SelectHdl_Impl( NULL ); 1796 NewFolderHdl_Impl( NULL ); 1797 1798 UpdateHdl_Impl( NULL ); 1799 } 1800 1801 // ------------------------------------------------------------------------ 1802 1803 SvtDocumentTemplateDialog::~SvtDocumentTemplateDialog() 1804 { 1805 delete pImpl; 1806 } 1807 1808 // ------------------------------------------------------------------------ 1809 1810 sal_Bool SvtDocumentTemplateDialog::IsFileSelected( ) const 1811 { 1812 return pImpl->pWin->IsFileSelected(); 1813 } 1814 1815 // ------------------------------------------------------------------------ 1816 1817 String SvtDocumentTemplateDialog::GetSelectedFileURL( ) const 1818 { 1819 return pImpl->pWin->GetSelectedFile(); 1820 } 1821 1822 // ------------------------------------------------------------------------ 1823 1824 sal_Bool SvtDocumentTemplateDialog::CanEnableEditBtn() const 1825 { 1826 sal_Bool bEnable = sal_False; 1827 1828 ::rtl::OUString aFolderURL = pImpl->pWin->GetFolderURL(); 1829 if ( pImpl->pWin->IsFileSelected() && aFolderURL.getLength() ) 1830 { 1831 ::rtl::OUString aFileTargetURL = pImpl->pWin->GetSelectedFile(); 1832 bEnable = aFileTargetURL.getLength() > 0; 1833 } 1834 1835 return bEnable; 1836 } 1837 1838 // ------------------------------------------------------------------------ 1839 1840 IMPL_LINK ( SvtDocumentTemplateDialog , SelectHdl_Impl, SvtTemplateWindow *, EMPTYARG ) 1841 { 1842 aEditBtn.Enable( pImpl->pWin->IsTemplateFolderOpen() && CanEnableEditBtn() ); 1843 aOKBtn.Enable( pImpl->pWin->IsFileSelected() ); 1844 return 0; 1845 } 1846 1847 // ------------------------------------------------------------------------ 1848 1849 IMPL_LINK ( SvtDocumentTemplateDialog , DoubleClickHdl_Impl, SvtTemplateWindow *, EMPTYARG ) 1850 { 1851 EndDialog( RET_OK ); 1852 1853 if ( !pImpl->bSelectNoOpen ) 1854 pImpl->pWin->OpenFile( !pImpl->pWin->IsTemplateFolderOpen() ); 1855 return 0; 1856 } 1857 1858 // ------------------------------------------------------------------------ 1859 1860 IMPL_LINK ( SvtDocumentTemplateDialog , NewFolderHdl_Impl, SvtTemplateWindow *, EMPTYARG ) 1861 { 1862 String aNewTitle( pImpl->aTitle ); 1863 aNewTitle += String( ASCII_STR(" - ") ); 1864 aNewTitle += pImpl->pWin->GetFolderTitle(); 1865 SetText( aNewTitle ); 1866 1867 SelectHdl_Impl( NULL ); 1868 return 0; 1869 } 1870 1871 // ------------------------------------------------------------------------ 1872 1873 IMPL_LINK ( SvtDocumentTemplateDialog , SendFocusHdl_Impl, SvtTemplateWindow *, EMPTYARG ) 1874 { 1875 if ( pImpl->pWin->HasIconWinFocus() ) 1876 aHelpBtn.GrabFocus(); 1877 else 1878 { 1879 if ( aEditBtn.IsEnabled() ) 1880 aEditBtn.GrabFocus(); 1881 else if ( aOKBtn.IsEnabled() ) 1882 aOKBtn.GrabFocus(); 1883 else 1884 aCancelBtn.GrabFocus(); 1885 } 1886 1887 return 0; 1888 } 1889 1890 // ------------------------------------------------------------------------ 1891 1892 IMPL_LINK ( SvtDocumentTemplateDialog , OKHdl_Impl, PushButton *, pBtn ) 1893 { 1894 if ( pImpl->pWin->IsFileSelected() ) 1895 { 1896 EndDialog( RET_OK ); 1897 1898 if ( !pImpl->bSelectNoOpen ) 1899 pImpl->pWin->OpenFile( &aEditBtn == pBtn ); 1900 } 1901 return 0; 1902 } 1903 1904 // ------------------------------------------------------------------------ 1905 1906 IMPL_LINK ( SvtDocumentTemplateDialog , OrganizerHdl_Impl, PushButton *, EMPTYARG ) 1907 { 1908 Window* pOldDefWin = Application::GetDefDialogParent(); 1909 Application::SetDefDialogParent( this ); 1910 Reference < XFramesSupplier > xDesktop = Reference < XFramesSupplier >( 1911 ::comphelper::getProcessServiceFactory()-> 1912 createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY ); 1913 Reference < XFrame > xFrame( xDesktop->getActiveFrame() ); 1914 if ( !xFrame.is() ) 1915 xFrame = Reference < XFrame >( xDesktop, UNO_QUERY ); 1916 1917 com::sun::star::util::URL aTargetURL; 1918 aTargetURL.Complete = ASCII_STR("slot:5540"); 1919 Reference < com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()-> 1920 createInstance( ASCII_STR("com.sun.star.util.URLTransformer") ), UNO_QUERY ); 1921 xTrans->parseStrict( aTargetURL ); 1922 1923 Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY ); 1924 Reference < XDispatch > xDisp; 1925 xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); 1926 1927 if ( xDisp.is() ) 1928 { 1929 Sequence<PropertyValue> aArgs(1); 1930 PropertyValue* pArg = aArgs.getArray(); 1931 pArg[0].Name = ASCII_STR("Referer"); 1932 pArg[0].Value <<= ASCII_STR("private:user"); 1933 xDisp->dispatch( aTargetURL, aArgs ); 1934 } 1935 1936 Application::SetDefDialogParent( pOldDefWin ); 1937 return 0; 1938 } 1939 1940 // ------------------------------------------------------------------------ 1941 1942 IMPL_LINK ( SvtDocumentTemplateDialog, UpdateHdl_Impl, Timer*, _pEventSource ) 1943 { 1944 pImpl->pWin->SetFocus( sal_False ); 1945 Reference< XDocumentTemplates > xTemplates( ::comphelper::getProcessServiceFactory()-> 1946 createInstance( ASCII_STR("com.sun.star.frame.DocumentTemplates") ), UNO_QUERY ); 1947 if ( xTemplates.is() ) 1948 { 1949 if ( _pEventSource ) 1950 { // it was no direct call, which means it was triggered by the timer, which means we alread checked the necessity 1951 WaitObject aWaitCursor( this ); 1952 xTemplates->update(); 1953 if ( pImpl->pWin->IsTemplateFolderOpen() ) 1954 { 1955 pImpl->pWin->ClearHistory(); 1956 pImpl->pWin->OpenTemplateRoot(); 1957 } 1958 } 1959 else 1960 { 1961 // check if we really need to do the update 1962 ::svt::TemplateFolderCache aCache; 1963 if ( aCache.needsUpdate() ) 1964 { // yes -> do it asynchronous (it will take a noticeable time) 1965 1966 // (but first store the current state) 1967 aCache.storeState(); 1968 1969 // start the timer for the async update 1970 pImpl->aUpdateTimer.SetTimeout( 300 ); 1971 pImpl->aUpdateTimer.SetTimeoutHdl( LINK( this, SvtDocumentTemplateDialog, UpdateHdl_Impl ) ); 1972 pImpl->aUpdateTimer.Start(); 1973 } 1974 } 1975 } 1976 return 0; 1977 } 1978 1979 // ------------------------------------------------------------------------ 1980 1981 IMPL_LINK ( SvtDocumentTemplateDialog, OpenLinkHdl_Impl, svt::FixedHyperlink*, EMPTYARG ) 1982 { 1983 ::rtl::OUString sURL( aMoreTemplatesLink.GetURL() ); 1984 if ( sURL.getLength() > 0 ) 1985 { 1986 try 1987 { 1988 uno::Reference< com::sun::star::system::XSystemShellExecute > xSystemShell( 1989 com::sun::star::system::SystemShellExecute::create( 1990 ::comphelper::getProcessComponentContext() ) ); 1991 if ( xSystemShell.is() ) 1992 xSystemShell->execute( sURL, ::rtl::OUString(), com::sun::star::system::SystemShellExecuteFlags::DEFAULTS ); 1993 EndDialog( RET_CANCEL ); 1994 } 1995 catch( const uno::Exception& e ) 1996 { 1997 OSL_TRACE( "Caught exception: %s\n thread terminated.\n", 1998 rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); 1999 } 2000 } 2001 return 0; 2002 } 2003 2004 /* -----------------27.11.2002 16:54----------------- 2005 * 2006 * --------------------------------------------------*/ 2007 void SvtDocumentTemplateDialog::SelectTemplateFolder() 2008 { 2009 pImpl->pWin->SelectFolder(ICON_POS_TEMPLATES); 2010 } 2011 2012