summaryrefslogtreecommitdiffstats
path: root/kvoctrain/kvoctrain/docprop-dialogs/UsageOptPage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kvoctrain/kvoctrain/docprop-dialogs/UsageOptPage.cpp')
-rw-r--r--kvoctrain/kvoctrain/docprop-dialogs/UsageOptPage.cpp314
1 files changed, 314 insertions, 0 deletions
diff --git a/kvoctrain/kvoctrain/docprop-dialogs/UsageOptPage.cpp b/kvoctrain/kvoctrain/docprop-dialogs/UsageOptPage.cpp
new file mode 100644
index 00000000..007622a8
--- /dev/null
+++ b/kvoctrain/kvoctrain/docprop-dialogs/UsageOptPage.cpp
@@ -0,0 +1,314 @@
+/***************************************************************************
+
+ usage labels dialog page
+
+ -----------------------------------------------------------------------
+
+ begin : Thu Mar 30 20:38:31 1999
+
+ copyright : (C) 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
+ (C) 2001 The KDE-EDU team
+ (C) 2005 Peter Hedlund <peter.hedlund@kdemail.net>
+
+ -----------------------------------------------------------------------
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 "UsageOptPage.h"
+
+#include <kapplication.h>
+#include <kinputdialog.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+
+#include <QueryManager.h>
+
+#define USAGE_TAG ". "
+
+UsageOptPage::UsageOptPage
+(
+ const vector<QString> &usages,
+ kvoctrainDoc *_doc,
+ QWidget *parent,
+ const char *name
+)
+ :
+ UsageOptPageForm( parent, name ),
+ doc(_doc)
+{
+ connect( b_cleanup, SIGNAL(clicked()), SLOT(slotCleanup()) );
+ connect( b_delete, SIGNAL(clicked()), SLOT(slotDeleteUsage()) );
+ connect( b_modify, SIGNAL(clicked()), SLOT(slotModifyUsage()) );
+ connect( b_new, SIGNAL(clicked()), SLOT(slotNewUsage()) );
+ connect( usageList, SIGNAL(highlighted(int)), SLOT(slotUsageChosen(int)) );
+
+ QString str;
+ for (int i = 0; i < (int) usages.size(); i++) {
+ str.setNum (i+1);
+ if (i <= 9)
+ str.insert (0, " ");
+ usageList->insertItem (str+USAGE_TAG+usages[i]);
+ usageIndex.push_back(i);
+ }
+
+ act_usage = 0;
+ if (usages.size() != 0)
+ usageList->setCurrentItem (act_usage);
+
+ b_modify->setEnabled(usageList->count() != 0);
+ b_delete->setEnabled(usageList->count() != 0);
+
+ usageList->setFocus();
+}
+
+
+void UsageOptPage::slotUsageChosen(int index)
+{
+ act_usage = index;
+}
+
+
+void UsageOptPage::slotNewUsage()
+{
+ bool ok;
+ QString getUsage = KInputDialog::getText(
+ i18n( "usage (area) of an expression", "Usage Description" ), i18n( "Enter usage description:" ), QString::null, &ok );
+ if( !ok )
+ return;
+ QString str;
+ int i = usageList->count()+1;
+ str.setNum (i);
+ if (i <= 9)
+ str.insert (0, " ");
+ usageList->insertItem (str+USAGE_TAG+getUsage.stripWhiteSpace());
+ usageIndex.push_back(-(i-1));
+ act_usage = usageList->count();
+ usageList->setCurrentItem (i-1);
+ b_modify->setEnabled(true);
+ b_delete->setEnabled(true);
+}
+
+
+void UsageOptPage::slotModifyUsage()
+{
+ if (usageList->count() != 0
+ && (int) usageList->count() > act_usage) {
+ QString str = usageList->text (act_usage);
+ int pos = str.find (USAGE_TAG);
+ str.remove (0, pos+strlen (USAGE_TAG));
+
+ bool ok;
+ QString getUsage = KInputDialog::getText(
+ i18n( "usage (area) of an expression", "Usage Description" ), i18n( "Enter usage description:" ), str, &ok );
+ if( !ok )
+ return;
+ QString str2;
+ str2.setNum (act_usage+1);
+ if (act_usage <= 9)
+ str2.insert (0, " ");
+ usageList->changeItem (str2+USAGE_TAG+getUsage.stripWhiteSpace(), act_usage);
+ }
+}
+
+
+void UsageOptPage::updateListBox(int start)
+{
+ QString str, str2;
+ for (int i = start; i < (int) usageList->count(); i++)
+ {
+ str = usageList->text (i);
+ int pos = str.find (USAGE_TAG);
+ str.remove (0, pos+strlen (USAGE_TAG));
+ str2.setNum (i+1);
+ if (i <= 9)
+ str2.insert (0, " ");
+ usageList->changeItem (str2+USAGE_TAG+str, i);
+ }
+}
+
+
+void UsageOptPage::slotDeleteUsage()
+{
+ int act = act_usage;
+ if (usageList->count() != 0 && (int) usageList->count() > act)
+ {
+ QString t;
+ t.setNum(usageIndex[act_usage]+1);
+ t.insert (0, UL_USER_USAGE);
+ t += UL_USAGE_DIV;
+ for (int ent = 0; ent < doc->numEntries(); ent++) {
+ // FIXME: ProgressDlg here?
+ kvoctrainExpr *exp = doc->getEntry(ent);
+ for (int lang = 0; lang < doc->numLangs(); lang++) {
+ QString ul = exp->getUsageLabel(lang) + UL_USAGE_DIV;
+ if (ul.find(t) >= 0 ) {
+ KMessageBox::information(this,
+ i18n("usage (area) of an expression",
+ "This user-defined usage label could not be deleted "
+ "because it is in use."),
+ kapp->makeStdCaption(i18n("usage (area) of an expression",
+ "Deleting Usage Label")));
+ return;
+ }
+ }
+ }
+
+ usageList->removeItem (act);
+ usageIndex.erase (usageIndex.begin() + act);
+
+ if ((int) usageList->count() <= act)
+ act = usageList->count()-1;
+ else
+ updateListBox(act); // update items after current
+
+ if (act >= 0)
+ usageList->setCurrentItem (act);
+ }
+ b_modify->setEnabled(usageList->count() != 0);
+ b_delete->setEnabled(usageList->count() != 0);
+}
+
+
+void UsageOptPage::getUsageLabels (vector<QString> &ret_usage,
+ vector<int> &ret_Index)
+{
+ QString str; ret_usage.clear();
+ for (int i = 0; i < (int) usageList->count(); i++) {
+ str = usageList->text(i);
+ int pos = str.find (USAGE_TAG);
+ str.remove (0, pos+strlen (USAGE_TAG));
+ ret_usage.push_back (str);
+ }
+ ret_Index = usageIndex;
+}
+
+
+void UsageOptPage::slotCleanup()
+{
+ vector<bool> used_usage;
+ for (int i = 0; i <= (int) usageList->count(); i++)
+ used_usage.push_back(false);
+
+ for (int col = 0; col < doc->numLangs(); col++)
+ for (int i = 0; i < (int) doc->numEntries(); i++) {
+ QString t = doc->getEntry(i)->getUsageLabel(col);
+ QString n;
+ while (t.left(strlen(UL_USER_USAGE)) == UL_USER_USAGE) {
+ t.remove (0, 1);
+
+ int next;
+ if ((next = t.find(UL_USAGE_DIV)) >= 0) {
+ n = t.left(next);
+ t.remove (0, next+1);
+ }
+ else {
+ n = t;
+ t = "";
+ }
+
+ int idx = n.toInt();
+ if ((int) used_usage.size() < idx)
+ used_usage.resize(idx);
+ if (idx != 0)
+ used_usage[idx-1] = true ;
+ }
+ }
+
+ for (int i = used_usage.size()-1; i >= 0; i--) {
+ if (!used_usage[i]) {
+ for (int u = 0; u < (int) usageIndex.size() ; u++) {
+ if (usageIndex[u] == i || usageIndex[u] < 0) {
+ act_usage = i;
+ slotDeleteUsage();
+ break;
+ }
+ }
+ }
+ }
+
+ act_usage = 0;
+ usageList->setCurrentItem (act_usage);
+}
+
+
+void UsageOptPage::cleanUnused(kvoctrainDoc *doc,
+ const vector<int> &usageIndex,
+ int old_usages)
+{
+ vector<int> translate_index;
+ vector<QString> new_usageStr;
+
+ /////////////////////////////////////////////////////
+ // translate_index contains new index number for each
+ // old index
+ for (int i = 0; i <= QMAX (old_usages, (int) usageIndex.size()); i++)
+ translate_index.push_back(0);
+
+ // now adjust lesson descriptions to new index
+
+ for (int i = 0; i < (int) usageIndex.size(); i++) {
+ if (usageIndex[i] >= 0)
+ translate_index[usageIndex[i]+1] = i+1;
+ }
+
+ // only keep remaining usage indices
+
+ // set usage index to 0 when not needed any more
+ // and translate to new index
+
+ for (int col = 0; col < doc->numLangs(); col++) {
+ for (int i = 0; i < doc->numEntries(); i++) {
+ QString t = doc->getEntry(i)->getUsageLabel (col);
+ if (!t.isEmpty() && t.left(strlen(UL_USER_USAGE)) == UL_USER_USAGE) {
+ QString tg;
+ while (t.left(strlen(UL_USER_USAGE)) == UL_USER_USAGE) {
+ QString n;
+ t.remove (0, 1);
+ int next;
+ if ((next = t.find(UL_USAGE_DIV)) >= 0) {
+ n = t.left(next);
+ t.remove (0, next+1);
+ }
+ else {
+ n = t;
+ t = "";
+ }
+
+ QString newusage;
+ int o = n.toInt();
+ if (translate_index[o] != 0) {
+ newusage.setNum (translate_index[o]);
+ newusage.insert (0, UL_USER_USAGE);
+ }
+
+ if (tg.length() == 0)
+ tg = newusage;
+ else
+ if (newusage.length() )
+ tg += UL_USAGE_DIV + newusage;
+ }
+
+ if (tg.length() == 0)
+ tg = t;
+ else if (t.length() != 0)
+ tg += UL_USAGE_DIV + t;
+
+ doc->getEntry(i)->setUsageLabel (col, tg);
+ }
+ }
+ }
+}
+
+#include "UsageOptPage.moc"