1 /*
2  * SPDX-FileCopyrightText: 2017-2017 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  *
6  */
7 #ifndef _FCITX5_ANTHY_ENGINE_H_
8 #define _FCITX5_ANTHY_ENGINE_H_
9 
10 #include "action.h"
11 #include "key2kana_table.h"
12 #include "style_file.h"
13 #include <anthy/anthy.h>
14 #include <fcitx-config/enum.h>
15 #include <fcitx-config/iniparser.h>
16 #include <fcitx-utils/i18n.h>
17 #include <fcitx/addonmanager.h>
18 #include <fcitx/candidatelist.h>
19 #include <fcitx/inputcontext.h>
20 #include <fcitx/inputcontextproperty.h>
21 #include <fcitx/inputmethodengine.h>
22 #include <fcitx/instance.h>
23 #include <fcitx/menu.h>
24 
25 FCITX_DECLARE_LOG_CATEGORY(anthy_logcategory);
26 
27 #define FCITX_ANTHY_DEBUG() FCITX_LOGC(anthy_logcategory, Debug)
28 
29 class AnthyEngine : public fcitx::InputMethodEngine {
30 public:
31     AnthyEngine(fcitx::Instance *instance);
32     ~AnthyEngine();
33     void keyEvent(const fcitx::InputMethodEntry &entry,
34                   fcitx::KeyEvent &keyEvent) override;
35     void reloadConfig() override;
36     std::string subMode(const fcitx::InputMethodEntry &,
37                         fcitx::InputContext &) override;
38     void activate(const fcitx::InputMethodEntry &,
39                   fcitx::InputContextEvent &) override;
40     void deactivate(const fcitx::InputMethodEntry &entry,
41                     fcitx::InputContextEvent &event) override;
42     void reset(const fcitx::InputMethodEntry &,
43                fcitx::InputContextEvent &) override;
44 
getConfig()45     const fcitx::Configuration *getConfig() const override { return &config_; }
setConfig(const fcitx::RawConfig & config)46     void setConfig(const fcitx::RawConfig &config) override {
47         config_.load(config, true);
48         saveConfig();
49         reloadConfig();
50     }
51 
saveConfig()52     void saveConfig() { fcitx::safeSaveAsIni(config_, "conf/anthy.conf"); }
53 
state(fcitx::InputContext * ic)54     auto state(fcitx::InputContext *ic) { return ic->propertyFor(&factory_); }
config()55     auto &config() { return config_; }
keyProfile()56     auto keyProfile() { return keyProfileFileLoaded_ ? &keyProfile_ : nullptr; }
customRomajiTable()57     auto customRomajiTable() {
58         return customRomajiTableLoaded_ ? &customRomajiTable_ : nullptr;
59     }
customKanaTable()60     auto customKanaTable() {
61         return customKanaTableLoaded_ ? &customKanaTable_ : nullptr;
62     }
customNicolaTable()63     auto customNicolaTable() {
64         return customNicolaTableLoaded_ ? &customNicolaTable_ : nullptr;
65     }
66 
67     FCITX_ADDON_DEPENDENCY_LOADER(clipboard, instance_->addonManager());
68 
constructed()69     bool constructed() { return constructed_; }
inputModeAction()70     auto inputModeAction() { return inputModeAction_.get(); }
typingMethodAction()71     auto typingMethodAction() { return typingMethodAction_.get(); }
conversionModeAction()72     auto conversionModeAction() { return conversionModeAction_.get(); }
periodStyleAction()73     auto periodStyleAction() { return periodStyleAction_.get(); }
symbolStyleAction()74     auto symbolStyleAction() { return symbolStyleAction_.get(); }
75 
76 private:
77     std::string keyProfileName();
78     std::string romajiTableName();
79     std::string kanaTableName();
80     std::string nicolaTableName();
81     std::string fullFileName(const std::string &name);
82 
83     bool constructed_ = false;
84     fcitx::Instance *instance_;
85     fcitx::FactoryFor<AnthyState> factory_;
86     AnthyConfig config_;
87 
88     bool keyProfileFileLoaded_ = false;
89     AnthyKeyProfile keyProfile_;
90 
91     bool customRomajiTableLoaded_ = false;
92     Key2KanaTable customRomajiTable_{"custom-romaji"};
93 
94     bool customKanaTableLoaded_ = false;
95     Key2KanaTable customKanaTable_{"custom-kana"};
96 
97     bool customNicolaTableLoaded_ = false;
98     Key2KanaTable customNicolaTable_{"custom-nicola"};
99 
100     std::unique_ptr<fcitx::Action> inputModeAction_;
101     std::unique_ptr<fcitx::Action> typingMethodAction_;
102     std::unique_ptr<fcitx::Action> conversionModeAction_;
103     std::unique_ptr<fcitx::Action> periodStyleAction_;
104     std::unique_ptr<fcitx::Action> symbolStyleAction_;
105     std::vector<std::unique_ptr<fcitx::Action>> subModeActions_;
106 
107     fcitx::Menu inputModeMenu_;
108     fcitx::Menu typingMethodMenu_;
109     fcitx::Menu conversionModeMenu_;
110     fcitx::Menu periodStyleMenu_;
111     fcitx::Menu symbolStyleMenu_;
112 };
113 
114 #endif // _FCITX5_ANTHY_ENGINE_H_
115