You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kvoctrain/kvoctrain/kva_header.cpp

571 lines
18 KiB

/***************************************************************************
header buttons part of kvoctrain
-----------------------------------------------------------------------
begin : Thu Mar 11 20:50:53 MET 1999
copyright : (C) 1999-2001 Ewald Arnold
(C) 2001 The KDE-EDU team
email : kvoctrain@ewald-arnold.de
-----------------------------------------------------------------------
***************************************************************************/
/************x***************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "kvoctrain.h"
#include "query-dialogs/RandomQueryDlg.h"
#include "query-dialogs/MCQueryDlg.h"
#include "query-dialogs/AdjQueryDlg.h"
#include "query-dialogs/VerbQueryDlg.h"
#include "query-dialogs/ArtQueryDlg.h"
#include "query-dialogs/SimpleQueryDlg.h"
#include <kcombobox.h>
#include <tdelocale.h>
#include <kdebug.h>
#include <kstandarddirs.h>
#include <kiconloader.h>
static const char *SORT_ALPHA = I18N_NOOP("&Sort alphabetically");
static const char *SORT_NUM = I18N_NOOP("Sort by &index");
void kvoctrainApp::slotHeaderMenu(int header, int x, int y) /*FOLD00*/
{
delete header_m;
header_m = 0;
if (header == KV_COL_LESS) {
header_m = new TQPopupMenu();
header_m->insertItem(SmallIconSet("sort_incr"), i18n(SORT_ALPHA), (header << 16) | IDH_SORT_COL_ALPHA);
header_m->insertItem(SmallIconSet("sort_num"), i18n(SORT_NUM), (header << 16) | IDH_SORT_COL_NUM);
connect (header_m, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotHeaderCallBack(int)));
connect (header_m, TQ_SIGNAL(highlighted(int)), this, TQ_SLOT(slotHeaderStatus(int)));
header_m->exec(TQPoint (x, y));
return;
}
header -= KV_EXTRA_COLS; // adjust doc == header button
vector<TQString> names;
TQString curr_lang;
TQString id = header == 0 ? doc->getOriginalIdent()
: doc->getIdent(header);
if (langset.indexShortId(id) >= 0)
curr_lang = langset.longId(langset.indexShortId(id));
// select one of the available languages for the column
TQPopupMenu *langs_m = new TQPopupMenu();
// hack: ID => header-id + language
for (int i = 0; i < (int) langset.size(); i++) {
if(langset.longId(i).isEmpty() )
names.push_back(langset.shortId(i));
else
names.push_back(langset.longId(i));
}
for (int i = 0; i < (int) langset.size(); i++) {
if( !langset.PixMapFile(i).isEmpty()
&& !langset.longId(i).isEmpty() )
langs_m->insertItem(TQPixmap(langset.PixMapFile(i)), names[i],
(header << 16) | (i << (16+8)) | IDH_SET_LANG);
else
langs_m->insertItem(names[i],
(header << 16) | (i << (16+8)) | IDH_SET_LANG);
}
connect (langs_m, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotSetHeaderProp(int)));
connect (langs_m, TQ_SIGNAL(highlighted(int)), this, TQ_SLOT(slotHeaderStatus(int)));
header_m = new TQPopupMenu();
if (header != KV_COL_ORG - KV_EXTRA_COLS ) {
header_m->insertItem(SmallIconSet("run_query"), i18n("Create Random &Query"), (header << 16) | IDH_START_QUERY);
header_m->insertItem(SmallIconSet("run_multi"), i18n("Create &Multiple Choice"), (header << 16) | IDH_START_MULTIPLE);
header_m->setItemEnabled((header << 16) | IDH_START_MULTIPLE, doc->numLangs() > 1);
header_m->setItemEnabled((header << 16) | IDH_START_QUERY, doc->numLangs() > 1);
header_m->insertSeparator();
header_m->insertItem(i18n("&Verbs"), (header << 16) | IDH_START_VERB);
header_m->insertItem(i18n("&Articles"), (header << 16) | IDH_START_ARTICLE);
header_m->insertItem(i18n("&Comparison Forms"), (header << 16) | IDH_START_ADJECTIVE);
header_m->insertSeparator();
header_m->insertItem(i18n("S&ynonyms"), (header << 16) | IDH_START_SYNONYM);
header_m->insertItem(i18n("A&ntonyms"), (header << 16) | IDH_START_ANTONYM);
header_m->insertItem(i18n("E&xamples"), (header << 16) | IDH_START_EXAMPLE);
header_m->insertItem(i18n("&Paraphrase"), (header << 16) | IDH_START_PARAPHRASE);
header_m->insertSeparator();
header_m->insertItem(SmallIconSet("sort_incr"), i18n(SORT_ALPHA), (header+KV_EXTRA_COLS << 16) | IDH_SORT_COL_ALPHA);
header_m->insertItem(SmallIconSet("set_language"), i18n("Set &Language"), langs_m, (2 << 16) | IDH_NULL);
header_m->insertSeparator();
header_m->insertItem(i18n("Reset &Grades"), (header << 16) | IDH_RESET_GRADE);
header_m->insertItem(SmallIconSet("delete_table_col"), i18n("&Remove Column"), (header << 16) | IDH_REMOVE );
}
else {
TQPopupMenu *query_m = new TQPopupMenu();
TQPopupMenu *multiple_m = new TQPopupMenu();
names.clear();
for (int j = 1; j < (int) doc->numLangs(); j++) {
int i;
if ((i = langset.indexShortId(doc->getIdent(j))) >= 0)
names.push_back(langset.longId(i));
else
names.push_back(doc->getIdent(j));
}
for (int i = 1; i < (int) doc->numLangs(); i++) {
// show pixmap and long name if available
int j;
if((j = langset.indexShortId(doc->getIdent(i))) >= 0
&& !langset.PixMapFile(j).isEmpty()
&& !langset.longId(j).isEmpty() ) {
query_m->insertItem(TQPixmap(langset.PixMapFile(j)), i18n("From %1").arg(names[i-1]),
(i << (16+8)) | IDH_START_QUERY); // hack: IDs => header-ids + cmd
}
else {
query_m->insertItem(i18n("From %1").arg(doc->getIdent(i)), (i << (16+8)) | IDH_START_QUERY);
}
}
header_m->insertItem(SmallIconSet("run_query"), i18n("Create Random &Query"), query_m, (3 << 16) | IDH_NULL);
connect (query_m, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotHeaderCallBack(int)));
connect (query_m, TQ_SIGNAL(highlighted(int)), this, TQ_SLOT(slotHeaderStatus(int)));
for (int i = 1; i < (int) doc->numLangs(); i++) {
// show pixmap and long name if available
int j;
if((j = langset.indexShortId(doc->getIdent(i))) >= 0
&& !langset.PixMapFile(j).isEmpty()
&& !langset.longId(j).isEmpty() ) {
multiple_m->insertItem(TQPixmap(langset.PixMapFile(j)), i18n("From %1").arg(names[i-1]),
(i << (16+8)) | IDH_START_MULTIPLE); // hack: IDs => header-ids + cmd
}
else {
multiple_m->insertItem(i18n("From %1").arg(doc->getIdent(i)), (i << (16+8)) | IDH_START_MULTIPLE);
}
}
header_m->insertItem(SmallIconSet("run_multi"), i18n("Create &Multiple Choice"), multiple_m, (4 << 16) | IDH_NULL);
header_m->insertSeparator();
header_m->insertItem(i18n("Train &Verbs"), (header << 16) | IDH_START_VERB);
header_m->insertItem(i18n("&Article Training"), (header << 16) | IDH_START_ARTICLE);
header_m->insertItem(i18n("&Comparison Training"), (header << 16) | IDH_START_ADJECTIVE);
header_m->insertSeparator();
header_m->insertItem(i18n("&Synonyms"), (header << 16) | IDH_START_SYNONYM);
header_m->insertItem(i18n("&Antonyms"), (header << 16) | IDH_START_ANTONYM);
header_m->insertItem(i18n("E&xamples"), (header << 16) | IDH_START_EXAMPLE);
header_m->insertItem(i18n("&Paraphrase"), (header << 16) | IDH_START_PARAPHRASE);
connect (multiple_m, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotHeaderCallBack(int)));
connect (multiple_m, TQ_SIGNAL(highlighted(int)), this, TQ_SLOT(slotHeaderStatus(int)));
header_m->insertSeparator();
header_m->insertItem(SmallIconSet("sort_incr"), i18n(SORT_ALPHA), (header+KV_EXTRA_COLS << 16) | IDH_SORT_COL_ALPHA);
header_m->insertItem(SmallIconSet("set_language"), i18n("Set &Language"), langs_m, (2 << 16) | IDH_NULL);
}
connect (header_m, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotHeaderCallBack(int)));
connect (header_m, TQ_SIGNAL(highlighted(int)), this, TQ_SLOT(slotHeaderStatus(int)));
header_m->exec(TQPoint(x, y));
}
void kvoctrainApp::slotSetHeaderProp (int header_and_id) /*FOLD00*/
{
int header1 = (header_and_id >> 16) & 0xFF; // org, trans1, trans2, ..
int id = header_and_id >> (16+8); // language ident
//int cmd = header_and_id & 0xFFFF; // always SET_LANG
if (id >= (int) langset.size())
return; // ???
TQString lid = langset.shortId(id);
if (!langset.longId(id).isEmpty() )
lid = langset.longId(id);
TQString pm = "";
if (!langset.PixMapFile(id).isEmpty() )
pm = langset.PixMapFile(id);
view->setHeaderProp (header1+KV_EXTRA_COLS, lid, pm);
/*
cout << "shp 1: " << (void*) doc << endl << flush;
for (int i = 0; i < (int) langset.size(); i++) {
cout << " " << EA_LOCAL(langset.shortId(i)) << " "
<< EA_LOCAL(langset.longId(i)) << " "
<< EA_LOCAL(langset.PixMapFile(i)) << " "
<< hex << (const void*) EA_LOCAL(langset.PixMapFile(i)) << endl;
}
*/
if (header1 > 0)
doc->setIdent(header1, langset.shortId(id));
else
doc->setOriginalIdent(langset.shortId(id));
/*
for (int i = 0; i < (int) langset.size(); i++) {
cout << " " << EA_LOCAL(langset.shortId(i)) << " "
<< EA_LOCAL(langset.longId(i)) << " "
<< EA_LOCAL(langset.PixMapFile(i)) << " "
<< hex << (const void*) EA_LOCAL(langset.PixMapFile(i)) << endl;
}
*/
doc->setModified();
slotStatusMsg(IDS_DEFAULT);
}
void kvoctrainApp::slotHeaderStatus (int header_and_cmd) /*FOLD00*/
{
int header1 = (header_and_cmd >> 16) & 0xFF;
int header2 = header_and_cmd >> (16+8);
int cmd = header_and_cmd & 0xFFFF;
//cout << header1 << " " << header2 << " " << cmd << endl;
switch (cmd) {
case IDH_NULL:
break;
case ID_RESUME_QUERY:
slotStatusHelpMsg(i18n("Resumes random query with existing selection"));
break;
case ID_RESUME_MULTIPLE:
slotStatusHelpMsg(i18n("Resumes multiple choice with existing selection"));
break;
case IDH_SORT_COL_ALPHA:
slotStatusHelpMsg(i18n("Sorts column alphabetically up/down"));
break;
case IDH_SORT_COL_NUM:
slotStatusHelpMsg(i18n("Sorts column by lesson index up/down"));
break;
case IDH_SET_LANG: {
TQString from = langset.longId(header2);
if (from.isEmpty())
from = langset.shortId(header2);
TQString msg;
if (header1 == 0) {
TQString format = i18n("Sets %1 as language for original");
msg = format.arg(from);
}
else {
TQString format = i18n("Sets %1 as language for translation %2");
msg = format.arg(from).arg(header1);
}
slotStatusHelpMsg(msg);
}
break;
case IDH_APPEND: {
TQString msg;
if (header1 == 0xFF) {
msg = i18n("Appends a new language");
slotStatusHelpMsg(msg);
}
else if (header1 < (int) langset.size() ) {
TQString from = langset.longId(header1);
TQString format = i18n("Appends %1 as new language");
msg = format.arg(from);
slotStatusHelpMsg(msg);
}
}
break;
case IDH_REMOVE: {
TQString from = header1 ? doc->getIdent(header1) : doc->getOriginalIdent();
if (!langset.findLongId(from).isEmpty())
from = langset.findLongId(from);
TQString msg;
TQString format = i18n("Removes %1 irrevocably from dictionary");
msg = format.arg(from);
slotStatusHelpMsg(msg);
}
break;
case IDH_START_QUERY:
case IDH_START_MULTIPLE: {
TQString to = header1 ? doc->getIdent(header1) : doc->getOriginalIdent();
if (!langset.findLongId(to).isEmpty())
to = langset.findLongId(to);
TQString from = header2 ? doc->getIdent(header2) : doc->getOriginalIdent();
if (!langset.findLongId(from).isEmpty())
from = langset.findLongId(from);
TQString msg;
TQString format;
if (doc->numLangs() == 1) {
if (cmd == IDH_START_QUERY)
format = i18n("Creates and starts query to %1");
else
format = i18n("Creates and starts multiple choice to %1");
msg = format.arg(to);
}
else {
if (cmd == IDH_START_QUERY)
format = i18n("Creates and starts query from %1 to %2");
else
format = i18n("Creates and starts multiple choice from %1 to %2");
msg = format.arg(from).arg(to);
}
slotStatusHelpMsg(msg);
}
break;
case IDH_START_VERB: {
slotStatusHelpMsg(i18n("Starts training with verbs"));
}
break;
case IDH_START_ARTICLE: {
slotStatusHelpMsg(i18n("Starts training with articles"));
}
break;
case IDH_START_ADJECTIVE: {
slotStatusHelpMsg(i18n("Starts training with adjectives"));
}
break;
case IDH_START_SYNONYM: {
slotStatusHelpMsg(i18n("Starts training with synonyms"));
}
break;
case IDH_START_ANTONYM: {
slotStatusHelpMsg(i18n("Starts training with antonyms"));
}
break;
case IDH_START_EXAMPLE: {
slotStatusHelpMsg(i18n("Starts training with examples"));
}
break;
case IDH_START_PARAPHRASE: {
slotStatusHelpMsg(i18n("Starts training with paraphrases"));
}
break;
case IDH_CREATE_LESSON: {
slotStatusHelpMsg(i18n("Creates lesson"));
}
break;
case IDH_RESET_GRADE: {
TQString from = header1 ? doc->getIdent(header1) : doc->getOriginalIdent();
if (!langset.findLongId(from).isEmpty())
from = langset.findLongId(from);
TQString format = i18n("Resets all properties for %1");
TQString msg = format.arg(from);
slotStatusHelpMsg(msg);
}
break;
default:
kdError() << "kvoctrainApp::slotHeaderStatus: got unknown command :" << cmd << endl;
}
}
void kvoctrainApp::slotHeaderCallBack (int header_and_cmd) /*FOLD00*/
{
int header1 = (header_and_cmd >> 16) & 0xFF;
int header2 = header_and_cmd >> (16+8);
int cmd = header_and_cmd & 0xFFFF;
kdDebug() << header1 << " " << header2 << " " << cmd << endl;
switch (cmd) {
case IDH_SORT_COL_ALPHA:
view->getTable()->sortByColumn_alpha(header1);
return;
break;
case IDH_SORT_COL_NUM:
view->getTable()->sortByColumn_index(header1);
return;
break;
}
if (header1 >= (int) doc->numLangs()) {
kdError() << "header1 >= (int) doc->numLangs()\n";
return;
}
if (header2 >= (int) doc->numLangs()) {
kdError() << "header2 >= (int) doc->numLangs()\n";
return;
}
switch (cmd) {
case IDH_NULL:
break;
case ID_RESUME_QUERY:
queryType = TQT_Random;
slotRestartQuery();
break;
case ID_RESUME_MULTIPLE:
queryType = TQT_Multiple;
slotRestartQuery();
break;
case IDH_REMOVE: {
TQString msg;
TQString name;
name = doc->getIdent(header1);
int i= langset.indexShortId(name);
if ( i >= 0
&& !langset.longId(i).isEmpty() )
name = langset.longId(i);
TQString format = i18n("You are about to delete a language completely.\n"
"Do you really want to delete \"%1\"?");
msg = format.arg(name);
int exit = KMessageBox::warningContinueCancel(this, msg,
kapp->makeStdCaption(""),KStdGuiItem::del());
if(exit==KMessageBox::Continue) {
doc->removeIdent(header1);
view->setView (doc, langset);
doc->setModified();
}
}
break;
case IDH_START_QUERY:
delete randomQueryDlg;
randomQueryDlg = 0;
queryType = TQT_Random;
slotStartQuery(header1 ? doc->getIdent(header1) : doc->getOriginalIdent(),
header2 ? doc->getIdent(header2) : doc->getOriginalIdent(), true);
break;
case IDH_START_MULTIPLE:
delete mcQueryDlg;
mcQueryDlg = 0;
queryType = TQT_Multiple;
slotStartQuery(header1 ? doc->getIdent(header1) : doc->getOriginalIdent(),
header2 ? doc->getIdent(header2) : doc->getOriginalIdent(), true);
break;
case IDH_START_VERB: {
delete verbQueryDlg;
verbQueryDlg = 0;
queryType = TQT_Conjugation;
slotStartTypeQuery (header1, TQM_VERB);
}
break;
case IDH_START_ARTICLE: {
delete artQueryDlg;
artQueryDlg = 0;
queryType = TQT_Articles;
slotStartTypeQuery (header1, TQM_NOUN);
}
break;
case IDH_START_ADJECTIVE: {
delete adjQueryDlg;
adjQueryDlg = 0;
queryType = TQT_Comparison;
slotStartTypeQuery (header1, TQM_ADJ);
}
break;
case IDH_START_SYNONYM: {
delete simpleQueryDlg;
simpleQueryDlg = 0;
slotStartPropertyQuery (header1, TQT_Synonym);
}
break;
case IDH_START_ANTONYM: {
delete simpleQueryDlg;
simpleQueryDlg = 0;
slotStartPropertyQuery (header1, TQT_Antonym);
}
break;
case IDH_START_EXAMPLE: {
delete simpleQueryDlg;
simpleQueryDlg = 0;
slotStartPropertyQuery (header1, TQT_Example);
}
break;
case IDH_START_PARAPHRASE: {
delete simpleQueryDlg;
simpleQueryDlg = 0;
slotStartPropertyQuery (header1, TQT_Paraphrase);
}
break;
case IDH_CREATE_LESSON:
slotCreateLesson(header1);
break;
case IDH_RESET_GRADE: {
TQString msg;
TQString name;
TQString format;
if (act_lesson == 0) {
name = doc->getIdent(header1);
int i = langset.indexShortId(doc->getIdent(header1));
if (i >= 0
&& !langset.longId(i).isEmpty() )
name = langset.longId(i);
format = i18n("You are about to reset the knowledge data of a "
"whole language.\n\nDo you really want to reset \"%1\"?");
}
else {
name = lessons->text(act_lesson);
format = i18n("You are about to reset the knowledge data of a "
"lesson.\n\nDo you really want to reset \"%1\"?");
}
msg = format.arg(name);
int exit = KMessageBox::warningContinueCancel(this, msg,
kapp->makeStdCaption(""),i18n("Reset"));
if(exit==KMessageBox::Continue) {
doc->resetEntry (header1, act_lesson);
doc->setModified();
view->getTable()->updateContents();
}
}
break;
default:
kdError() << "kvoctrainApp::slotHeaderCallBack: got unknown command\n";
}
slotStatusMsg(IDS_DEFAULT);
}