// -*- C++ -*- private include file for SKK
#ifndef _skkconv_h_included_
#define _skkconv_h_included_
#include "kkconv.h"
#include "rkconv.h"
#include "gtkdispatch.h"
// SKKStat::convstat
#define STATE_DIRECT 0
#define STATE_KANJI 1
#define STATE_OKURI 2
#define STATE_CONVERTING 3
#define STATE_WAITING 4
#define STATE_LATIN 5
#define SKK_UPDATE_PREEDIT 256
#define SKK_COMMIT_PENDING 512
#define SKK_CREATE_CCONTEXT 1024
#define SKK_CANCEL_CHILD 2048
#define SKK_FORWARD_CHILD 4096
extern atom_t A_skk_share_dic;
extern atom_t A_skk_personal_dic;
extern atom_t A_skk_learn_dic;
extern atom_t A_skk_widelatin_mode;
extern atom_t A_skk_toggle_hirakata;
extern atom_t A_skk_begin_latin_conv;
class SKKDic;
class SKKContext;
class SKKConv : public KKConv{
public:
virtual ~SKKConv();
//
char **getIcon();
void onPushIcon();
virtual char *getModeName(int );
//
void init();
RKMap *get_map(int mode);
SKKDic *get_dic();
KKContext *createContext(XimIC *ic);
private:
SKKDic *dic;
RKMap *hira_map;
RKMap *kata_map;
};
class SKKDic;
// SKKの変換状態を扱う
struct SKKStat{
public:
~SKKStat();
void init(SKKConv *);
int proc_key(keyState *k);
void setMode(int mode);
void flush();
void cancel();
jstring_t head,okuri;
jstring_t *pending;
cchar okuri_head;
Candidates *cands;
int convstat;
int mode;
RKConv *rkConv;
SKKConv *conv;
SKKDic *dic;
private:
int proc_raw_mode(keyState *k);
int proc_wide_mode(keyState *k);
int proc_no_conv(keyState *k);
int proc_conv(keyState *k);
// called by proc_conv();
int proc_kanji_state(keyState *k);
int proc_okuri_state(keyState *k);
int proc_converting_state(keyState *k);
int proc_latin_state(keyState *k);
int do_conv();
};
// don't reuse instance of this object
struct SKKChildContext{
SKKChildContext(SKKConv *,SKKChildContext *parent,SKKStat *s);
int pushKey(keyState *);
bool extra_input(jstring_t *);
SKKChildContext *get_parent_context();
void cancel_child();
void commit_child(jstring_t *s);
int get_current_level();
SKKStat stat;
jstring_t pre,post;
jstring_t learn;
private:
void init();
int proc_edit_key(keyState *,int);
SKKChildContext *parent_context;
};
class SKKChildWindow : public WidgetIf{
public:
SKKChildWindow(SKKConv *,SKKContext *);
virtual ~SKKChildWindow();
void key_press(GtkWidget *w,GdkEventKey *e);
void resize(GtkWidget *,int ,int);
void clicked(GtkWidget *);
void expose(GtkWidget *);
void activate(GtkWidget *w,gpointer p);
int pushKey(keyState *);
void open(SKKStat *);
void close();
bool extra_input(jstring_t *s);
private:
void init_win();
void add_input_mode(GtkWidget *w,char *l,int m);
void draw();
int draw_preedit(int x);
void draw_text_entry();
void clear_preedit();
int draw_cchar(cchar c, int x,int y,int e);
void update_mode();
SKKChildContext *get_current_context();
void set_current_context(SKKChildContext *);
void commit_to_parent();
void cancel_current();
SKKConv *m_skkConv;
SKKContext *m_skkContext;
SKKChildContext *m_context;//現在のChildContext
GtkWidget *m_win;
GtkWidget *m_text;
GdkPixmap *m_pix;
GtkWidget *m_commit_button;
GtkWidget *m_cancel_button;
GtkWidget *m_stat_menu;
};
class SKKContext : public KKContext{
public:
SKKContext(SKKConv *,XimIC *);
virtual ~SKKContext();
//
void OnUpdatePe(pe_stat *);
int pushKey(keyState *);
int getMode();
void setMode(int );
void commit_child(jstring_t *);
void cancel_child();
jstring_t *clear();
void candidate_selected(int n);
bool extra_input(jstring_t *s);
private:
void create_child_context();
SKKChildWindow *m_child;
SKKStat mStat; //SKKの変換状態
};
class SKKDic{
public:
SKKDic(){};
virtual ~SKKDic(){};
virtual Candidates *getCandidates(SKKStat *)=0;
virtual void commit(SKKStat *,jstring_t *)=0;
protected:
};
SKKDic *createSKKDic();
void initSkk();
#endif
/*
* Local variables:
* c-indent-level: 4
* c-basic-offset: 4
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1