Coverage Report

Created: 2026-09-28 10:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/include/editeng/hangulhanja.hxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
#ifndef INCLUDED_EDITENG_HANGULHANJA_HXX
20
#define INCLUDED_EDITENG_HANGULHANJA_HXX
21
22
#include <memory>
23
#include <editeng/editengdllapi.h>
24
#include <i18nlangtag/mslangid.hxx>
25
26
#include <com/sun/star/uno/Reference.hxx>
27
28
namespace com::sun::star::lang { struct Locale; }
29
namespace com::sun::star::uno { class XComponentContext; }
30
namespace com::sun::star::uno { template <class E> class Sequence; }
31
namespace vcl { class Font; }
32
namespace weld { class Widget; }
33
34
35
namespace editeng
36
{
37
38
39
    class HangulHanjaConversion_Impl;
40
41
42
    //= HangulHanjaConversion
43
44
    /** encapsulates Hangul-Hanja conversion functionality
45
46
        <p>terminology:
47
            <ul><li>A <b>text <em>portion</em></b> is some (potentially large) piece of text
48
                which is to be analyzed for convertible sub-strings.</li>
49
                <li>A <b>text <em>unit</em></b> is a sub string in a text portion, which is
50
                to be converted as a whole.</li>
51
            </ul>
52
            For instance, you could have two independent selections within your document, which are then
53
            two text portions. A text unit would be single Hangul/Hanja words within a portion, or even
54
            single Hangul syllabification when "replace by character" is enabled.
55
        </p>
56
    */
57
    class EDITENG_DLLPUBLIC HangulHanjaConversion
58
    {
59
        friend class HangulHanjaConversion_Impl;
60
61
    public:
62
        enum ReplacementAction
63
        {
64
            eExchange,              // simply exchange one text with another
65
            eReplacementBracketed,  // keep the original, and put the replacement in brackets after it
66
            eOriginalBracketed,     // replace the original text, but put it in brackets after the replacement
67
            eReplacementAbove,      // keep the original, and put the replacement text as ruby text above it
68
            eOriginalAbove,         // replace the original text, but put it as ruby text above it
69
            eReplacementBelow,      // keep the original, and put the replacement text as ruby text below it
70
            eOriginalBelow          // replace the original text, but put it as ruby text below it
71
        };
72
73
        enum ConversionType             // does not specify direction...
74
        {
75
            eConvHangulHanja,           // Korean Hangul/Hanja conversion
76
            eConvSimplifiedTraditional  // Chinese simplified / Chinese traditional conversion
77
        };
78
79
        // Note: conversion direction for eConvSimplifiedTraditional is
80
        // specified by source language.
81
        // This one is for Hangul/Hanja where source and target language
82
        // are the same.
83
        enum ConversionDirection
84
        {
85
            eHangulToHanja,
86
            eHanjaToHangul
87
        };
88
89
        enum ConversionFormat
90
        {
91
            eSimpleConversion,          // used for simplified / traditional Chinese as well
92
            eHangulBracketed,
93
            eHanjaBracketed,
94
            eRubyHanjaAbove,
95
            eRubyHanjaBelow,
96
            eRubyHangulAbove,
97
            eRubyHangulBelow
98
        };
99
100
    private:
101
        ::std::unique_ptr< HangulHanjaConversion_Impl >   m_pImpl;
102
103
        // used to set initial values of m_pImpl object from saved ones
104
        static bool                 m_bUseSavedValues;  // defines if the following two values should be used for initialization
105
        static bool                 m_bTryBothDirectionsSave;
106
        static ConversionDirection  m_ePrimaryConversionDirectionSave;
107
108
        HangulHanjaConversion (const HangulHanjaConversion &) = delete;
109
        HangulHanjaConversion & operator= (const HangulHanjaConversion &) = delete;
110
111
    public:
112
        HangulHanjaConversion(
113
            weld::Widget* pUIParent,
114
            const css::uno::Reference< css::uno::XComponentContext >& rxContext,
115
            const css::lang::Locale& _rSourceLocale,
116
            const css::lang::Locale& _rTargetLocale,
117
            const vcl::Font* _pTargetFont,
118
            sal_Int32 nOptions,
119
            bool _bIsInteractive
120
        );
121
122
        virtual ~HangulHanjaConversion();
123
124
        // converts the whole document
125
        void    ConvertDocument();
126
127
        weld::Widget*   GetUIParent() const; // the parent window for any UI we raise
128
        LanguageType    GetSourceLanguage() const;
129
        LanguageType    GetTargetLanguage() const;
130
        const vcl::Font* GetTargetFont() const;
131
        sal_Int32       GetConversionOptions() const;
132
        bool            IsInteractive() const;
133
134
        // chinese text conversion
135
        static inline bool IsSimplified( LanguageType nLang );
136
        static inline bool IsTraditional( LanguageType nLang );
137
        static inline bool IsChinese( LanguageType nLang );
138
139
        // used to specify that the conversion direction states from the
140
        // last incarnation should be used as
141
        // initial conversion direction for the next incarnation.
142
        // (A hack used to transport a state information from
143
        // one incarnation to the next. Used in Writers text conversion...)
144
        static void SetUseSavedConversionDirectionState( bool bVal );
145
        static bool IsUseSavedConversionDirectionState();
146
147
    protected:
148
        /** retrieves the next text portion which is to be analyzed
149
150
            <p>pseudo-abstract, needs to be overridden</p>
151
152
            @param _rNextPortion
153
                upon return, this must contain the next text portion
154
            @param _rLangOfPortion
155
                upon return, this must contain the language for the found text portion.
156
                (necessary for Chinese translation since there are 5 language variants
157
                too look for even if the 'source' language usually is only 'simplified'
158
                or 'traditional'.)
159
        */
160
        virtual void    GetNextPortion(
161
                OUString& /* [out] */ _rNextPortion,
162
                LanguageType& /* [out] */ _rLangOfPortion,
163
                bool /* [in] */ _bAllowImplicitChangesForNotConvertibleText ) = 0;
164
165
        /** announces a new "current unit"
166
167
            <p>This will be called whenever it is necessary to interactively ask the user for
168
            a conversion. In such a case, a range within the current portion (see <member>GetNextPortion</member>)
169
            is presented to the user for choosing a substitution. Additionally, this method is called,
170
            so that derived classes can e.g. highlight this text range in a document view.</p>
171
172
            <p>Note that the indexes are relative to the most recent replace action. See
173
            <member>ReplaceUnit</member> for details.</p>
174
175
            @param _nUnitStart
176
                the start index of the unit
177
178
            @param _nUnitEnd
179
                the start index (exclusively!) of the unit.
180
181
            @param _bAllowImplicitChangesForNotConvertibleText
182
                allows implicit changes other than the text itself for the
183
                text parts not being convertible.
184
                Used for chinese translation to attribute all not convertible
185
                text (e.g. western text, empty paragraphs, spaces, ...) to
186
                the target language and target font of the conversion.
187
                This is to ensure that after the conversion any new text entered
188
                anywhere in the document will have the target language (of course
189
                CJK Language only) and target font (CJK font only) set.
190
191
            @see GetNextPortion
192
        */
193
        virtual void    HandleNewUnit( const sal_Int32 _nUnitStart, const sal_Int32 _nUnitEnd ) = 0;
194
195
        /** replaces a text unit within a text portion with a new text
196
197
            <p>pseudo-abstract, needs to be overridden</p>
198
199
            <p>Note an important thing about the indices: They are always relative to the <em>previous
200
            call</em> of ReplaceUnit. This means when you get a call to ReplaceUnit, and replace some text
201
            in your document, then you have to remember the document position immediately <em>behind</em>
202
            the changed text. In a next call to ReplaceUnit, an index of <em>0</em> will denote exactly
203
            this position behind the previous replacement<br/>
204
            The reason is that this class here does not know anything about your document structure,
205
            so after a replacement took place, it's impossible to address anything in the range from the
206
            beginning of the portion up to the replaced text.<br/>
207
            In the very first call to ReplaceUnit, an index of <em>0</em> denotes the very first position of
208
            the current portion.</p>
209
210
            <p>If the language of the text to be replaced is different from
211
            the target language (as given by 'GetTargetLanguage') for example
212
            when converting simplified Chinese from/to traditional Chinese
213
            the language attribute of the new text has to be changed as well,
214
            **and** the font is to be set to the default (document) font for
215
            that language.</p>
216
217
            @param _nUnitStart
218
                the start index of the range to replace
219
220
            @param _nUnitEnd
221
                the end index (exclusively!) of the range to replace. E.g., an index
222
                pair (4,5) indicates a range of length 1.
223
224
            @param _rOrigText
225
                the original text to be replaced (as returned by GetNextPortion).
226
                Since in Chinese conversion the original text is needed as well
227
                in order to only do the minimal necessary text changes and to keep
228
                as much attributes as possible this is supplied here as well.
229
230
            @param _rReplaceWith
231
                The replacement text
232
233
            @param _rOffsets
234
                An sequence matching the indices (characters) of _rReplaceWith
235
                to the indices of the characters in the original text they are
236
                replacing.
237
                This is necessary since some portions of the text may get
238
                converted in portions of different length than the original.
239
                The sequence will be empty if all conversions in the text are
240
                of equal length. That is if always the character at index i in
241
                _rOffsets is replacing the character at index i in the original
242
                text for all valid index values of i.
243
244
            @param _eAction
245
                replacement action to take
246
247
            @param pNewUnitLanguage
248
                if the replacement unit is required to have a new language that
249
                is specified here. If the language is to be left unchanged this
250
                is the 0 pointer.
251
        */
252
        virtual void    ReplaceUnit(
253
                            const sal_Int32 _nUnitStart, const sal_Int32 _nUnitEnd,
254
                            const OUString& _rOrigText,
255
                            const OUString& _rReplaceWith,
256
                            const css::uno::Sequence< sal_Int32 > &_rOffsets,
257
                            ReplacementAction _eAction,
258
                            LanguageType *pNewUnitLanguage
259
                        ) = 0;
260
261
        /** specifies if rubies are supported by the document implementing
262
            this class.
263
264
            @return
265
                <TRUE/> if rubies are supported.
266
        */
267
        virtual bool    HasRubySupport() const = 0;
268
    };
269
270
    bool HangulHanjaConversion::IsSimplified( LanguageType nLang )
271
0
    {
272
0
        return MsLangId::isSimplifiedChinese(nLang);
273
0
    }
274
275
    bool HangulHanjaConversion::IsTraditional( LanguageType nLang )
276
0
    {
277
0
        return MsLangId::isTraditionalChinese(nLang);
278
0
    }
279
280
    bool HangulHanjaConversion::IsChinese( LanguageType nLang )
281
0
    {
282
0
        return MsLangId::isChinese(nLang);
283
0
    }
284
285
}
286
287
288
#endif // INCLUDED_EDITENG_HANGULHANJA_HXX
289
290
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */