| /************************************************************** |
| * |
| * 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_svx.hxx" |
| |
| #include "svx/txencbox.hxx" |
| #include "svx/txenctab.hxx" |
| #include <svx/dialogs.hrc> |
| #include "svx/dbcharsethelper.hxx" |
| #include <vcl/svapp.hxx> |
| #include <rtl/tencinfo.h> |
| #include <rtl/locale.h> |
| #include <osl/nlsupport.h> |
| |
| //======================================================================== |
| // class SvxTextEncodingBox |
| //======================================================================== |
| |
| SvxTextEncodingBox::SvxTextEncodingBox( Window* pParent, const ResId& rResId ) |
| : |
| ListBox( pParent, rResId ) |
| { |
| m_pEncTable = new SvxTextEncodingTable; |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| SvxTextEncodingBox::~SvxTextEncodingBox() |
| { |
| delete m_pEncTable; |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| sal_uInt16 SvxTextEncodingBox::EncodingToPos_Impl( rtl_TextEncoding nEnc ) const |
| { |
| sal_uInt16 nCount = GetEntryCount(); |
| for ( sal_uInt16 i=0; i<nCount; i++ ) |
| { |
| if ( nEnc == rtl_TextEncoding( (sal_uIntPtr)GetEntryData(i) ) ) |
| return i; |
| } |
| return LISTBOX_ENTRY_NOTFOUND; |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::FillFromTextEncodingTable( |
| sal_Bool bExcludeImportSubsets, sal_uInt32 nExcludeInfoFlags, |
| sal_uInt32 nButIncludeInfoFlags ) |
| { |
| rtl_TextEncodingInfo aInfo; |
| aInfo.StructSize = sizeof(rtl_TextEncodingInfo); |
| sal_uInt32 nCount = m_pEncTable->Count(); |
| for ( sal_uInt32 j=0; j<nCount; j++ ) |
| { |
| sal_Bool bInsert = sal_True; |
| rtl_TextEncoding nEnc = rtl_TextEncoding( m_pEncTable->GetValue( j ) ); |
| if ( nExcludeInfoFlags ) |
| { |
| if ( !rtl_getTextEncodingInfo( nEnc, &aInfo ) ) |
| bInsert = sal_False; |
| else |
| { |
| if ( (aInfo.Flags & nExcludeInfoFlags) == 0 ) |
| { |
| if ( (nExcludeInfoFlags & RTL_TEXTENCODING_INFO_UNICODE) && |
| ((nEnc == RTL_TEXTENCODING_UCS2) || |
| nEnc == RTL_TEXTENCODING_UCS4) ) |
| bInsert = sal_False; // InfoFlags don't work for Unicode :-( |
| } |
| else if ( (aInfo.Flags & nButIncludeInfoFlags) == 0 ) |
| bInsert = sal_False; |
| } |
| } |
| if ( bInsert ) |
| { |
| if ( bExcludeImportSubsets ) |
| { |
| switch ( nEnc ) |
| { |
| // subsets of RTL_TEXTENCODING_GB_18030 |
| case RTL_TEXTENCODING_GB_2312 : |
| case RTL_TEXTENCODING_GBK : |
| case RTL_TEXTENCODING_MS_936 : |
| bInsert = sal_False; |
| break; |
| } |
| } |
| if ( bInsert ) |
| InsertTextEncoding( nEnc, m_pEncTable->GetString( j ) ); |
| } |
| } |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::FillFromDbTextEncodingMap( |
| sal_Bool bExcludeImportSubsets, sal_uInt32 nExcludeInfoFlags, |
| sal_uInt32 nButIncludeInfoFlags ) |
| { |
| rtl_TextEncodingInfo aInfo; |
| aInfo.StructSize = sizeof(rtl_TextEncodingInfo); |
| svxform::ODataAccessCharsetHelper aCSH; |
| ::std::vector< rtl_TextEncoding > aEncs; |
| sal_Int32 nCount = aCSH.getSupportedTextEncodings( aEncs ); |
| for ( sal_uInt16 j=0; j<nCount; j++ ) |
| { |
| sal_Bool bInsert = sal_True; |
| rtl_TextEncoding nEnc = rtl_TextEncoding( aEncs[j] ); |
| if ( nExcludeInfoFlags ) |
| { |
| if ( !rtl_getTextEncodingInfo( nEnc, &aInfo ) ) |
| bInsert = sal_False; |
| else |
| { |
| if ( (aInfo.Flags & nExcludeInfoFlags) == 0 ) |
| { |
| if ( (nExcludeInfoFlags & RTL_TEXTENCODING_INFO_UNICODE) && |
| ((nEnc == RTL_TEXTENCODING_UCS2) || |
| nEnc == RTL_TEXTENCODING_UCS4) ) |
| bInsert = sal_False; // InfoFlags don't work for Unicode :-( |
| } |
| else if ( (aInfo.Flags & nButIncludeInfoFlags) == 0 ) |
| bInsert = sal_False; |
| } |
| } |
| if ( bInsert ) |
| { |
| if ( bExcludeImportSubsets ) |
| { |
| switch ( nEnc ) |
| { |
| // subsets of RTL_TEXTENCODING_GB_18030 |
| case RTL_TEXTENCODING_GB_2312 : |
| case RTL_TEXTENCODING_GBK : |
| case RTL_TEXTENCODING_MS_936 : |
| bInsert = sal_False; |
| break; |
| } |
| } |
| // CharsetMap offers a RTL_TEXTENCODING_DONTKNOW for internal use, |
| // makes no sense here and would result in an empty string as list |
| // entry. |
| if ( bInsert && nEnc != RTL_TEXTENCODING_DONTKNOW ) |
| InsertTextEncoding( nEnc ); |
| } |
| } |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::FillWithMimeAndSelectBest() |
| { |
| FillFromTextEncodingTable( sal_False, 0xffffffff, RTL_TEXTENCODING_INFO_MIME ); |
| rtl_TextEncoding nEnc = SvtSysLocale::GetBestMimeEncoding(); |
| SelectTextEncoding( nEnc ); |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::InsertTextEncoding( const rtl_TextEncoding nEnc, |
| const String& rEntry, sal_uInt16 nPos ) |
| { |
| sal_uInt16 nAt = InsertEntry( rEntry, nPos ); |
| SetEntryData( nAt, (void*)(sal_uIntPtr)nEnc ); |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::InsertTextEncoding( const rtl_TextEncoding nEnc, sal_uInt16 nPos ) |
| { |
| const String& rEntry = m_pEncTable->GetTextString( nEnc ); |
| if ( rEntry.Len() ) |
| InsertTextEncoding( nEnc, rEntry, nPos ); |
| else |
| { |
| #ifdef DBG_UTIL |
| ByteString aMsg( "SvxTextEncodingBox::InsertTextEncoding: no resource string for text encoding: " ); |
| aMsg += ByteString::CreateFromInt32( nEnc ); |
| DBG_ERRORFILE( aMsg.GetBuffer() ); |
| #endif |
| } |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::RemoveTextEncoding( const rtl_TextEncoding nEnc ) |
| { |
| sal_uInt16 nAt = EncodingToPos_Impl( nEnc ); |
| |
| if ( nAt != LISTBOX_ENTRY_NOTFOUND ) |
| RemoveEntry( nAt ); |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| rtl_TextEncoding SvxTextEncodingBox::GetSelectTextEncoding() const |
| { |
| sal_uInt16 nPos = GetSelectEntryPos(); |
| |
| if ( nPos != LISTBOX_ENTRY_NOTFOUND ) |
| return rtl_TextEncoding( (sal_uIntPtr)GetEntryData(nPos) ); |
| else |
| return RTL_TEXTENCODING_DONTKNOW; |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void SvxTextEncodingBox::SelectTextEncoding( const rtl_TextEncoding nEnc, sal_Bool bSelect ) |
| { |
| sal_uInt16 nAt = EncodingToPos_Impl( nEnc ); |
| |
| if ( nAt != LISTBOX_ENTRY_NOTFOUND ) |
| SelectEntryPos( nAt, bSelect ); |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| sal_Bool SvxTextEncodingBox::IsTextEncodingSelected( const rtl_TextEncoding nEnc ) const |
| { |
| sal_uInt16 nAt = EncodingToPos_Impl( nEnc ); |
| |
| if ( nAt != LISTBOX_ENTRY_NOTFOUND ) |
| return IsEntryPosSelected( nAt ); |
| else |
| return sal_False; |
| } |
| |