/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program 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 General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /****************************************************************************** * * FILE * $Archive: /Commando/Code/wwui/IMEManager.h $ * * DESCRIPTION * Input Method Editor Manager for input of far east characters. * * PROGRAMMER * $Author: Denzil_l $ * * VERSION INFO * $Revision: 3 $ * $Modtime: 1/08/02 8:38p $ * ******************************************************************************/ #ifndef __IMEMANAGER_H__ #define __IMEMANAGER_H__ #include "RefCount.h" #include "IMECandidate.h" #include "Notify.h" #include "WideString.h" #include "win.h" #include namespace IME { #define IME_MAX_STRING_LEN 255 #define IME_MAX_TYPING_LEN 80 class IMEManager; typedef enum { IME_ACTIVATED = 1, IME_DEACTIVATED, IME_LANGUAGECHANGED, IME_GUIDELINE, IME_ENABLED, IME_DISABLED, } IMEAction; typedef TypedActionPtr IMEEvent; typedef enum { COMPOSITION_INVALID = 0, COMPOSITION_TYPING, COMPOSITION_START, COMPOSITION_CHANGE, COMPOSITION_FULL, COMPOSITION_END, COMPOSITION_CANCEL, COMPOSITION_RESULT } CompositionAction; typedef TypedActionPtr CompositionEvent; class UnicodeType; typedef TypedEvent UnicodeChar; class IMEManager : public RefCountClass, public Notifier, public Notifier, public Notifier, public Notifier { public: static IMEManager* Create(HWND hwnd); void Activate(void); void Deactivate(void); bool IsActive(void) const; void Disable(void); void Enable(void); bool IsDisabled(void) const; const wchar_t* GetDescription(void) const {return mIMEDescription;} WORD GetLanguageID(void) const {return mLangID;} UINT GetCodePage(void) const {return mCodePage;} const wchar_t* GetResultString(void) const {return mResultString;} const wchar_t* GetCompositionString(void) const {return mCompositionString;} long GetCompositionCursorPos(void) const {return mCompositionCursorPos;} const wchar_t* GetReadingString(void) const {return mReadingString;} #ifdef SHOW_IME_TYPING const wchar_t* GetTypingString(void) const {return mTypingString;} #endif void GetTargetClause(unsigned long& start, unsigned long& end); bool GetCompositionFont(LPLOGFONT lpFont); const IMECandidateCollection GetCandidateColl(void) const {return mCandidateColl;} unsigned long GetGuideline(wchar_t* outString, int length); bool ProcessMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& result); protected: IMEManager(); virtual ~IMEManager(); bool FinalizeCreate(HWND hwnd); LRESULT IMENotify(WPARAM wParam, LPARAM lParam); HKL InputLanguageChangeRequest(HKL hkl); void InputLanguageChanged(HKL hkl); void ResetComposition(void); void StartComposition(void); void DoComposition(unsigned int dbcsChar, long changeFlag); void EndComposition(void); bool ReadCompositionString(HIMC imc, unsigned long flag, wchar_t* buffer, int length); long ReadReadingAttr(HIMC imc, unsigned char* attr, int length); long ReadReadingClause(HIMC imc, unsigned long* clause, int length); long ReadCompositionAttr(HIMC imc, unsigned char* attr, int length); long ReadCompositionClause(HIMC imc, unsigned long* clause, int length); long ReadCursorPos(HIMC imc); void OpenCandidate(unsigned long candList); void ChangeCandidate(unsigned long candList); void CloseCandidate(unsigned long candList); bool IMECharHandler(unsigned short dbcs); bool CharHandler(unsigned short ch); long ConvertAttrForUnicode(unsigned char* mbcs, unsigned char* attr); long ConvertClauseForUnicode(unsigned char* mbcs, long length, unsigned long* clause); DECLARE_NOTIFIER(IMEEvent) DECLARE_NOTIFIER(UnicodeChar) DECLARE_NOTIFIER(CompositionEvent) DECLARE_NOTIFIER(CandidateEvent) // Prevent copy and assignment IMEManager(const IMEManager&); const IMEManager& operator=(const IMEManager&); private: HWND mHWND; HIMC mDefaultHIMC; HIMC mHIMC; HIMC mDisabledHIMC; unsigned long mDisableCount; WORD mLangID; UINT mCodePage; WideStringClass mIMEDescription; DWORD mIMEProperties; bool mHilite; bool mStartCandListFrom1; bool mOSCanUnicode; bool mUseUnicode; bool mInComposition; #ifdef SHOW_IME_TYPING wchar_t mTypingString[IME_MAX_TYPING_LEN]; long mTypingCursorPos; #endif wchar_t mCompositionString[IME_MAX_STRING_LEN]; unsigned char mCompositionAttr[IME_MAX_STRING_LEN]; unsigned long mCompositionClause[IME_MAX_STRING_LEN / 2]; long mCompositionCursorPos; wchar_t mReadingString[IME_MAX_STRING_LEN * 2]; wchar_t mResultString[IME_MAX_STRING_LEN]; IMECandidateCollection mCandidateColl; }; } // namespace IME #endif __IMEMANAGER_H__