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.
kile/src/kile/configstructure.cpp

354 lines
12 KiB

/***************************************************************************
date : Feb 09 2004
version : 0.10.0
copyright : (C) 2004 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 "configstructure.h"
#include <kdialog.h>
#include <tdeconfig.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <tqlayout.h>
#include <tqtabwidget.h>
#include <tqgroupbox.h>
#include <tqvgroupbox.h>
#include <tqframe.h>
#include <tqstringlist.h>
#include <tqpushbutton.h>
#include <tqcombobox.h>
#include <tqspinbox.h>
#include <tqpainter.h>
#include <tqrect.h>
#include <tqlabel.h>
namespace KileStructure
{
//////////////////// KileCenteredTableItem ////////////////////
void KileCenteredTableItem::paint(TQPainter* p,const TQColorGroup& cg,const TQRect& cr,bool selected)
{
int w = cr.width();
int h = cr.height();
if (selected && colSpan()==1 ) {
p->fillRect( 0,0,w,h, cg.brush( TQColorGroup::Highlight ) );
p->setPen( cg.highlightedText() );
} else {
p->fillRect( 0,0,w,h, TQt::white );
p->setPen( TQt::black );
/*
TQFont f( p->font() );
f.setBold(true);
p->setFont(f);
*/
}
p->drawText( 2,0,w-4,h, TQt::AlignHCenter|AlignVCenter, text() );
}
//////////////////// KileTable ////////////////////
KileTable::KileTable(TQWidget *dialog, TQWidget *parent, const char *name) : TQTable(parent,name)
{
setShowGrid(false);
setSelectionMode(TQTable::NoSelection);
setFocusStyle(TQTable::FollowStyle);
verticalHeader()->hide();
setLeftMargin(0);
setVScrollBarMode(TQScrollView::AlwaysOff);
setHScrollBarMode(TQScrollView::AlwaysOff);
setFocusPolicy(TQWidget::NoFocus);
horizontalHeader()->setResizeEnabled(false);
horizontalHeader()->setClickEnabled(false);
connect(this,TQT_SIGNAL(clickedCell(KileTable *,int,int)),dialog,TQT_SLOT(clickedTable(KileTable *,int,int)));
}
void KileTable::contentsMousePressEvent(TQMouseEvent *ev)
{
ev->accept();
emit( clickedCell( this,rowAt(ev->y()), columnAt(ev->x()) ));
}
//////////////////// ConfigStructure ////////////////////
ConfigStructure::ConfigStructure(TQWidget *parent, const char *name )
: TQWidget(parent,name)
{
m_entries << i18n( "Files" ) << i18n( "Labels" ) << i18n( "References" )
<< i18n( "Index" ) << i18n( "Graphics" ) << i18n( "Sectioning" );
TQHBoxLayout *hbox = new TQHBoxLayout(this, 5,KDialog::spacingHint() );
// Groupbox with entries
TQVGroupBox *gb_entries= new TQVGroupBox(i18n("Entries"), this );
TQWidget *widget1 = new TQWidget(gb_entries);
TQVBoxLayout *vbox1 = new TQVBoxLayout(widget1, 5,KDialog::spacingHint() );
// table with entries
m_entriestable = new KileTable(this,widget1);
m_entriestable->setNumCols(3);
m_entriestable->setNumRows(6);
m_entriestable->setColumnReadOnly(0,true);
TQStringList list1;
list1 << i18n( "Title" ) << i18n( "Visible" ) << i18n( "Open" );
m_entriestable->setColumnLabels(list1);
m_entriestable->horizontalHeader()->setLabel(1,SmallIcon("structure"), i18n( "Visible" ));
m_entriestable->horizontalHeader()->setLabel(2,SmallIcon("structure"), i18n( "Node" ));
for ( uint i=0; i<m_entries.count(); ++i ) {
TQTableItem *item = new TQTableItem(m_entriestable,TQTableItem::Never, m_entries[i]);
m_entriestable->setItem( i,0,item );
m_visible[i] = new TQCheckTableItem(m_entriestable,"");
m_entriestable->setItem( i,1, m_visible[i] );
m_defaultopen[i] = new TQCheckTableItem(m_entriestable,"close");
m_entriestable->setItem( i,2, m_defaultopen[i] );
}
// groupbox with sectioning
TQVGroupBox *gb_sectioning= new TQVGroupBox(i18n("Sectioning"), this );
TQWidget *widget2 = new TQWidget(gb_sectioning);
TQVBoxLayout *vbox2 = new TQVBoxLayout(widget2, 5,KDialog::spacingHint() );
// document class
TQWidget *widget3 = new TQWidget(widget2);
TQHBoxLayout *hbox3 = new TQHBoxLayout(widget3, 5,KDialog::spacingHint() );
TQLabel *label7 = new TQLabel(i18n("Document class:"), widget3);
comboclasses = new TQComboBox(widget3);
hbox3->addWidget(label7);
hbox3->addSpacing(10);
hbox3->addWidget(comboclasses);
hbox3->setStretchFactor(comboclasses,1);
// table with sectioning commands
m_sectioningtable = new KileTable(this,widget2);
m_sectioningtable->setNumCols(3);
m_sectioningtable->setNumRows(5);
m_sectioningtable->setColumnReadOnly(0,true);
m_sectioningtable->setColumnReadOnly(1,true);
TQStringList list2;
list2 << i18n( "Level" ) << i18n( "LaTeX Command" ) << i18n( "Structure Node" );
m_sectioningtable->setColumnLabels(list2);
m_sectioningtable->horizontalHeader()->setLabel(2,SmallIcon("structure"),"Structure Node");
// default structure level
TQGroupBox *structGroup = new TQGroupBox(2, Qt::Horizontal, i18n("Structure View"), widget2);
TQLabel *label9 = new TQLabel(i18n("Default expansion &level: "),structGroup);
m_structurelevel = new TQSpinBox(1,5, 1, structGroup);
label9->setBuddy(m_structurelevel);
TQGroupBox *classGroup = new TQGroupBox(1,Qt::Horizontal,i18n("Document Classes"), widget2);
TQWidget *widget4 = new TQWidget(classGroup);
TQHBoxLayout *hbox4 = new TQHBoxLayout(widget4, 5,KDialog::spacingHint() );
TQLabel *label10 = new TQLabel("Manage classes:",widget4);
add = new TQPushButton(i18n("Add"), widget4);
remove = new TQPushButton(i18n("Remove"), widget4);
hbox4->addWidget(label10);
hbox4->addStretch();
hbox4->addWidget(add);
hbox4->addWidget(remove);
// add widgets to the left vertical layout
vbox1->addWidget(m_entriestable);
vbox1->addStretch();
// add widgets to the right vertical layout
vbox2->addWidget(widget3);
vbox2->addSpacing(10);
vbox2->addWidget(m_sectioningtable);
vbox2->addSpacing(10);
vbox2->addWidget(structGroup);
vbox2->addWidget(classGroup);
vbox2->addStretch();
// add both groupboxes to horizontal layout
hbox->addWidget(gb_entries);
hbox->addWidget(gb_sectioning);
hbox->setStretchFactor(gb_entries,3);
hbox->setStretchFactor(gb_sectioning,4);
// set default sectioning commands
comboclasses->insertItem("latex");
TQStringList *sectcommands = new TQStringList;
*sectcommands << "part" << "chapter" << "section" << "subsection" << "subsubsection";
m_docclasses["latex"] = sectcommands;
showSectioning(m_docclasses["latex"]);
remove->setEnabled(false);
connect(m_structurelevel,TQT_SIGNAL(valueChanged(int)),this,TQT_SLOT(spinboxChanged(int)));
connect(comboclasses,TQT_SIGNAL(activated(const TQString &)),this,TQT_SLOT(comboboxChanged(const TQString &)));
connect(add,TQT_SIGNAL(clicked()),this,TQT_SLOT(clickedAdd()));
add->setEnabled(false);
}
ConfigStructure::~ConfigStructure()
{
TQMap<TQString, const TQStringList*>::Iterator it, end = m_docclasses.end();
for(it = m_docclasses.begin() ; it != end ; ++it)
delete *it;
}
void ConfigStructure::polish()
{
// TQWidget::polish();
uint w = m_entriestable->sizeHint().width();
m_entriestable->setColumnWidth(0,3*w/7);
m_entriestable->setColumnWidth(1,2*w/7);
m_entriestable->setColumnWidth(2,2*w/7+1);
m_entriestable->setColumnStretchable(2,true);
w = m_sectioningtable->sizeHint().width();
m_sectioningtable->setColumnWidth(0,w/6);
m_sectioningtable->setColumnWidth(1,3*w/6);
m_sectioningtable->setColumnWidth(2,2*w/6+1);
m_sectioningtable->setColumnStretchable(2,true);
}
void ConfigStructure::clickedTable(KileTable *table,int row, int col)
{
if ( table==m_entriestable && row>=0 && row<6 ) {
if ( col==1 )
m_visible[row]->setChecked( !m_visible[row]->isChecked() );
else if ( col == 2 ) {
if ( m_defaultopen[row]->isChecked() ) {
m_defaultopen[row]->setChecked(false);
m_defaultopen[row]->setText("close");
} else {
m_defaultopen[row]->setChecked(true);
m_defaultopen[row]->setText("open");
}
}
}
}
void ConfigStructure::spinboxChanged(int)
{
if ( m_docclasses.contains( comboclasses->currentText() ) ) {
changeSectioning(m_docclasses[comboclasses->currentText()]);
}
}
void ConfigStructure::comboboxChanged(const TQString &name)
{
if ( m_docclasses.contains(name) ) {
showSectioning(m_docclasses[name]);
remove->setEnabled( name != "latex" );
}
}
void ConfigStructure::changeSectioning(const TQStringList *list)
{
for (uint i=0; i<list->count(); ++i) {
TQString label = ( i < (uint)m_structurelevel->value() ) ? "open" : "close";
m_sectioningtable->setText(i,2,label);
}
}
void ConfigStructure::showSectioning(const TQStringList *list)
{
TQString label1,label2,label3;
for (uint i=0; i<5; ++i) {
if ( i < list->count() ) {
label1 = TQString("%1").arg(i+1);
label2 = (*list)[i];
label3 = ( i < (uint)m_structurelevel->value() ) ? "open" : "close";
} else {
label1 = label2 = label3 = TQString();
}
KileCenteredTableItem *item1 = new KileCenteredTableItem(m_sectioningtable,
TQTableItem::Never,label1);
m_sectioningtable->setItem( i,0,item1 );
m_sectioningtable->setText( i,1,label2 );
KileCenteredTableItem *item3 = new KileCenteredTableItem(m_sectioningtable,
TQTableItem::Never,label3);
m_sectioningtable->setItem( i,2,item3 );
}
}
void ConfigStructure::clickedAdd()
{
}
//////////////////// read/write configuration ////////////////////
void ConfigStructure::readConfig(TDEConfig *config)
{
// config section
config->setGroup( "Structure Entries" );
for ( uint i=0; i<m_entries.count(); ++i ) {
int defaultvalue = ( m_entries[i] == i18n( "Sectioning" ) ) ? KileStructure::Visible | KileStructure::Opened
: KileStructure::Visible;
int num = config->readNumEntry(m_entries[i],defaultvalue);
m_visible[i]->setChecked( (num & KileStructure::Visible) ? true : false );
if ( num & KileStructure::Opened ) {
m_defaultopen[i]->setChecked(true);
m_defaultopen[i]->setText("open");
}
}
config->setGroup( "Structure Sectioning" );
TQStringList classlist = config->readListEntry("classes");
classlist.sort();
for ( uint i=0; i<classlist.count(); ++i ) {
TQStringList list = config->readListEntry(classlist[i]);
if ( list.count() > 0 ) {
comboclasses->insertItem(classlist[i]);
TQStringList *sectioningcommands = new TQStringList(list);
m_docclasses[classlist[i]] = sectioningcommands;
}
}
m_structurelevel->setValue(config->readNumEntry("DefaultLevel",3));
}
void ConfigStructure::writeConfig(TDEConfig *config)
{
// config section
config->setGroup( "Structure Entries" );
for ( uint i=0; i<m_entries.count(); ++i ) {
int num = ( m_visible[i]->isChecked() ) ? KileStructure::Visible : KileStructure::None;
if ( m_defaultopen[i]->isChecked() )
num += KileStructure::Opened;
config->writeEntry(m_entries[i],num);
}
config->setGroup( "Structure Sectioning" );
TQStringList classlist;
for ( int i=0; i<comboclasses->count(); ++i ) {
TQString entry = comboclasses->text(i);
if ( entry != "latex" ) {
classlist << entry;
TQString entrylist = m_docclasses[entry]->join(",");
config->writeEntry( entry, entrylist );
}
}
config->writeEntry( "classes", classlist );
config->writeEntry("DefaultLevel",m_structurelevel->value());
}
}
#include "configstructure.moc"