diff options
Diffstat (limited to 'src/kile/mathenvdialog.cpp')
-rw-r--r-- | src/kile/mathenvdialog.cpp | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/src/kile/mathenvdialog.cpp b/src/kile/mathenvdialog.cpp new file mode 100644 index 0000000..4e52bca --- /dev/null +++ b/src/kile/mathenvdialog.cpp @@ -0,0 +1,373 @@ +/*************************************************************************** + mathenvdialog.cpp +---------------------------------------------------------------------------- + date : Dec 06 2005 + version : 0.21 + copyright : (C) 2005 by Holger Danielsson + email : holger.danielsson@t-online.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "mathenvdialog.h" +#include "codecompletion.h" +#include "kileedit.h" + +#include <qlayout.h> +#include <qstringlist.h> +#include <qvaluelist.h> +#include <qwhatsthis.h> + +#include <klocale.h> +#include "kiledebug.h" + +namespace KileDialog +{ + +MathEnvironmentDialog::MathEnvironmentDialog(QWidget *parent, KConfig *config, KileInfo *ki, KileDocument::LatexCommands *commands) + : Wizard(config,parent), m_ki(ki), m_latexCommands(commands) +{ + QWidget *page = new QWidget(this); + setMainWidget(page); + setCaption(i18n("Math Environments")); + + QVBoxLayout *vbox = new QVBoxLayout(page,8,8); + + // environment groupbox + QButtonGroup *envgroup = new QButtonGroup( i18n("Environment"),page); + envgroup->setColumnLayout(0, Qt::Vertical ); + envgroup->layout()->setSpacing( 6 ); + envgroup->layout()->setMargin( 11 ); + + m_lbEnvironment = new QLabel(i18n("&Name:"),envgroup); + m_lbStarred = new QLabel(i18n("Without n&umbering:"),envgroup); + m_lbRows = new QLabel(i18n("Number of &rows:"),envgroup); + m_lbCols = new QLabel(i18n("Number of c&ols:"),envgroup); + m_lbSpace = new QLabel(i18n("Space command\nto &separate groups:"), envgroup); + m_lbTabulator = new QLabel(i18n("Standard &tabulator:"), envgroup); + m_lbDisplaymath = new QLabel(i18n("Display&math mode:"), envgroup); + m_lbBullets = new QLabel(i18n("Use &bullets:"), envgroup); + + QFrame *frame = new QFrame(envgroup); + frame->setFrameStyle(QFrame::HLine | QFrame::Sunken); + frame->setLineWidth(1); + + m_coEnvironment = new QComboBox(envgroup); + m_cbStarred = new QCheckBox(envgroup); + m_spRows = new QSpinBox(1,99,1,envgroup); + m_spRows->setValue(3); + m_spCols = new QSpinBox(1,49,1,envgroup); + m_spCols->setValue(3); + m_edSpace = new KLineEdit("",envgroup); + m_coTabulator = new QComboBox(envgroup); + m_coDisplaymath = new QComboBox(envgroup); + m_cbBullets = new QCheckBox(envgroup); + + QGridLayout *envlayout = new QGridLayout( envgroup->layout() ); + envlayout->setAlignment( Qt::AlignTop ); + envlayout->addWidget( m_lbEnvironment, 0,0 ); + envlayout->addWidget( m_lbStarred, 1,0 ); + envlayout->addWidget( m_lbRows, 2,0 ); + envlayout->addWidget( m_lbCols, 3,0 ); + envlayout->addWidget( m_lbTabulator, 5,0 ); + envlayout->addWidget( m_lbDisplaymath, 6,0 ); + envlayout->addWidget( m_coEnvironment, 0,1 ); + envlayout->addWidget( m_cbStarred, 1,1 ); + envlayout->addWidget( m_spRows, 2,1 ); + envlayout->addWidget( m_spCols, 3,1 ); + envlayout->addWidget( m_coTabulator, 5,1 ); + envlayout->addWidget( m_coDisplaymath, 6,1 ); + envlayout->addWidget( m_lbSpace, 3,3 ); + envlayout->addWidget( m_lbBullets, 5,3 ); + envlayout->addWidget( m_edSpace, 3,4 ); + envlayout->addWidget( m_cbBullets, 5,4 ); + envlayout->addMultiCellWidget(frame,4,4,0,4); + envlayout->setRowSpacing(4,30); + envlayout->setColSpacing(2,20); + envlayout->setColStretch(4,1); + + // add widgets + vbox->addWidget( envgroup); + vbox->addStretch(1); + + m_lbEnvironment->setBuddy(m_coEnvironment); + m_lbStarred->setBuddy(m_cbStarred); + m_lbRows->setBuddy(m_spRows); + m_lbCols->setBuddy(m_spCols); + m_lbSpace->setBuddy(m_edSpace); + m_lbTabulator->setBuddy(m_coTabulator); + m_lbDisplaymath->setBuddy(m_coDisplaymath); + m_lbBullets->setBuddy(m_cbBullets); + + // initialize dialog + m_coDisplaymath->insertItem(QString::null); + m_coDisplaymath->insertItem("displaymath"); + m_coDisplaymath->insertItem("\\["); + m_coDisplaymath->insertItem("equation"); + m_coDisplaymath->insertItem("equation*"); + + // install environments + initEnvironments(); + m_coEnvironment->setCurrentText("align"); + slotEnvironmentChanged( m_coEnvironment->currentItem() ); + + // signals and slots + connect(m_coEnvironment, SIGNAL(activated(int)), this, SLOT(slotEnvironmentChanged(int))); + connect(m_spCols, SIGNAL(valueChanged(int)), this, SLOT(slotSpinboxValueChanged(int))); + + QWhatsThis::add(m_coEnvironment,i18n("Choose an environment.")); + QWhatsThis::add(m_cbStarred,i18n("Use the starred version of this environment.")); + QWhatsThis::add(m_spRows,i18n("Choose the number of table rows.")); + QWhatsThis::add(m_spCols,i18n("Choose the number of table columns or alignment groups.")); + QWhatsThis::add(m_edSpace,i18n("Define an extra LaTeX command to separate alignment groups.")); + QWhatsThis::add(m_coTabulator,i18n("Choose one of some predefined tabulators.")); + QWhatsThis::add(m_coDisplaymath,i18n("Some environments are only valid in math mode. You can surround them with one of these display math modes.")); + QWhatsThis::add(m_cbBullets,i18n("Insert bullets in each cell. Alt+Ctrl+Right and Alt+Ctrl+Left will move very quick from one cell to another.")); +} + +void MathEnvironmentDialog::initEnvironments() +{ + // read all math environments and insert them into the combobox + QStringList list; + QStringList::ConstIterator it; + m_latexCommands->commandList(list,(uint)(KileDocument::CmdAttrAmsmath|KileDocument::CmdAttrMath),false); + for ( it=list.begin(); it != list.end(); ++it ) + { + m_coEnvironment->insertItem(*it); + } +} + +bool MathEnvironmentDialog::isGroupsParameterEnv() +{ + return ( m_parameter == "{n}" ); +} + +bool MathEnvironmentDialog::isParameterEnv() +{ + return ( m_parameter.find("{") >= 0 ); +} + +////////////////////////////// determine the whole tag ////////////////////////////// + +void MathEnvironmentDialog::slotEnvironmentChanged(int index) +{ + KILE_DEBUG() << "environment changed: " << m_coEnvironment->text(index) << endl; + m_envname = m_coEnvironment->text(index); + + // look for environment parameter in dictionary + KileDocument::LatexCmdAttributes attr; + if ( m_latexCommands->commandAttributes(m_envname,attr) ) + { + m_starred = attr.starred; + m_mathmode = attr.mathmode; + m_columns = ( attr.tabulator == "&" ); + m_groups = ( attr.tabulator == "&=" ); + m_fixedcolumns = ( attr.tabulator == "&=&" ); + m_tabulator = attr.tabulator; + m_parameter = attr.parameter; + } + + // set starred version + m_cbStarred->setChecked(false); + m_lbStarred->setEnabled(m_starred); + m_cbStarred->setEnabled(m_starred); + + // determine column/group entries + QString labeltext = i18n("Number of cols:"); + bool spinstate = false; + int minvalue = 1; + int maxvalue = 1; + int value = 1; + + if ( m_columns ) + { + spinstate = true; + if ( m_envname != "cases" ) // 1,49,3 + { + maxvalue = 49; + value = 3; + } + else + { + minvalue = 2; // 2,2,2 + maxvalue = 2; + value = 2; + } + } else if ( m_groups ) + { + spinstate = true; + labeltext = i18n("Number of groups:"); + maxvalue = 19; // 1,19,1 + } else if ( m_fixedcolumns ) + { + spinstate = true; + minvalue = 3; // 3,3,3 + maxvalue = 3; + value = 3; + } else if ( m_envname == "split" ) + { + spinstate = true; + maxvalue = 2; // 1,2,1 + } + + // set column/group entries + m_lbCols->setText(labeltext); + m_spCols->setMinValue(minvalue); + m_spCols->setMaxValue(maxvalue); + m_spCols->setValue(value); + + m_lbCols->setEnabled(spinstate); + m_spCols->setEnabled(spinstate); + slotSpinboxValueChanged(m_spCols->value()); + + // set tabulator entries + m_coTabulator->clear(); + QStringList tablist; + if ( m_tabulator == "&=&" ) + tablist << "&=&" << "& &" << "&<&" << "&<=&" << "&>&" << "&>=&" + << "&\\ne&" << "&\\approx&" << "&\\equiv&" << "&\\conq&" ; + else if ( m_tabulator == "&=" ) + tablist << "&=" << "& " << "&<" << "&<=" << "&>" << "&>=" + << "&\\ne" << "&\\approx" << "&\\equiv" << "&\\conq" ; + else if ( ! m_tabulator.isEmpty() ) + tablist << "&"; + bool tabstate = ( tablist.count() > 0 ); + m_lbTabulator->setEnabled(tabstate); + m_coTabulator->setEnabled(tabstate); + if ( tabstate ) + m_coTabulator->insertStringList(tablist); + + // set displaymathmode entries + m_lbDisplaymath->setEnabled(m_mathmode); + m_coDisplaymath->setEnabled(m_mathmode); +} + +void MathEnvironmentDialog::slotSpinboxValueChanged(int index) +{ + bool state = ( index>1 && m_groups && isGroupsParameterEnv() ); + m_lbSpace->setEnabled(state); + m_edSpace->setEnabled(state); +} + +void MathEnvironmentDialog::slotOk() +{ + // environment + QString envname = ( m_cbStarred->isChecked() ) ? m_envname + '*' : m_envname; + QString indent = m_ki->editorExtension()->autoIndentEnvironment(); + + // use bullets? + QString bullet = ( m_cbBullets->isChecked() ) ? s_bullet : QString::null; + + // normal tabulator + QString tab = m_coTabulator->currentText(); + tab.replace("<=","\\le"); + tab.replace(">=","\\ge"); + QString tabulator = bullet + ' ' + tab + ' '; + + // number of rows + int numrows = m_spRows->value(); + + // get number of groups/columns and tabulator to separate these + QString topgrouptabulator,grouptabulator; + int numgroups; + bool aligngroups; + if ( m_groups ) + { + aligngroups = true; + numgroups = ( m_tabulator != "&" ) ? m_spCols->value() : 1; + if ( m_edSpace->isEnabled() ) + { + QString spaces; + topgrouptabulator = " &" + m_edSpace->text() + " "; + grouptabulator = " & " + spaces.fill(' ', m_edSpace->text().length()); + } + else + { + topgrouptabulator = " & "; + grouptabulator = " & "; + } + } + else + { + aligngroups = false; + if ( ! m_fixedcolumns ) + numgroups = ( m_columns ) ? m_spCols->value()-1 : 0; + else + numgroups = 1; + } + + // get displaymath mode + QString displaymathbegin = QString::null; + QString displaymathend = QString::null; + if ( m_coDisplaymath->isEnabled() ) + { + QString mathmode = m_coDisplaymath->currentText(); + if ( ! mathmode.isEmpty() ) + { + if ( mathmode == "\\[" ) + { + displaymathbegin = "\\[\n"; + displaymathend = "\\]\n"; + } + else + { + displaymathbegin = QString("\\begin{%1}\n").arg(mathmode); + displaymathend = QString("\\end{%1}\n").arg(mathmode); + } + } + } + + // build tag + m_td.tagBegin = displaymathbegin; + + QString parameter; + if ( isGroupsParameterEnv() ) + parameter = QString("{%2}").arg(numgroups); + else if ( isParameterEnv() ) + parameter = '{' + bullet + '}'; + + // open environment + m_td.tagBegin += QString("\\begin{%1}").arg(envname) + parameter + '\n'; + + for ( int row=0; row<numrows; ++row ) + { + m_td.tagBegin += indent; + for ( int col=0; col<numgroups; ++col ) + { + m_td.tagBegin += tabulator; + // is there more than one group or column? + if ( aligngroups && col<numgroups-1 ) + { + if ( row == 0 ) + m_td.tagBegin += bullet + topgrouptabulator; + else + m_td.tagBegin += bullet + grouptabulator; + } + } + // last row without CR + if ( row < numrows-1 ) + m_td.tagBegin += bullet + " \\\\\n"; + else + m_td.tagBegin += bullet; + } + + // close environment + m_td.tagEnd = QString("\n\\end{%1}\n").arg(envname); + m_td.tagEnd += displaymathend; + + m_td.dy = ( displaymathbegin.isEmpty() ) ? 1 : 2; + m_td.dx = indent.length(); + + accept(); +} + +} + +#include "mathenvdialog.moc" |