/*************************************************************************** * Copyright (C) 2005 by TAM(Teppei Tamra) * * tam-t@par.odn.ne.jp * * * * 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 2 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, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "skkdicconversion.h" #include <honoka_def.h> #ifdef HAVE_CONFIG_H #include <config.h> #endif #ifdef HAVE_GETTEXT #include <libintl.h> #define _(String) dgettext(GETTEXT_PACKAGE,String) #define N_(String) (String) #else #define _(String) (String) #define N_(String) (String) #define bindtextdomain(Package,Directory) #define textdomain(domain) #define bind_textdomain_codeset(domain,codeset) #endif // プライグイン化のおまじないです。 HonokaPluginRegister(SKKDicConversion); SKKDicConversion::SKKDicConversion(ConfigPointer cfg) : Convertor(cfg) { String file = cfg->read(String(HONOKA_SKKDIC_CONFIG_DICFILE), String("")); dic = new SKKDic(file); pos = 0; } SKKDicConversion::~SKKDicConversion() { delete(dic); } bool SKKDicConversion::isConnected() { return true; } void SKKDicConversion::reset(){ buns.clear(); texts.clear(); pos = 0; return; } void SKKDicConversion::setYomiText(WideString yomi) { buns.clear(); texts.clear(); pos = 0; buns.push_back(yomi); return; } int SKKDicConversion::ren_conversion() { texts.push_back(buns[0]); pos = 0; return 1; } WideString SKKDicConversion::getText() { WideString t; for(unsigned int i = 0;i < texts.size();i ++) { t = t + texts[i]; } return t; } int SKKDicConversion::setPos(int p){ if ((p >= 0) && (p < buns.size())) pos = p; return pos; } int SKKDicConversion::getPos() { return pos; } ResultList SKKDicConversion::getResultList(int p,int kt){ list.Yomi.clear(); list.kouho.clear(); list.Title = utf8_mbstowcs(String(_("lookup result"))); list.count = 0; ResultEntry e; if (kt != 0) return list; if (p == -1) p = pos; else if (setPos(p) != p) return list; e.kanji = buns[pos]; list.Yomi = buns[pos]; list.kouho.push_back(e); list.count = 1; vector<SKKDicEntryData> es = dic->find(buns[p]); for(unsigned int i = 0;i < es.size();i ++) { e.kanji = es[i].kouho; if (es[i].annotation.length()) { e.label = es[i].kouho + utf8_mbstowcs(" (") + es[i].annotation + utf8_mbstowcs(")"); } list.kouho.push_back(e); } list.count = list.kouho.size(); return list; } ResultList SKKDicConversion::getYosokuList(const WideString &str) { // 予測用。 // この関数はもう使わないで下さい。分離予定です。 return ResultList(); } bool SKKDicConversion::select(int p) { if ((p < list.kouho.size()) && (p >= 0)) { texts[pos] = list.kouho[p].kanji; return true; } return false; } AttributeList SKKDicConversion::getAttributeList() { AttributeList attr; int l = 0; for(unsigned int i = 0;i < texts.size();i ++) { if (pos == i) { Attribute a(l,texts[i].length(),SCIM_ATTR_DECORATE,SCIM_ATTR_DECORATE_REVERSE); attr.push_back(a); } l += texts[i].length(); } return attr; } bool SKKDicConversion::resizeRegion(int w) { if ((buns[pos].length() + w) < 1) return false; if ((pos >= (buns.size() - 1)) && (w > 0)) return false; int s = buns[pos].length(); WideString t; vector<WideString> ws; for(unsigned int i = pos;i < buns.size();i ++) t = t + buns[i]; for(unsigned int i = 0;i < pos;i ++) { ws.push_back(buns[i]); } ws.push_back(t.substr(0,s + w)); if ((s + w) < t.length()) ws.push_back(t.substr(s + w)); buns.clear(); texts.clear(); buns = ws; texts = ws; return true; } void SKKDicConversion::updateFrequency() { return; } bool SKKDicConversion::connect() { return true; } void SKKDicConversion::disconnect() { return; } int SKKDicConversion::getCaretPos() { int l = 0; for(unsigned int i = 0;i < texts.size();i ++) { if (pos == i) return l; l += texts[i].length(); } return 0; } String SKKDicConversion::getName() { return String("SKKDic"); } String SKKDicConversion::getPropertyName() { return getName(); }