/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: */ |