| /************************************************************** | 
 |  *  | 
 |  * Licensed to the Apache Software Foundation (ASF) under one | 
 |  * or more contributor license agreements.  See the NOTICE file | 
 |  * distributed with this work for additional information | 
 |  * regarding copyright ownership.  The ASF licenses this file | 
 |  * to you under the Apache License, Version 2.0 (the | 
 |  * "License"); you may not use this file except in compliance | 
 |  * with the License.  You may obtain a copy of the License at | 
 |  *  | 
 |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
 |  *  | 
 |  * Unless required by applicable law or agreed to in writing, | 
 |  * software distributed under the License is distributed on an | 
 |  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 |  * KIND, either express or implied.  See the License for the | 
 |  * specific language governing permissions and limitations | 
 |  * under the License. | 
 |  *  | 
 |  *************************************************************/ | 
 |  | 
 |  | 
 |  | 
 | // MARKER(update_precomp.py): autogen include statement, do not remove | 
 | #include "precompiled_basctl.hxx" | 
 |  | 
 | #include <ide_pch.hxx> | 
 |  | 
 |  | 
 | #include <basidesh.hrc> | 
 | #include <basidesh.hxx> | 
 | #include <basobj.hxx> | 
 |  | 
 | #include <basicbox.hxx> | 
 | #include <iderid.hxx> | 
 | #include <iderdll.hxx> | 
 | #include <bastypes.hxx> | 
 | #include "bastype2.hxx" | 
 | #include "basdoc.hxx" | 
 |  | 
 | #include "localizationmgr.hxx" | 
 | #include "managelang.hxx" | 
 | #include "dlgresid.hrc" | 
 | #include <editeng/unolingu.hxx> | 
 |  | 
 | #include <svtools/langtab.hxx> | 
 |  | 
 |  | 
 | using namespace ::com::sun::star; | 
 | using namespace ::com::sun::star::lang; | 
 | using namespace ::com::sun::star::uno; | 
 |  | 
 | SFX_IMPL_TOOLBOX_CONTROL( LibBoxControl, SfxStringItem ); | 
 |  | 
 | LibBoxControl::LibBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) | 
 | 	: SfxToolBoxControl( nSlotId, nId, rTbx ) | 
 | { | 
 | } | 
 |  | 
 |  | 
 |  | 
 | LibBoxControl::~LibBoxControl() | 
 | { | 
 | } | 
 |  | 
 |  | 
 |  | 
 | void LibBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState ) | 
 | { | 
 | 	BasicLibBox* pBox = (BasicLibBox*) GetToolBox().GetItemWindow( GetId() ); | 
 |  | 
 | 	DBG_ASSERT( pBox, "Box not found" ); | 
 | 	if ( !pBox ) | 
 | 		return; | 
 |  | 
 | 	if ( eState != SFX_ITEM_AVAILABLE ) | 
 | 		pBox->Disable(); | 
 | 	else | 
 | 	{ | 
 | 		pBox->Enable(); | 
 |  | 
 | 		if ( pState->ISA(SfxStringItem) ) | 
 | 			pBox->Update( (const SfxStringItem*)pState ); | 
 | 		else | 
 | 			pBox->Update( NULL ); | 
 | 	} | 
 | } | 
 |  | 
 |  | 
 |  | 
 | Window* LibBoxControl::CreateItemWindow( Window *pParent ) | 
 | { | 
 | 	return new BasicLibBox( pParent, m_xFrame ); | 
 | } | 
 |  | 
 | //============================================================================= | 
 | //= DocListenerBox | 
 | //============================================================================= | 
 |  | 
 | DocListenerBox::DocListenerBox( Window* pParent ) | 
 |     :ListBox( pParent, WinBits( WB_BORDER | WB_DROPDOWN ) ) | 
 |     ,m_aNotifier( *this ) | 
 | { | 
 | } | 
 |  | 
 | DocListenerBox::~DocListenerBox() | 
 | { | 
 |     m_aNotifier.dispose(); | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentCreated( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     FillBox(); | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentOpened( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     FillBox(); | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentSave( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     // not interested in | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentSaveDone( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     // not interested in | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentSaveAs( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     // not interested in | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentSaveAsDone( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     FillBox(); | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentClosed( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     FillBox(); | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     // not interested in | 
 | } | 
 |  | 
 | void DocListenerBox::onDocumentModeChanged( const ScriptDocument& /*_rDocument*/ ) | 
 | { | 
 |     // not interested in | 
 | } | 
 |  | 
 | //============================================================================= | 
 | //= BasicLibBox | 
 | //============================================================================= | 
 | BasicLibBox::BasicLibBox( Window* pParent, const uno::Reference< frame::XFrame >& rFrame ) : | 
 |     DocListenerBox( pParent ), | 
 |     m_xFrame( rFrame ) | 
 | { | 
 | 	FillBox(); | 
 | 	bIgnoreSelect = sal_True;	// Select von 0 noch nicht weiterleiten | 
 | 	bFillBox = sal_True; | 
 | 	SelectEntryPos( 0 ); | 
 | 	aCurText = GetEntry( 0 ); | 
 | 	SetSizePixel( Size( 250, 200 ) ); | 
 |     bIgnoreSelect = sal_False; | 
 | } | 
 |  | 
 |  | 
 |  | 
 | __EXPORT BasicLibBox::~BasicLibBox() | 
 | { | 
 |     ClearBox(); | 
 | } | 
 |  | 
 | void __EXPORT BasicLibBox::Update( const SfxStringItem* pItem ) | 
 | { | 
 | 	// Immer auf dem laufenden sein... | 
 | //	if ( !pItem  || !pItem->GetValue().Len() ) | 
 | 		FillBox(); | 
 |  | 
 | 	if ( pItem ) | 
 | 	{ | 
 | 		aCurText = pItem->GetValue(); | 
 | 		if ( aCurText.Len() == 0 ) | 
 | 			aCurText = String( IDEResId( RID_STR_ALL ) ); | 
 | 	} | 
 |  | 
 | 	if ( GetSelectEntry() != aCurText ) | 
 | 		SelectEntry( aCurText ); | 
 | } | 
 |  | 
 | void __EXPORT BasicLibBox::ReleaseFocus() | 
 | { | 
 | 	SfxViewShell* pCurSh = SfxViewShell::Current(); | 
 | 	DBG_ASSERT( pCurSh, "Current ViewShell not found!" ); | 
 |  | 
 | 	if ( pCurSh ) | 
 | 	{ | 
 | 		Window* pShellWin = pCurSh->GetWindow(); | 
 | 		if ( !pShellWin )		// sonst werde ich ihn nicht los | 
 | 			pShellWin = Application::GetDefDialogParent(); | 
 |  | 
 | 		pShellWin->GrabFocus(); | 
 | 	} | 
 | } | 
 |  | 
 | void BasicLibBox::FillBox() | 
 | { | 
 | 	SetUpdateMode( sal_False ); | 
 | 	bIgnoreSelect = sal_True; | 
 |  | 
 | 	aCurText = GetSelectEntry(); | 
 |  | 
 | 	SelectEntryPos( 0 ); | 
 | 	ClearBox(); | 
 |  | 
 |     // create list box entries | 
 |     sal_uInt16 nPos = InsertEntry( String( IDEResId( RID_STR_ALL ) ), LISTBOX_APPEND ); | 
 |     SetEntryData( nPos, new BasicLibEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_UNKNOWN, String() ) ); | 
 |     InsertEntries( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_USER ); | 
 |     InsertEntries( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_SHARE ); | 
 |  | 
 |     ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::DocumentsSorted ) ); | 
 |     for (   ScriptDocuments::const_iterator doc = aDocuments.begin(); | 
 |             doc != aDocuments.end(); | 
 |             ++doc | 
 |         ) | 
 |     { | 
 |         InsertEntries( *doc, LIBRARY_LOCATION_DOCUMENT ); | 
 |     } | 
 |  | 
 | 	SetUpdateMode( sal_True ); | 
 |  | 
 | 	SelectEntry( aCurText ); | 
 | 	if ( !GetSelectEntryCount() ) | 
 | 	{ | 
 | 		SelectEntryPos( GetEntryCount() );	// gibst es nicht => leer? | 
 | 		aCurText = GetSelectEntry(); | 
 | 	} | 
 | 	bIgnoreSelect = sal_False; | 
 | } | 
 |  | 
 | void BasicLibBox::InsertEntries( const ScriptDocument& rDocument, LibraryLocation eLocation ) | 
 | { | 
 |     // get a sorted list of library names | 
 |     Sequence< ::rtl::OUString > aLibNames = rDocument.getLibraryNames(); | 
 |     sal_Int32 nLibCount = aLibNames.getLength(); | 
 |     const ::rtl::OUString* pLibNames = aLibNames.getConstArray(); | 
 |  | 
 |     for ( sal_Int32 i = 0 ; i < nLibCount ; ++i ) | 
 |     { | 
 |         String aLibName = pLibNames[ i ]; | 
 |         if ( eLocation == rDocument.getLibraryLocation( aLibName ) ) | 
 |         { | 
 |             String aName( rDocument.getTitle( eLocation ) ); | 
 |             String aEntryText( CreateMgrAndLibStr( aName, aLibName ) ); | 
 |             sal_uInt16 nPos = InsertEntry( aEntryText, LISTBOX_APPEND ); | 
 |             SetEntryData( nPos, new BasicLibEntry( rDocument, eLocation, aLibName ) ); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | long BasicLibBox::PreNotify( NotifyEvent& rNEvt ) | 
 | { | 
 | 	long nDone = 0; | 
 | 	if( rNEvt.GetType() == EVENT_KEYINPUT ) | 
 | 	{ | 
 | 		KeyEvent aKeyEvt = *rNEvt.GetKeyEvent(); | 
 | 		sal_uInt16 nKeyCode = aKeyEvt.GetKeyCode().GetCode(); | 
 | 		switch( nKeyCode ) | 
 | 		{ | 
 | 			case KEY_RETURN: | 
 | 			{ | 
 | 				NotifyIDE(); | 
 | 				nDone = 1; | 
 | 			} | 
 | 			break; | 
 |  | 
 | 			case KEY_ESCAPE: | 
 | 			{ | 
 | 				SelectEntry( aCurText ); | 
 | 				ReleaseFocus(); | 
 | 				nDone = 1; | 
 | 			} | 
 | 			break; | 
 | 		} | 
 | 	} | 
 | 	else if( rNEvt.GetType() == EVENT_GETFOCUS ) | 
 | 	{ | 
 | 		if ( bFillBox ) | 
 | 		{ | 
 | 			FillBox(); | 
 | 			bFillBox = sal_False; | 
 | 		} | 
 | 	} | 
 | 	else if( rNEvt.GetType() == EVENT_LOSEFOCUS ) | 
 | 	{ | 
 | 		if ( !HasChildPathFocus( sal_True ) ) | 
 | 		{ | 
 | 			bIgnoreSelect = sal_True; | 
 | 			bFillBox = sal_True; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	return nDone ? nDone : ListBox::PreNotify( rNEvt ); | 
 | } | 
 |  | 
 | void __EXPORT BasicLibBox::Select() | 
 | { | 
 | 	if ( !IsTravelSelect() ) | 
 | 	{ | 
 | 		if ( !bIgnoreSelect ) | 
 | 			NotifyIDE(); | 
 | 		else | 
 | 			SelectEntry( aCurText );	// Seit 306... (Select nach Escape) | 
 | 	} | 
 | } | 
 |  | 
 | void BasicLibBox::NotifyIDE() | 
 | { | 
 |     sal_uInt16 nSelPos = GetSelectEntryPos(); | 
 |     BasicLibEntry* pEntry = (BasicLibEntry*)GetEntryData( nSelPos ); | 
 |     if ( pEntry ) | 
 |     { | 
 |         ScriptDocument aDocument( pEntry->GetDocument() ); | 
 |         SfxUsrAnyItem aDocumentItem( SID_BASICIDE_ARG_DOCUMENT_MODEL, uno::makeAny( aDocument.getDocumentOrNull() ) ); | 
 |         String aLibName = pEntry->GetLibName(); | 
 |         SfxStringItem aLibNameItem( SID_BASICIDE_ARG_LIBNAME, aLibName ); | 
 |         BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); | 
 |         SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL; | 
 |         SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL; | 
 |         if ( pDispatcher ) | 
 |         { | 
 |             pDispatcher->Execute( SID_BASICIDE_LIBSELECTED, | 
 |                                   SFX_CALLMODE_SYNCHRON, &aDocumentItem, &aLibNameItem, 0L ); | 
 |         } | 
 |     } | 
 |     ReleaseFocus(); | 
 | } | 
 |  | 
 | void BasicLibBox::ClearBox() | 
 | { | 
 |     sal_uInt16 nCount = GetEntryCount(); | 
 |     for ( sal_uInt16 i = 0; i < nCount; ++i ) | 
 |     { | 
 |         BasicLibEntry* pEntry = (BasicLibEntry*)GetEntryData( i ); | 
 |         delete pEntry; | 
 |     } | 
 |     ListBox::Clear(); | 
 | } | 
 |  | 
 | // class LanguageBoxControl ---------------------------------------------- | 
 |  | 
 | SFX_IMPL_TOOLBOX_CONTROL( LanguageBoxControl, SfxStringItem ); | 
 |  | 
 | LanguageBoxControl::LanguageBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) | 
 | 	: SfxToolBoxControl( nSlotId, nId, rTbx ) | 
 | { | 
 | } | 
 |  | 
 | LanguageBoxControl::~LanguageBoxControl() | 
 | { | 
 | } | 
 |  | 
 | void LanguageBoxControl::StateChanged( sal_uInt16 _nID, SfxItemState _eState, const SfxPoolItem* _pItem ) | 
 | { | 
 | 	(void)_nID; | 
 |  | 
 | 	BasicLanguageBox* pBox = (BasicLanguageBox*)( GetToolBox().GetItemWindow( GetId() ) ); | 
 |  | 
 | 	if ( pBox ) | 
 | 	{ | 
 | 		if ( _eState != SFX_ITEM_AVAILABLE ) | 
 | 			pBox->Disable(); | 
 | 		else | 
 | 		{ | 
 | 			pBox->Enable(); | 
 | 			if ( _pItem->ISA(SfxStringItem) ) | 
 | 				pBox->Update( (const SfxStringItem*)_pItem ); | 
 | 			else | 
 | 				pBox->Update( NULL ); | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | Window* LanguageBoxControl::CreateItemWindow( Window *pParent ) | 
 | { | 
 | 	return new BasicLanguageBox( pParent ); | 
 | } | 
 |  | 
 | // class BasicLanguageBox ------------------------------------------------ | 
 |  | 
 | BasicLanguageBox::BasicLanguageBox( Window* pParent ) : | 
 |  | 
 | 	DocListenerBox( pParent ), | 
 |  | 
 | 	m_sNotLocalizedStr( IDEResId( RID_STR_TRANSLATION_NOTLOCALIZED ) ), | 
 | 	m_sDefaultLanguageStr( IDEResId( RID_STR_TRANSLATION_DEFAULT ) ), | 
 |  | 
 | 	m_bIgnoreSelect( false ) | 
 |  | 
 | { | 
 | 	SetSizePixel( Size( 210, 200 ) ); | 
 |  | 
 | 	FillBox(); | 
 | } | 
 |  | 
 | BasicLanguageBox::~BasicLanguageBox() | 
 | { | 
 | 	ClearBox(); | 
 | } | 
 |  | 
 | void BasicLanguageBox::FillBox() | 
 | { | 
 | 	SetUpdateMode( sal_False ); | 
 | 	m_bIgnoreSelect = true; | 
 | 	m_sCurrentText = GetSelectEntry(); | 
 | 	ClearBox(); | 
 |  | 
 | 	LocalizationMgr* pCurMgr = IDE_DLL()->GetShell()->GetCurLocalizationMgr(); | 
 | 	if ( pCurMgr->isLibraryLocalized() ) | 
 | 	{ | 
 | 		Enable(); | 
 | 		SvtLanguageTable aLangTable; | 
 | 		Locale aDefaultLocale = pCurMgr->getStringResourceManager()->getDefaultLocale(); | 
 | 		Locale aCurrentLocale = pCurMgr->getStringResourceManager()->getCurrentLocale(); | 
 | 		Sequence< Locale > aLocaleSeq = pCurMgr->getStringResourceManager()->getLocales(); | 
 | 		const Locale* pLocale = aLocaleSeq.getConstArray(); | 
 | 		sal_Int32 i, nCount = aLocaleSeq.getLength(); | 
 | 		sal_uInt16 nSelPos = LISTBOX_ENTRY_NOTFOUND; | 
 | 		for ( i = 0;  i < nCount;  ++i ) | 
 | 		{ | 
 | 			bool bIsDefault = localesAreEqual( aDefaultLocale, pLocale[i] ); | 
 | 			bool bIsCurrent = localesAreEqual( aCurrentLocale, pLocale[i] ); | 
 | 			LanguageType eLangType = SvxLocaleToLanguage( pLocale[i] ); | 
 | 			String sLanguage = aLangTable.GetString( eLangType ); | 
 | 			if ( bIsDefault ) | 
 | 			{ | 
 | 				sLanguage += ' '; | 
 | 				sLanguage += m_sDefaultLanguageStr; | 
 | 			} | 
 | 			sal_uInt16 nPos = InsertEntry( sLanguage ); | 
 | 			SetEntryData( nPos, new LanguageEntry( sLanguage, pLocale[i], bIsDefault ) ); | 
 |  | 
 | 			if ( bIsCurrent ) | 
 | 				nSelPos = nPos; | 
 | 		} | 
 |  | 
 | 		if ( nSelPos != LISTBOX_ENTRY_NOTFOUND ) | 
 | 		{ | 
 | 			SelectEntryPos( nSelPos ); | 
 | 			m_sCurrentText = GetSelectEntry(); | 
 | 		} | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		InsertEntry( m_sNotLocalizedStr ); | 
 | 		SelectEntryPos(0); | 
 | 		Disable(); | 
 | 	} | 
 |  | 
 | 	SetUpdateMode( sal_True ); | 
 | 	m_bIgnoreSelect = false; | 
 | } | 
 |  | 
 | void BasicLanguageBox::ClearBox() | 
 | { | 
 |     sal_uInt16 nCount = GetEntryCount(); | 
 |     for ( sal_uInt16 i = 0; i < nCount; ++i ) | 
 |     { | 
 |         LanguageEntry* pEntry = (LanguageEntry*)GetEntryData(i); | 
 |         delete pEntry; | 
 |     } | 
 |     ListBox::Clear(); | 
 | } | 
 |  | 
 | void BasicLanguageBox::SetLanguage() | 
 | { | 
 |     LanguageEntry* pEntry = (LanguageEntry*)GetEntryData( GetSelectEntryPos() ); | 
 | 	if ( pEntry ) | 
 | 		IDE_DLL()->GetShell()->GetCurLocalizationMgr()->handleSetCurrentLocale( pEntry->m_aLocale ); | 
 | } | 
 |  | 
 | void BasicLanguageBox::Select() | 
 | { | 
 | 	if ( !m_bIgnoreSelect ) | 
 | 		SetLanguage(); | 
 | 	else | 
 | 		SelectEntry( m_sCurrentText );	// Select after Escape | 
 | } | 
 |  | 
 | long BasicLanguageBox::PreNotify( NotifyEvent& rNEvt ) | 
 | { | 
 | 	long nDone = 0; | 
 | 	if( rNEvt.GetType() == EVENT_KEYINPUT ) | 
 | 	{ | 
 | 		sal_uInt16 nKeyCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); | 
 | 		switch( nKeyCode ) | 
 | 		{ | 
 | 			case KEY_RETURN: | 
 | 			{ | 
 | 				SetLanguage(); | 
 | 				nDone = 1; | 
 | 			} | 
 | 			break; | 
 |  | 
 | 			case KEY_ESCAPE: | 
 | 			{ | 
 | 				SelectEntry( m_sCurrentText ); | 
 | 				nDone = 1; | 
 | 			} | 
 | 			break; | 
 | 		} | 
 | 	} | 
 | 	else if( rNEvt.GetType() == EVENT_GETFOCUS ) | 
 | 	{ | 
 | 	} | 
 | 	else if( rNEvt.GetType() == EVENT_LOSEFOCUS ) | 
 | 	{ | 
 | 	} | 
 |  | 
 | 	return nDone ? nDone : ListBox::PreNotify( rNEvt ); | 
 | } | 
 |  | 
 | void BasicLanguageBox::Update( const SfxStringItem* pItem ) | 
 | { | 
 | 	FillBox(); | 
 |  | 
 | 	if ( pItem && pItem->GetValue().Len() > 0 ) | 
 | 	{ | 
 | 		m_sCurrentText = pItem->GetValue(); | 
 | 		if ( GetSelectEntry() != m_sCurrentText ) | 
 | 			SelectEntry( m_sCurrentText ); | 
 | 	} | 
 | } | 
 |  |