📄 ndict.cpp
字号:
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "Dict.h"
#include "dirview.h"
#include "xpm.h"
#include "PhoneticLabel.h"
#include <stdio.h>
char* filename;//="/mmc/mmca1/dict/LDPW_ECCE.pdb";
//char *filename;
#include <zapplication.h>
#include <zmainwidget.h>
#include <ZScrollView.h>
#include <zmessagebox.h>
#include <ezxres.h>
#include <qlineedit.h>
#include <qlistbox.h>
#include <qtextcodec.h>
#include <ezxutilcst.h>
#include <zmultilineedit.h>
#include <zglobal.h>
#define IMID_PINYIN_KB QUuid( 0x637a8a14, 0xaf98, 0x41da, 0x96, 0x9a, 0x2b, 0xd1, 0x6e, 0xcd, 0x00, 0x10)
#define IMID_ENGLISH_KB QUuid( 0x637a8a14, 0xaf98, 0x41da, 0x96, 0x9a, 0x2b, 0xd1, 0x6e, 0xcd, 0xa8, 0x00)
#define HWRCLASS 0x6919720a
#define IMID_HANDWRITING_KB QUuid( HWRCLASS, 0xaf98, 0x41da, 0x96, 0x9a, 0x2b, 0xd1, 0x6e, 0xcd, 0xa4, 0x10)
#define IMID_UNDEFINED QUuid()
static QTextCodec* gbk_codec = QTextCodec::codecForName("GBK");
static QString un_gbk(const char*ChnStr)
{
return gbk_codec->toUnicode(ChnStr);
}
static QTextCodec* unic_codec = QTextCodec::codecForName("GBK");
static QCString un_unic(const QString ChnStr)
{
return unic_codec->fromUnicode(ChnStr);
}
class ShowWidget : public ZMainWidget{
Q_OBJECT
public slots:
void Hide()
{
this->hide();
};
public:
ZMultiLineEdit* showEdit;
PhoneticLabel* phLabel;
QLineEdit* wdEdit;
ZScrollView* sv;
ShowWidget(QWidget* parent):ZMainWidget(parent, "show",1)
{
sv=(ZScrollView*)getContentWidget();
//sv->viewport()
wdEdit = new QLineEdit(sv->viewport());
wdEdit->setFrame(false);
wdEdit->setGeometry(0,0,240,25);
wdEdit->setReadOnly(true);
// //wdEdit->setFixedSize (QSize(240,25));
//
phLabel = new PhoneticLabel(sv->viewport());
phLabel->setGeometry(0,25,240,50);
// phLabel->setFixedSize (QSize(240,25));
phLabel->convPhone=myConvPhone;
showEdit = new ZMultiLineEdit(sv->viewport(),false,-1, "show");
showEdit->setReadOnly(true);
showEdit->setGeometry(0,50,240,190);
//showEdit->setFixedSize (QSize(240,190));
showEdit->setUnderline(false);
showEdit->setWordWrap(ZMultiLineEdit::NoWrap );
sv->addChild(wdEdit,0,0,true);
sv->addChild(phLabel,0,25,true);
sv->addChild(showEdit,0,50,true);
//ZApplication::setMouseMode(showEdit,1);
UTIL_CST *cp = new UTIL_CST(this, "CST");
setCSTWidget(cp);
cp->show();
ZPushButton *wp;
wp = cp->getRightBtn();
connect(wp, SIGNAL(clicked()), this, SLOT(Hide()));
wp = cp->getLeftBtn();
wp->setEnabled(false);
wp = cp->getMidBtn();
wp->setText(un_gbk("确定"));
connect(wp, SIGNAL(clicked()), this, SLOT(Hide()));
};
void SetText(QString wd, QString ph, QString exp)
{
wdEdit->setText(wd);
phLabel->setText(ph);
showEdit->clear();
showEdit->setText(exp);
}
};
class MyWidget : public ZMainWidget{
Q_OBJECT
private:
Dict dic;
int menuID_About,menuID_SetPath,menuID_ShowDict;
char* getLine(FILE *in);
QUuid curIMN;
QValueList<QUuid> flist1;
public:
ShowWidget* sw;
QLineEdit* input;
QListBox* list;
MyWidget();
void InitialCST(ZMainWidget* const mw);
void openDict();
public slots:
void hideInputWidget();
void Input(const QString & str);
void Selected(QListBoxItem * item);
void EnterPress();
void Clear();
void menuSelect(int id);
void setPath();
void readPath();
};
void MyWidget::hideInputWidget()
{
QUuid imn=getCurrentInputMethodName(false);
if(imn!=IMID_UNDEFINED)
{
curIMN=imn;
setInputMethods(input,curIMN, flist1, ZGlobal::KBF_NONE);
}
ZMainWidget::hideInputWidget();
}
MyWidget::MyWidget():ZMainWidget(true, NULL, "ezxdict", 0)//ZMainWidget( true, 0 )
{
getContentWidget();
sw=new ShowWidget(NULL);
input = new QLineEdit(this,"input1");
input->setGeometry(0,0,240,25);
ZApplication::setMouseMode(input,1);
list = new QListBox(this);
list->setGeometry(0,25,240,215);
connect(input, SIGNAL(textChanged ( const QString & )), this, SLOT(Input ( const QString & )));
connect(input, SIGNAL(returnPressed ()),this, SLOT(EnterPress()));
connect(list, SIGNAL(clicked ( QListBoxItem * )), this, SLOT(Selected ( QListBoxItem * )));
InitialCST(this);
flist1.append(IMID_PINYIN_KB);
flist1.append(IMID_ENGLISH_KB);
flist1.append(IMID_HANDWRITING_KB);
setInputMethods(input,IMID_ENGLISH_KB, flist1, ZGlobal::KBF_NONE);
//setFavoriteInputMethods(flist1);
//setInputMethod(IMID_ENGLISH_KB);
//setInputMethod(IMID_ENGLISH_KB,ZGlobal::KBF_NONE);
//std::cout<<"Initial finished\n";
}
void MyWidget::InitialCST(ZMainWidget* const mw)
{
ZPushButton *wp;
QPopupMenu *pp;
UTIL_CST *cp = new UTIL_CST(mw, "CST");
setCSTWidget(cp);
cp->show();
wp = cp->getMidBtn();
wp->setText(un_gbk("清空"));
connect(wp, SIGNAL(clicked()), this, SLOT(Clear()));
wp = cp->getRightBtn();
connect(wp, SIGNAL(clicked()), qApp, SLOT(slotQuickQuit()));
pp = new QPopupMenu(cp, NULL);
menuID_SetPath=pp->insertItem(un_gbk("设置字典路径"));
menuID_ShowDict=pp->insertItem(un_gbk("当前字典名称"));
menuID_About=pp->insertItem(un_gbk("关于"));
connect(pp, SIGNAL(activated(int)), SLOT(menuSelect(int)));
wp = cp->getLeftBtn();
wp->setPopup(pp);
}
void MyWidget::Input(const QString & str)
{
//std::cout << "key words changed\n";
list->clear();
char **word_list;
int len=dic.GetWordList(un_unic(str),&word_list);
for(int i=0;i<len;i++)
{
list->insertItem( un_gbk(word_list[i]) );
delete[] word_list[i];
}
if(len>0)
delete[] word_list;
}
void MyWidget::Selected(QListBoxItem * item)
{
if(item)
{
char *exp;
if(dic.GetExp(un_unic(item->text()),&exp)!=-1)
{
//sw->SetText(un_gbk(exp));
QString tmp=un_gbk(exp);
QString wd,ph,ex;
//printf("str len:%u\n",len);
int start=0;
int end=tmp.find("\n");
do
{
wd=tmp.mid(start,end-start);
if(end==-1)
{
ph=ex="";
break;
};
start=end+1;
end=tmp.find("\n",start);
ph=tmp.mid(start,end-start);
if(end==-1)
{
ex="";
break;
}
start=end+1;
ex=tmp.mid(start);
}
while(0);
if(ph.isEmpty())
{
ph="[ ]";
}
else
{
if(ph[0]!='[')
{
ex=ph+ex;
ph="[ ]";
}
}
sw->SetText(wd,ph,ex);
sw->show();
delete[] exp;
}
}
}
void MyWidget::EnterPress()
{
if(list->text(0))
{
char *exp;
if(dic.GetExp(un_unic(list->text(0)),&exp)!=-1)
{
QString tmp=un_gbk(exp);
QString wd,ph,ex;
//printf("str len:%u\n",len);
int start=0;
int end=tmp.find("\n");
do
{
wd=tmp.mid(start,end-start);
if(end==-1)
{
ph=ex="";
break;
};
start=end+1;
end=tmp.find("\n",start);
ph=tmp.mid(start,end-start);
if(end==-1)
{
ex="";
break;
}
start=end+1;
ex=tmp.mid(start);
}
while(0);
if(ph.isEmpty())
{
ph="[]";
}
else
{
if(ph[0]!='[')
{
ex=ph+ex;
ph="[]";
}
}
sw->SetText(wd,ph,ex);
sw->show();
delete[] exp;
}
};
}
void MyWidget::Clear()
{
input->clear();
input->setFocus();
list->setContentsPos(0,0);
invokeInputWidget();
}
void MyWidget::menuSelect(int id)
{
if(id== menuID_About){
ZMessageBox::timerInformation(this, NULL, un_gbk(" 简单电子词典\n\n 谨以此词典送给爱我的娜娜\n 08年于工程大学\nsun_yanteng@hotmail.com\n您可以自由使用、修改本软件,但请勿用于商业用途!"), 15,"OK");
}
else if(id== menuID_SetPath){
setPath();
}
else if(id==menuID_ShowDict){
QString mesg=un_gbk("当前词典:\n");
mesg.append(un_gbk(dic.dictName));//un_gbk("\n已经打开"));
sw->SetText("","",mesg);
sw->show();
}
}
void MyWidget::setPath()
{
QString tmp(filename);
int index=tmp.findRev("/");
if(index!=-1)
tmp=tmp.left(index);
else
tmp="/";
QString ret=DirectoryView::getSaveFileName(this,tmp);
QCString buf=ret.utf8();
//printf("len:%d\n",buf.length());
if(buf.length()!=0)
{
FILE *fout=fopen(QString(getenv("APPPATH"))+"/config","wb");
fwrite(buf,1,buf.length(),fout);
fclose(fout);
openDict();
}
else
{
if(!dic.OpenDict(filename))
exit(0);
}
}
char* MyWidget::getLine(FILE *in)
{
//printf("start reading\n");
int i=0;
char *buf=new char[4096];
while(buf[i]=fgetc(in))
{
if(i>4096) break;
if(buf[i]==0xff) break;
i++;
}
buf=(char *)realloc(buf,i+1);
if(!buf) printf("none buffer!");
buf[i]='\0';
return buf;
}
void MyWidget::readPath()
{
FILE *fin=fopen(QString(getenv("APPPATH"))+"/config","rb");
if(fin)
{
filename=getLine(fin);
printf("%s\n",filename);
fclose(fin);
}
}
void MyWidget::openDict()
{
readPath();
while(!dic.OpenDict(filename))
{
ZMessageBox::information(this, NULL, un_gbk("请选择词库"),"OK");
setPath();
readPath();
}
input->setFocus();
QString ts=input->text();
input->clear();
input->setText(ts);
Input(ts);
}
int main (int argc, char** argv)
{
ZApplication app (argc, argv);
QString appPath = QString( app.argv()[0] );
int slash = appPath.findRev( "/" );
if (slash != -1) {
appPath = appPath.left( slash );
if ( !appPath.contains("NDict") ) {
appPath = QString( getenv("PWD") );
}
appPath = "APPPATH=" + appPath;
app.setEnv( appPath );
//std::cout<<appPath.utf8()<<"\n";
}
MyWidget* w = new MyWidget;
w->show();
w->openDict();
app.setMainWidget (w);
return app.exec();
}
#include "NDict.moc"
//int main(int argc, char* argv[])
//{
// Dict dic;
// dic.OpenDict(filename);
// char **list;
// int len=dic.GetWordList("student",&list);
// for(int i=0;i<len;i++)
// {
// printf("%s\n",list[i]);
// }
// char *exp;
// len=dic.GetExp("student",&exp);
// printf("%s",exp);
// printf("Done!");
// return 0;
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -