/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: baside3.cxx,v $ * $Revision: 1.43 $ * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_basctl.hxx" //svdraw.hxx //#define _SVDRAW_HXX *** #define _SDR_NOITEMS #define _SDR_NOTOUCH #define _SDR_NOTRANSFORM #define _SDR_NOOBJECTS //#define _SDR_NOVIEWS *** #define _SDR_NOVIEWMARKER #define _SDR_NODRAGMETHODS //#define _SDR_NOUNDO *** #define _SDR_NOXOUTDEV #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER2_HPP_ #include #endif #include #include #include #include #include #include #include #include #include #include #include using namespace comphelper; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::ucb; using namespace ::com::sun::star::io; using namespace ::com::sun::star::resource; using namespace ::com::sun::star::ui::dialogs; #if defined(MAC) #define FILTERMASK_ALL "****" #elif defined(OW) || defined(MTF) #define FILTERMASK_ALL "*" #elif defined(PM2) #define FILTERMASK_ALL "" #else #define FILTERMASK_ALL "*.*" #endif DBG_NAME( DialogWindow ) TYPEINIT1( DialogWindow, IDEBaseWindow ); DialogWindow::DialogWindow( Window* pParent, const ScriptDocument& rDocument, String aLibName, String aName, const com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >& xDialogModel ) :IDEBaseWindow( pParent, rDocument, aLibName, aName ) ,pUndoMgr(NULL) { InitSettings( TRUE, TRUE, TRUE ); pEditor = new DlgEditor(); pEditor->SetWindow( this ); pEditor->SetDialog( xDialogModel ); // Undo einrichten pUndoMgr = new SfxUndoManager; Link aDummyLink; aOldNotifyUndoActionHdl = pEditor->GetModel()->GetNotifyUndoActionHdl(); pEditor->GetModel()->SetNotifyUndoActionHdl( LINK(this, DialogWindow, NotifyUndoActionHdl)); SetHelpId( HID_BASICIDE_DIALOGWINDOW ); // set readonly mode for readonly libraries ::rtl::OUString aOULibName( aLibName ); Reference< script::XLibraryContainer2 > xDlgLibContainer( GetDocument().getLibraryContainer( E_DIALOGS ), UNO_QUERY ); if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && xDlgLibContainer->isLibraryReadOnly( aOULibName ) ) SetReadOnly( TRUE ); if ( rDocument.isDocument() && rDocument.isReadOnly() ) SetReadOnly( TRUE ); } DialogWindow::~DialogWindow() { delete pEditor; delete pUndoMgr; } void DialogWindow::LoseFocus() { if ( IsModified() ) StoreData(); Window::LoseFocus(); } void DialogWindow::Paint( const Rectangle& rRect ) { pEditor->Paint( rRect ); } void DialogWindow::Resize() { if ( GetHScrollBar() && GetVScrollBar() ) { pEditor->SetScrollBars( GetHScrollBar(), GetVScrollBar() ); } } void DialogWindow::MouseButtonDown( const MouseEvent& rMEvt ) { pEditor->MouseButtonDown( rMEvt ); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_SHOW_PROPERTYBROWSER ); } void DialogWindow::MouseButtonUp( const MouseEvent& rMEvt ) { pEditor->MouseButtonUp( rMEvt ); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if( (pEditor->GetMode() == DLGED_INSERT) && !pEditor->IsCreateOK() ) { pEditor->SetMode( DLGED_SELECT ); if ( pBindings ) pBindings->Invalidate( SID_CHOOSE_CONTROLS ); } if ( pBindings ) { pBindings->Invalidate( SID_SHOW_PROPERTYBROWSER ); pBindings->Invalidate( SID_DOC_MODIFIED ); pBindings->Invalidate( SID_SAVEDOC ); } } void DialogWindow::MouseMove( const MouseEvent& rMEvt ) { pEditor->MouseMove( rMEvt ); } void DialogWindow::KeyInput( const KeyEvent& rKEvt ) { if( rKEvt.GetKeyCode() == KEY_BACKSPACE ) { BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL; if( pDispatcher ) { pDispatcher->Execute( SID_BACKSPACE ); } } else { SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if( pBindings && rKEvt.GetKeyCode() == KEY_TAB ) pBindings->Invalidate( SID_SHOW_PROPERTYBROWSER ); if( !pEditor->KeyInput( rKEvt ) ) { if( !SfxViewShell::Current()->KeyInput( rKEvt ) ) Window::KeyInput( rKEvt ); } } } void DialogWindow::Command( const CommandEvent& rCEvt ) { if ( ( rCEvt.GetCommand() == COMMAND_WHEEL ) || ( rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL ) || ( rCEvt.GetCommand() == COMMAND_AUTOSCROLL ) ) { HandleScrollCommand( rCEvt, GetHScrollBar(), GetVScrollBar() ); } else if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) { BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL; if ( pDispatcher ) { SdrView* pView = GetView(); if( !rCEvt.IsMouseEvent() && pView->AreObjectsMarked() ) { Rectangle aMarkedRect( pView->GetMarkedRect() ); Point MarkedCenter( aMarkedRect.Center() ); Point PosPixel( LogicToPixel( MarkedCenter ) ); pDispatcher->ExecutePopup( IDEResId(RID_POPUP_DLGED), this, &PosPixel ); } else { pDispatcher->ExecutePopup( IDEResId(RID_POPUP_DLGED) ); } } } else IDEBaseWindow::Command( rCEvt ); } IMPL_LINK( DialogWindow, NotifyUndoActionHdl, SfxUndoAction *, pUndoAction ) { (void)pUndoAction; // not working yet for unocontrols /* if (pUndoAction) { pUndoMgr->AddUndoAction( pUndoAction ); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_UNDO ); } */ return 0; } void __EXPORT DialogWindow::DoInit() { GetHScrollBar()->Show(); GetVScrollBar()->Show(); pEditor->SetScrollBars( GetHScrollBar(), GetVScrollBar() ); } void __EXPORT DialogWindow::DoScroll( ScrollBar* pCurScrollBar ) { pEditor->DoScroll( pCurScrollBar ); } void __EXPORT DialogWindow::GetState( SfxItemSet& rSet ) { SfxWhichIter aIter(rSet); for ( USHORT nWh = aIter.FirstWhich(); 0 != nWh; nWh = aIter.NextWhich() ) { switch ( nWh ) { case SID_PASTE: { if ( !IsPasteAllowed() ) rSet.DisableItem( nWh ); if ( IsReadOnly() ) rSet.DisableItem( nWh ); } break; case SID_COPY: { // any object selected? if ( !pEditor->GetView()->AreObjectsMarked() ) rSet.DisableItem( nWh ); } break; case SID_CUT: case SID_DELETE: case SID_BACKSPACE: { // any object selected? if ( !pEditor->GetView()->AreObjectsMarked() ) rSet.DisableItem( nWh ); if ( IsReadOnly() ) rSet.DisableItem( nWh ); } break; case SID_REDO: { if ( !pUndoMgr->GetUndoActionCount() ) rSet.DisableItem( nWh ); } break; // Nur Dialogfenster: case SID_DIALOG_TESTMODE: { // ist die IDE noch aktiv? if( IDE_DLL()->GetShell()->GetFrame() ) { rSet.Put( SfxBoolItem( SID_DIALOG_TESTMODE, (pEditor->GetMode() == DLGED_TEST) ? TRUE : FALSE) ); } else rSet.Put( SfxBoolItem( SID_DIALOG_TESTMODE,FALSE )); } break; case SID_CHOOSE_CONTROLS: { if ( IsReadOnly() ) { rSet.DisableItem( nWh ); } else { SfxAllEnumItem aItem( SID_CHOOSE_CONTROLS ); if ( GetEditor()->GetMode() == DLGED_SELECT ) aItem.SetValue( SVX_SNAP_SELECT ); else { USHORT nObj; switch( pEditor->GetInsertObj() ) { case OBJ_DLG_PUSHBUTTON: nObj = SVX_SNAP_PUSHBUTTON; break; case OBJ_DLG_RADIOBUTTON: nObj = SVX_SNAP_RADIOBUTTON; break; case OBJ_DLG_CHECKBOX: nObj = SVX_SNAP_CHECKBOX; break; case OBJ_DLG_LISTBOX: nObj = SVX_SNAP_LISTBOX; break; case OBJ_DLG_COMBOBOX: nObj = SVX_SNAP_COMBOBOX; break; case OBJ_DLG_GROUPBOX: nObj = SVX_SNAP_GROUPBOX; break; case OBJ_DLG_EDIT: nObj = SVX_SNAP_EDIT; break; case OBJ_DLG_FIXEDTEXT: nObj = SVX_SNAP_FIXEDTEXT; break; case OBJ_DLG_IMAGECONTROL: nObj = SVX_SNAP_IMAGECONTROL; break; case OBJ_DLG_PROGRESSBAR: nObj = SVX_SNAP_PROGRESSBAR; break; case OBJ_DLG_HSCROLLBAR: nObj = SVX_SNAP_HSCROLLBAR; break; case OBJ_DLG_VSCROLLBAR: nObj = SVX_SNAP_VSCROLLBAR; break; case OBJ_DLG_HFIXEDLINE: nObj = SVX_SNAP_HFIXEDLINE; break; case OBJ_DLG_VFIXEDLINE: nObj = SVX_SNAP_VFIXEDLINE; break; case OBJ_DLG_DATEFIELD: nObj = SVX_SNAP_DATEFIELD; break; case OBJ_DLG_TIMEFIELD: nObj = SVX_SNAP_TIMEFIELD; break; case OBJ_DLG_NUMERICFIELD: nObj = SVX_SNAP_NUMERICFIELD; break; case OBJ_DLG_CURRENCYFIELD: nObj = SVX_SNAP_CURRENCYFIELD; break; case OBJ_DLG_FORMATTEDFIELD: nObj = SVX_SNAP_FORMATTEDFIELD; break; case OBJ_DLG_PATTERNFIELD: nObj = SVX_SNAP_PATTERNFIELD; break; case OBJ_DLG_FILECONTROL: nObj = SVX_SNAP_FILECONTROL; break; case OBJ_DLG_TREECONTROL: nObj = SVX_SNAP_TREECONTROL; break; default: nObj = 0; } #ifdef DBG_UTIL if( !nObj ) { DBG_WARNING( "SID_CHOOSE_CONTROLS: Unbekannt!" ); } #endif aItem.SetValue( nObj ); } rSet.Put( aItem ); } } break; case SID_SHOW_PROPERTYBROWSER: { BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; if ( pViewFrame && !pViewFrame->HasChildWindow( SID_SHOW_PROPERTYBROWSER ) && !pEditor->GetView()->AreObjectsMarked() ) rSet.DisableItem( nWh ); if ( IsReadOnly() ) rSet.DisableItem( nWh ); } break; } } } void __EXPORT DialogWindow::ExecuteCommand( SfxRequest& rReq ) { switch ( rReq.GetSlot() ) { case SID_CUT: if ( !IsReadOnly() ) { GetEditor()->Cut(); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_DOC_MODIFIED ); } break; case SID_DELETE: if ( !IsReadOnly() ) { GetEditor()->Delete(); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_DOC_MODIFIED ); } break; case SID_COPY: GetEditor()->Copy(); break; case SID_PASTE: if ( !IsReadOnly() ) { GetEditor()->Paste(); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_DOC_MODIFIED ); } break; case SID_CHOOSE_CONTROLS: { const SfxItemSet* pArgs = rReq.GetArgs(); DBG_ASSERT( pArgs, "Nix Args" ); const SfxAllEnumItem& rItem = (SfxAllEnumItem&)pArgs->Get( SID_CHOOSE_CONTROLS ); switch( rItem.GetValue() ) { case SVX_SNAP_PUSHBUTTON: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_PUSHBUTTON ); } break; case SVX_SNAP_RADIOBUTTON: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_RADIOBUTTON ); } break; case SVX_SNAP_CHECKBOX: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_CHECKBOX); } break; case SVX_SNAP_LISTBOX: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_LISTBOX ); } break; case SVX_SNAP_COMBOBOX: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_COMBOBOX ); } break; case SVX_SNAP_GROUPBOX: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_GROUPBOX ); } break; case SVX_SNAP_EDIT: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_EDIT ); } break; case SVX_SNAP_FIXEDTEXT: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_FIXEDTEXT ); } break; case SVX_SNAP_IMAGECONTROL: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_IMAGECONTROL ); } break; case SVX_SNAP_PROGRESSBAR: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_PROGRESSBAR ); } break; case SVX_SNAP_HSCROLLBAR: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_HSCROLLBAR ); } break; case SVX_SNAP_VSCROLLBAR: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_VSCROLLBAR ); } break; case SVX_SNAP_HFIXEDLINE: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_HFIXEDLINE ); } break; case SVX_SNAP_VFIXEDLINE: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_VFIXEDLINE ); } break; case SVX_SNAP_DATEFIELD: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_DATEFIELD ); } break; case SVX_SNAP_TIMEFIELD: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_TIMEFIELD ); } break; case SVX_SNAP_NUMERICFIELD: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_NUMERICFIELD ); } break; case SVX_SNAP_CURRENCYFIELD: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_CURRENCYFIELD ); } break; case SVX_SNAP_FORMATTEDFIELD: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_FORMATTEDFIELD ); } break; case SVX_SNAP_PATTERNFIELD: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_PATTERNFIELD ); } break; case SVX_SNAP_FILECONTROL: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_FILECONTROL ); } break; case SVX_SNAP_TREECONTROL: { GetEditor()->SetMode( DLGED_INSERT ); GetEditor()->SetInsertObj( OBJ_DLG_TREECONTROL ); } break; case SVX_SNAP_SELECT: { GetEditor()->SetMode( DLGED_SELECT ); } break; } if ( rReq.GetModifier() & KEY_MOD1 ) { if ( GetEditor()->GetMode() == DLGED_INSERT ) GetEditor()->CreateDefaultObject(); } SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_DOC_MODIFIED ); } break; case SID_DIALOG_TESTMODE: { DlgEdMode eOldMode = GetEditor()->GetMode(); GetEditor()->SetMode( DLGED_TEST ); GetEditor()->SetMode( eOldMode ); rReq.Done(); SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_DIALOG_TESTMODE ); return; } case SID_EXPORT_DIALOG: SaveDialog(); break; case SID_IMPORT_DIALOG: ImportDialog(); break; } rReq.Done(); } Reference< container::XNameContainer > DialogWindow::GetDialog() const { return pEditor->GetDialog(); } BOOL DialogWindow::RenameDialog( const String& rNewName ) { if ( !BasicIDE::RenameDialog( this, GetDocument(), GetLibName(), GetName(), rNewName ) ) return FALSE; SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); if ( pBindings ) pBindings->Invalidate( SID_DOC_MODIFIED ); return TRUE; } void DialogWindow::DisableBrowser() { BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow(SID_SHOW_PROPERTYBROWSER) : NULL; if( pChildWin ) ((PropBrw*)(pChildWin->GetWindow()))->Update( NULL ); } void DialogWindow::UpdateBrowser() { BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow(SID_SHOW_PROPERTYBROWSER) : NULL; if( pChildWin ) ((PropBrw*)(pChildWin->GetWindow()))->Update( pIDEShell ); } static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAscii( "ResourceResolver" ); BOOL DialogWindow::SaveDialog() { DBG_CHKTHIS( DialogWindow, 0 ); BOOL bDone = FALSE; Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() ); Reference < XFilePicker > xFP; if( xMSF.is() ) { Sequence aServiceType(1); aServiceType[0] <<= TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD; xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY ); } Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY); xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False); Any aValue; aValue <<= (sal_Bool) sal_True; xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue); if ( aCurPath.Len() ) xFP->setDisplayDirectory ( aCurPath ); xFP->setDefaultName( ::rtl::OUString( GetName() ) ); String aDialogStr( IDEResId( RID_STR_STDDIALOGNAME ) ); Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY); xFltMgr->appendFilter( aDialogStr, String( RTL_CONSTASCII_USTRINGPARAM( "*.xdl" ) ) ); xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) ); xFltMgr->setCurrentFilter( aDialogStr ); if( xFP->execute() == RET_OK ) { Sequence< ::rtl::OUString > aPaths = xFP->getFiles(); aCurPath = aPaths[0]; // export dialog model to xml Reference< container::XNameContainer > xDialogModel = GetDialog(); Reference< XComponentContext > xContext; Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY ); OSL_ASSERT( xProps.is() ); OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); Reference< XInputStream > xInput( xISP->createInputStream() ); Reference< XSimpleFileAccess > xSFI( xMSF->createInstance ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY ); Reference< XOutputStream > xOutput; try { if( xSFI->exists( aCurPath ) ) xSFI->kill( aCurPath ); xOutput = xSFI->openFileWrite( aCurPath ); } catch( Exception& ) {} if( xOutput.is() ) { Sequence< sal_Int8 > bytes; sal_Int32 nRead = xInput->readBytes( bytes, xInput->available() ); for (;;) { if( nRead ) xOutput->writeBytes( bytes ); nRead = xInput->readBytes( bytes, 1024 ); if (! nRead) break; } bDone = true; // With resource? Reference< beans::XPropertySet > xDialogModelPropSet( xDialogModel, UNO_QUERY ); Reference< resource::XStringResourceResolver > xStringResourceResolver; if( xDialogModelPropSet.is() ) { try { Any aResourceResolver = xDialogModelPropSet->getPropertyValue( aResourceResolverPropName ); aResourceResolver >>= xStringResourceResolver; } catch( beans::UnknownPropertyException& ) {} } bool bResource = false; if( xStringResourceResolver.is() ) { Sequence< lang::Locale > aLocaleSeq = xStringResourceResolver->getLocales(); sal_Int32 nLocaleCount = aLocaleSeq.getLength(); if( nLocaleCount > 0 ) bResource = true; } if( bResource ) { INetURLObject aURLObj( aCurPath ); aURLObj.removeExtension(); ::rtl::OUString aDialogName( aURLObj.getName() ); aURLObj.removeSegment(); ::rtl::OUString aURL( aURLObj.GetMainURL( INetURLObject::NO_DECODE ) ); sal_Bool bReadOnly = sal_False; ::rtl::OUString aComment( ::rtl::OUString::createFromAscii( "# " ) ); aComment += aDialogName; aComment += ::rtl::OUString::createFromAscii( " strings" ); Reference< task::XInteractionHandler > xDummyHandler; // Remove old properties files in case of overwriting Dialog files if( xSFI->isFolder( aURL ) ) { Sequence< ::rtl::OUString > aContentSeq = xSFI->getFolderContents( aURL, false ); ::rtl::OUString aDialogName_( aDialogName ); aDialogName_ += ::rtl::OUString::createFromAscii( "_" ); sal_Int32 nCount = aContentSeq.getLength(); const ::rtl::OUString* pFiles = aContentSeq.getConstArray(); for( int i = 0 ; i < nCount ; i++ ) { ::rtl::OUString aCompleteName = pFiles[i]; rtl::OUString aPureName; rtl::OUString aExtension; sal_Int32 iDot = aCompleteName.lastIndexOf( '.' ); sal_Int32 iSlash = aCompleteName.lastIndexOf( '/' ); if( iDot != -1 ) { sal_Int32 iCopyFrom = (iSlash != -1) ? iSlash + 1 : 0; aPureName = aCompleteName.copy( iCopyFrom, iDot-iCopyFrom ); aExtension = aCompleteName.copy( iDot + 1 ); } if( aExtension.equalsAscii( "properties" ) || aExtension.equalsAscii( "default" ) ) { if( aPureName.indexOf( aDialogName_ ) == 0 ) { try { xSFI->kill( aCompleteName ); } catch( uno::Exception& ) {} } } } } Reference< XStringResourceWithLocation > xStringResourceWithLocation = StringResourceWithLocation::create( xContext, aURL, bReadOnly, xStringResourceResolver->getDefaultLocale(), aDialogName, aComment, xDummyHandler ); // Add locales Sequence< lang::Locale > aLocaleSeq = xStringResourceResolver->getLocales(); const lang::Locale* pLocales = aLocaleSeq.getConstArray(); sal_Int32 nLocaleCount = aLocaleSeq.getLength(); for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ ) { const lang::Locale& rLocale = pLocales[ iLocale ]; xStringResourceWithLocation->newLocale( rLocale ); } Reference< XStringResourceManager > xTargetStringResourceManager( xStringResourceWithLocation, uno::UNO_QUERY ); LocalizationMgr::copyResourceForDialog( xDialogModel, xStringResourceResolver, xTargetStringResourceManager ); xStringResourceWithLocation->store(); } } else ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTWRITE) ) ).Execute(); } return bDone; } extern bool localesAreEqual( const ::com::sun::star::lang::Locale& rLocaleLeft, const ::com::sun::star::lang::Locale& rLocaleRight ); std::vector< lang::Locale > implGetLanguagesOnlyContainedInFirstSeq ( Sequence< lang::Locale > aFirstSeq, Sequence< lang::Locale > aSecondSeq ) { std::vector< lang::Locale > avRet; const lang::Locale* pFirst = aFirstSeq.getConstArray(); const lang::Locale* pSecond = aSecondSeq.getConstArray(); sal_Int32 nFirstCount = aFirstSeq.getLength(); sal_Int32 nSecondCount = aSecondSeq.getLength(); for( sal_Int32 iFirst = 0 ; iFirst < nFirstCount ; iFirst++ ) { const lang::Locale& rFirstLocale = pFirst[ iFirst ]; bool bAlsoContainedInSecondSeq = false; for( sal_Int32 iSecond = 0 ; iSecond < nSecondCount ; iSecond++ ) { const lang::Locale& rSecondLocale = pSecond[ iSecond ]; bool bMatch = localesAreEqual( rFirstLocale, rSecondLocale ); if( bMatch ) { bAlsoContainedInSecondSeq = true; break; } } if( !bAlsoContainedInSecondSeq ) avRet.push_back( rFirstLocale ); } return avRet; } class NameClashQueryBox : public MessBox { public: NameClashQueryBox( Window* pParent, const XubString& rTitle, const XubString& rMessage ); }; NameClashQueryBox::NameClashQueryBox( Window* pParent, const XubString& rTitle, const XubString& rMessage ) : MessBox( pParent, 0, rTitle, rMessage ) { if ( rTitle.Len() ) SetText( rTitle ); maMessText = rMessage; AddButton( String( IDEResId( RID_STR_DLGIMP_CLASH_RENAME ) ), RET_YES, BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_OKBUTTON | BUTTONDIALOG_FOCUSBUTTON ); AddButton( String( IDEResId( RID_STR_DLGIMP_CLASH_REPLACE ) ), RET_NO, 0 ); AddButton( BUTTON_CANCEL, RET_CANCEL, BUTTONDIALOG_CANCELBUTTON ); SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() ); } class LanguageMismatchQueryBox : public MessBox { public: LanguageMismatchQueryBox( Window* pParent, const XubString& rTitle, const XubString& rMessage ); }; LanguageMismatchQueryBox::LanguageMismatchQueryBox( Window* pParent, const XubString& rTitle, const XubString& rMessage ) : MessBox( pParent, 0, rTitle, rMessage ) { if ( rTitle.Len() ) SetText( rTitle ); maMessText = rMessage; AddButton( String( IDEResId( RID_STR_DLGIMP_MISMATCH_ADD ) ), RET_YES, BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_OKBUTTON | BUTTONDIALOG_FOCUSBUTTON ); AddButton( String( IDEResId( RID_STR_DLGIMP_MISMATCH_OMIT ) ), RET_NO, 0 ); AddButton( BUTTON_CANCEL, RET_CANCEL, BUTTONDIALOG_CANCELBUTTON ); AddButton( BUTTON_HELP, BUTTONID_HELP, BUTTONDIALOG_HELPBUTTON, 4 ); SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() ); } BOOL implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName ) { BOOL bDone = FALSE; Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() ); Reference < XFilePicker > xFP; if( xMSF.is() ) { Sequence aServiceType(1); aServiceType[0] <<= TemplateDescription::FILEOPEN_SIMPLE; xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY ); } Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY); xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False); Any aValue; aValue <<= (sal_Bool) sal_True; xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue); String aCurPath( rCurPath ); if ( aCurPath.Len() ) xFP->setDisplayDirectory ( aCurPath ); String aDialogStr( IDEResId( RID_STR_STDDIALOGNAME ) ); Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY); xFltMgr->appendFilter( aDialogStr, String( RTL_CONSTASCII_USTRINGPARAM( "*.xdl" ) ) ); xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) ); xFltMgr->setCurrentFilter( aDialogStr ); if( xFP->execute() == RET_OK ) { Sequence< ::rtl::OUString > aPaths = xFP->getFiles(); aCurPath = aPaths[0]; ::rtl::OUString aBasePath; ::rtl::OUString aOUCurPath( aCurPath ); sal_Int32 iSlash = aOUCurPath.lastIndexOf( '/' ); if( iSlash != -1 ) aBasePath = aOUCurPath.copy( 0, iSlash + 1 ); try { // create dialog model Reference< container::XNameContainer > xDialogModel( xMSF->createInstance ( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ), UNO_QUERY_THROW ); Reference< XSimpleFileAccess > xSFI( xMSF->createInstance ( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ) ), UNO_QUERY_THROW ); Reference< XInputStream > xInput; if( xSFI->exists( aCurPath ) ) xInput = xSFI->openFileRead( aCurPath ); Reference< XComponentContext > xContext; Reference< beans::XPropertySet > xProps( xMSF, UNO_QUERY ); OSL_ASSERT( xProps.is() ); OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); ::xmlscript::importDialogModel( xInput, xDialogModel, xContext ); String aXmlDlgName; Reference< beans::XPropertySet > xDialogModelPropSet( xDialogModel, UNO_QUERY ); if( xDialogModelPropSet.is() ) { try { Any aXmlDialogNameAny = xDialogModelPropSet->getPropertyValue( DLGED_PROP_NAME ); ::rtl::OUString aOUXmlDialogName; aXmlDialogNameAny >>= aOUXmlDialogName; aXmlDlgName = aOUXmlDialogName; } catch( beans::UnknownPropertyException& ) {} } bool bValidName = (aXmlDlgName.Len() != 0); OSL_ASSERT( bValidName ); if( !bValidName ) return bDone; bool bDialogAlreadyExists = rDocument.hasDialog( aLibName, aXmlDlgName ); String aNewDlgName = aXmlDlgName; enum NameClashMode { NO_CLASH, CLASH_OVERWRITE_DIALOG, CLASH_RENAME_DIALOG, }; NameClashMode eNameClashMode = NO_CLASH; if( bDialogAlreadyExists ) { String aQueryBoxTitle( IDEResId( RID_STR_DLGIMP_CLASH_TITLE ) ); String aQueryBoxText( IDEResId( RID_STR_DLGIMP_CLASH_TEXT ) ); aQueryBoxText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "$(ARG1)" ) ), aXmlDlgName ); NameClashQueryBox aQueryBox( pWin, aQueryBoxTitle, aQueryBoxText ); USHORT nRet = aQueryBox.Execute(); if( RET_YES == nRet ) { // RET_YES == Rename, see NameClashQueryBox::NameClashQueryBox eNameClashMode = CLASH_RENAME_DIALOG; aNewDlgName = rDocument.createObjectName( E_DIALOGS, aLibName ); } else if( RET_NO == nRet ) { // RET_NO == Replace, see NameClashQueryBox::NameClashQueryBox eNameClashMode = CLASH_OVERWRITE_DIALOG; } else if( RET_CANCEL == nRet ) { return bDone; } } BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); if( pIDEShell == NULL ) { OSL_ASSERT( pIDEShell != NULL ); return bDone; } // Resource? ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); Reference< task::XInteractionHandler > xDummyHandler; bool bReadOnly = true; Reference< XStringResourceWithLocation > xImportStringResource = StringResourceWithLocation::create( xContext, aBasePath, bReadOnly, aLocale, aXmlDlgName, ::rtl::OUString(), xDummyHandler ); Sequence< lang::Locale > aImportLocaleSeq = xImportStringResource->getLocales(); sal_Int32 nImportLocaleCount = aImportLocaleSeq.getLength(); Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, TRUE ) ); Reference< resource::XStringResourceManager > xLibStringResourceManager = LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib ); sal_Int32 nLibLocaleCount = 0; Sequence< lang::Locale > aLibLocaleSeq; if( xLibStringResourceManager.is() ) { aLibLocaleSeq = xLibStringResourceManager->getLocales(); nLibLocaleCount = aLibLocaleSeq.getLength(); } // Check language matches std::vector< lang::Locale > aOnlyInImportLanguages = implGetLanguagesOnlyContainedInFirstSeq( aImportLocaleSeq, aLibLocaleSeq ); int nOnlyInImportLanguageCount = aOnlyInImportLanguages.size(); // For now: Keep languages from lib bool bLibLocalized = (nLibLocaleCount > 0); bool bImportLocalized = (nImportLocaleCount > 0); bool bAddDialogLanguagesToLib = false; if( nOnlyInImportLanguageCount > 0 ) { String aQueryBoxTitle( IDEResId( RID_STR_DLGIMP_MISMATCH_TITLE ) ); String aQueryBoxText( IDEResId( RID_STR_DLGIMP_MISMATCH_TEXT ) ); LanguageMismatchQueryBox aQueryBox( pWin, aQueryBoxTitle, aQueryBoxText ); USHORT nRet = aQueryBox.Execute(); if( RET_YES == nRet ) { // RET_YES == Add, see LanguageMismatchQueryBox::LanguageMismatchQueryBox bAddDialogLanguagesToLib = true; } // RET_NO == Omit, see LanguageMismatchQueryBox::LanguageMismatchQueryBox // -> nothing to do here //else if( RET_NO == nRet ) //{ //} else if( RET_CANCEL == nRet ) { return bDone; } } if( bImportLocalized ) { bool bCopyResourcesForDialog = true; if( bAddDialogLanguagesToLib ) { LocalizationMgr* pCurMgr = pIDEShell->GetCurLocalizationMgr(); lang::Locale aFirstLocale; aFirstLocale = aOnlyInImportLanguages[0]; if( nOnlyInImportLanguageCount > 1 ) { // Check if import default belongs to only import languages and use it then lang::Locale aImportDefaultLocale = xImportStringResource->getDefaultLocale(); lang::Locale aTmpLocale; for( int i = 0 ; i < nOnlyInImportLanguageCount ; ++i ) { aTmpLocale = aOnlyInImportLanguages[i]; if( localesAreEqual( aImportDefaultLocale, aTmpLocale ) ) { aFirstLocale = aImportDefaultLocale; break; } } } Sequence< lang::Locale > aFirstLocaleSeq( 1 ); aFirstLocaleSeq[0] = aFirstLocale; pCurMgr->handleAddLocales( aFirstLocaleSeq ); if( nOnlyInImportLanguageCount > 1 ) { Sequence< lang::Locale > aRemainingLocaleSeq( nOnlyInImportLanguageCount - 1 ); lang::Locale aTmpLocale; int iSeq = 0; for( int i = 0 ; i < nOnlyInImportLanguageCount ; ++i ) { aTmpLocale = aOnlyInImportLanguages[i]; if( !localesAreEqual( aFirstLocale, aTmpLocale ) ) aRemainingLocaleSeq[iSeq++] = aTmpLocale; } pCurMgr->handleAddLocales( aRemainingLocaleSeq ); } } else if( !bLibLocalized ) { Reference< resource::XStringResourceManager > xImportStringResourceManager( xImportStringResource, UNO_QUERY ); LocalizationMgr::resetResourceForDialog( xDialogModel, xImportStringResourceManager ); bCopyResourcesForDialog = false; } if( bCopyResourcesForDialog ) { Reference< resource::XStringResourceResolver > xImportStringResourceResolver( xImportStringResource, UNO_QUERY ); LocalizationMgr::copyResourceForDroppedDialog( xDialogModel, aXmlDlgName, xLibStringResourceManager, xImportStringResourceResolver ); } } else if( bLibLocalized ) { LocalizationMgr::setResourceIDsForDialog( xDialogModel, xLibStringResourceManager ); } LocalizationMgr::setStringResourceAtDialog( rDocument, aLibName, aNewDlgName, xDialogModel ); if( eNameClashMode == CLASH_OVERWRITE_DIALOG ) { if ( BasicIDE::RemoveDialog( rDocument, aLibName, aNewDlgName ) ) { IDEBaseWindow* pDlgWin = pIDEShell->FindDlgWin( rDocument, aLibName, aNewDlgName, FALSE, TRUE ); if( pDlgWin != NULL ) pIDEShell->RemoveWindow( pDlgWin, TRUE ); BasicIDE::MarkDocumentModified( rDocument ); } else { // TODO: Assertion? return bDone; } } if( eNameClashMode == CLASH_RENAME_DIALOG ) { bool bRenamed = false; if( xDialogModelPropSet.is() ) { try { Any aXmlDialogNameAny; aXmlDialogNameAny <<= ::rtl::OUString( aNewDlgName ); xDialogModelPropSet->setPropertyValue( DLGED_PROP_NAME, aXmlDialogNameAny ); bRenamed = true; } catch( beans::UnknownPropertyException& ) {} } if( bRenamed ) { LocalizationMgr::renameStringResourceIDs( rDocument, aLibName, aNewDlgName, xDialogModel ); } else { // TODO: Assertion? return bDone; } } Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); bool bSuccess = rDocument.insertDialog( aLibName, aNewDlgName, xISP ); if( bSuccess ) { DialogWindow* pNewDlgWin = pIDEShell->CreateDlgWin( rDocument, aLibName, aNewDlgName ); pIDEShell->SetCurWindow( pNewDlgWin, TRUE ); } bDone = TRUE; } catch( Exception& ) {} } return bDone; } BOOL DialogWindow::ImportDialog() { DBG_CHKTHIS( DialogWindow, 0 ); const ScriptDocument& rDocument = GetDocument(); String aLibName = GetLibName(); BOOL bRet = implImportDialog( this, aCurPath, rDocument, aLibName ); return bRet; } DlgEdModel* DialogWindow::GetModel() const { return pEditor ? pEditor->GetModel() : NULL; } DlgEdPage* DialogWindow::GetPage() const { return pEditor ? pEditor->GetPage() : NULL; } DlgEdView* DialogWindow::GetView() const { return pEditor ? pEditor->GetView() : NULL; } BOOL __EXPORT DialogWindow::IsModified() { return pEditor->IsModified(); } SfxUndoManager* __EXPORT DialogWindow::GetUndoManager() { return pUndoMgr; } String DialogWindow::GetTitle() { return GetName(); } BasicEntryDescriptor DialogWindow::CreateEntryDescriptor() { ScriptDocument aDocument( GetDocument() ); String aLibName( GetLibName() ); LibraryLocation eLocation = aDocument.getLibraryLocation( aLibName ); return BasicEntryDescriptor( aDocument, eLocation, aLibName, GetName(), OBJ_TYPE_DIALOG ); } void DialogWindow::SetReadOnly( BOOL b ) { if ( pEditor ) { if ( b ) pEditor->SetMode( DLGED_READONLY ); else pEditor->SetMode( DLGED_SELECT ); } } BOOL DialogWindow::IsReadOnly() { BOOL bReadOnly = FALSE; if ( pEditor && pEditor->GetMode() == DLGED_READONLY ) bReadOnly = TRUE; return bReadOnly; } BOOL DialogWindow::IsPasteAllowed() { return pEditor ? pEditor->IsPasteAllowed() : FALSE; } void DialogWindow::StoreData() { if ( IsModified() ) { try { Reference< container::XNameContainer > xLib = GetDocument().getLibrary( E_DIALOGS, GetLibName(), true ); if( xLib.is() ) { Reference< container::XNameContainer > xDialogModel = pEditor->GetDialog(); if( xDialogModel.is() ) { Reference< XComponentContext > xContext; Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY ); OSL_ASSERT( xProps.is() ); OSL_VERIFY( xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); xLib->replaceByName( ::rtl::OUString( GetName() ), makeAny( xISP ) ); } } } catch ( uno::Exception& ) { DBG_UNHANDLED_EXCEPTION(); } BasicIDE::MarkDocumentModified( GetDocument() ); pEditor->ClearModifyFlag(); } } void DialogWindow::Deactivating() { if ( IsModified() ) BasicIDE::MarkDocumentModified( GetDocument() ); } void DialogWindow::PrintData( Printer* pPrinter ) { pEditor->PrintData( pPrinter, CreateQualifiedName() ); } void DialogWindow::DataChanged( const DataChangedEvent& rDCEvt ) { if( (rDCEvt.GetType()==DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) ) { InitSettings( TRUE, TRUE, TRUE ); Invalidate(); } else IDEBaseWindow::DataChanged( rDCEvt ); } void DialogWindow::InitSettings(BOOL bFont,BOOL bForeground,BOOL bBackground) { const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); if( bFont ) { Font aFont; aFont = rStyleSettings.GetFieldFont(); SetPointFont( aFont ); } if( bForeground || bFont ) { SetTextColor( rStyleSettings.GetFieldTextColor() ); SetTextFillColor(); } if( bBackground ) SetBackground( rStyleSettings.GetFieldColor() ); } ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > DialogWindow::CreateAccessible() { return (::com::sun::star::accessibility::XAccessible*) new AccessibleDialogWindow( this ); }