kate Library API Documentation

kateschema.cpp

00001 /* This file is part of the KDE libraries
00002    Copyright (C) 2001-2003 Christoph Cullmann <cullmann@kde.org>
00003    Copyright (C) 2002, 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License version 2 as published by the Free Software Foundation.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017    Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #include "kateschema.h"
00021 #include "kateschema.moc"
00022 
00023 #include "kateconfig.h"
00024 #include "katefactory.h"
00025 #include "kateview.h"
00026 #include "katerenderer.h"
00027 
00028 #include <klocale.h>
00029 #include <kdialog.h>
00030 #include <kcolorbutton.h>
00031 #include <kcombobox.h>
00032 #include <kinputdialog.h>
00033 #include <kfontdialog.h>
00034 #include <kdebug.h>
00035 #include <kiconloader.h>
00036 #include <kmessagebox.h>
00037 #include <kpopupmenu.h>
00038 #include <kcolordialog.h>
00039 #include <kapplication.h>
00040 #include <kaboutdata.h>
00041 
00042 #include <qbuttongroup.h>
00043 #include <qcheckbox.h>
00044 #include <qptrcollection.h>
00045 #include <qdialog.h>
00046 #include <qgrid.h>
00047 #include <qgroupbox.h>
00048 #include <qlabel.h>
00049 #include <qtextcodec.h>
00050 #include <qlayout.h>
00051 #include <qlineedit.h>
00052 #include <qheader.h>
00053 #include <qlistbox.h>
00054 #include <qhbox.h>
00055 #include <qpainter.h>
00056 #include <qobjectlist.h>
00057 #include <qpushbutton.h>
00058 #include <qradiobutton.h>
00059 #include <qspinbox.h>
00060 #include <qstringlist.h>
00061 #include <qtabwidget.h>
00062 #include <qvbox.h>
00063 #include <qvgroupbox.h>
00064 #include <qwhatsthis.h>
00065 
00066 /*
00067     QListViewItem subclass to display/edit a style, bold/italic is check boxes,
00068     normal and selected colors are boxes, which will display a color chooser when
00069     activated.
00070     The context name for the style will be drawn using the editor default font and
00071     the chosen colors.
00072     This widget id designed to handle the default as well as the individual hl style
00073     lists.
00074     This widget is designed to work with the KateStyleListView class exclusively.
00075     Added by anders, jan 23 2002.
00076 */
00077 class KateStyleListItem : public QListViewItem
00078 {
00079   public:
00080     KateStyleListItem( QListView *parent=0, const QString & stylename=0,
00081                    class KateAttribute* defaultstyle=0, class ItemData *data=0 );
00082     ~KateStyleListItem() { if (st) delete is; };
00083 
00084     /* mainly for readability */
00085     enum Property { ContextName, Bold, Italic, Underline, Strikeout, Color, SelColor, BgColor, SelBgColor, UseDefStyle };
00086 
00087     /* updates the hldata's style */
00088     void updateStyle();
00089     /* reimp */
00090     virtual int width ( const QFontMetrics & fm, const QListView * lv, int c ) const;
00091     /* calls changeProperty() if it makes sense considering pos. */
00092     void activate( int column, const QPoint &localPos );
00093     /* For bool fields, toggles them, for color fields, display a color chooser */
00094     void changeProperty( Property p );
00095     /* style context name */
00096     QString contextName() { return text(0); };
00097     /* only true for a hl mode item using it's default style */
00098     bool defStyle();
00099     /* true for default styles */
00100     bool isDefault();
00101     /* whichever style is active (st for hl mode styles not using
00102        the default style, ds otherwise) */
00103     class KateAttribute* style() { return is; };
00104   
00105   protected:
00106     /* reimp */
00107     void paintCell(QPainter *p, const QColorGroup& cg, int col, int width, int align);
00108   
00109   private:
00110     /* private methods to change properties */
00111     void toggleDefStyle();
00112     void setColor( int );
00113     /* helper function to copy the default style into the ItemData,
00114        when a property is changed and we are using default style. */
00115     void setCustStyle();
00116 
00117     class KateAttribute *is, // the style currently in use
00118               *ds;           // default style for hl mode contexts and default styles
00119     class ItemData *st;      // itemdata for hl mode contexts
00120 };
00121 
00122 QString KateSchemaManager::normalSchema ()
00123 {
00124   return KApplication::kApplication()->aboutData()->appName () + QString (" - Normal");
00125 }
00126 
00127 QString KateSchemaManager::printingSchema ()
00128 {
00129   return KApplication::kApplication()->aboutData()->appName () + QString (" - Printing");
00130 }
00131 
00132 KateSchemaManager::KateSchemaManager ()
00133   : m_config ("kateschemarc", false, false)
00134 {
00135   update ();
00136 }
00137 
00138 KateSchemaManager::~KateSchemaManager ()
00139 {
00140 }
00141 
00142 //
00143 // read the types from config file and update the internal list
00144 //
00145 void KateSchemaManager::update (bool readfromfile)
00146 {
00147   if (readfromfile)
00148     m_config.reparseConfiguration ();
00149 
00150   m_schemas = m_config.groupList();
00151   m_schemas.sort ();
00152 
00153   m_schemas.remove (printingSchema());
00154   m_schemas.remove (normalSchema());
00155   m_schemas.prepend (printingSchema());
00156   m_schemas.prepend (normalSchema());
00157 }
00158 
00159 //
00160 // get the right group
00161 // special handling of the default schemas ;)
00162 //
00163 KConfig *KateSchemaManager::schema (uint number)
00164 {
00165   if ((number>1) && (number < m_schemas.count()))
00166     m_config.setGroup (m_schemas[number]);
00167   else if (number == 1)
00168     m_config.setGroup (printingSchema());
00169   else
00170     m_config.setGroup (normalSchema());
00171 
00172   return &m_config;
00173 }
00174 
00175 void KateSchemaManager::addSchema (const QString &t)
00176 {
00177   m_config.setGroup (t);
00178   m_config.writeEntry("Color Background", KGlobalSettings::baseColor());
00179 
00180   update (false);
00181 }
00182 
00183 void KateSchemaManager::removeSchema (uint number)
00184 {
00185   if (number >= m_schemas.count())
00186     return;
00187 
00188   if (number < 2)
00189     return;
00190 
00191   m_config.deleteGroup (name (number));
00192 
00193   update (false);
00194 }
00195 
00196 bool KateSchemaManager::validSchema (uint number)
00197 {
00198   if (number < m_schemas.count())
00199     return true;
00200 
00201   return false;
00202 }
00203 
00204 uint KateSchemaManager::number (const QString &name)
00205 {
00206   if (name == normalSchema())
00207     return 0;
00208 
00209   if (name == printingSchema())
00210     return 1;
00211 
00212   int i;
00213   if ((i = m_schemas.findIndex(name)) > -1)
00214     return i;
00215 
00216   return 0;
00217 }
00218 
00219 QString KateSchemaManager::name (uint number)
00220 {
00221   if ((number>1) && (number < m_schemas.count()))
00222     return m_schemas[number];
00223   else if (number == 1)
00224     return printingSchema();
00225 
00226   return normalSchema();
00227 }
00228 
00229 //
00230 //
00231 //
00232 // DIALOGS !!!
00233 //
00234 //
00235 
00236 //BEGIN KateSchemaConfigColorTab
00237 KateSchemaConfigColorTab::KateSchemaConfigColorTab( QWidget *parent, const char * )
00238   : QWidget (parent)
00239 {
00240   QHBox *b;
00241   QLabel *label;
00242 
00243   QVBoxLayout *blay=new QVBoxLayout(this, 0, KDialog::spacingHint());
00244 
00245   QVGroupBox *gbTextArea = new QVGroupBox(i18n("Text Area Background"), this);
00246 
00247   b = new QHBox (gbTextArea);
00248   label = new QLabel( i18n("Normal text:"), b);
00249   label->setAlignment( AlignLeft|AlignVCenter);
00250   m_back = new KColorButton(b);
00251   connect( m_back, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00252 
00253   b = new QHBox (gbTextArea);
00254   label = new QLabel( i18n("Selected text:"), b);
00255   label->setAlignment( AlignLeft|AlignVCenter);
00256   m_selected = new KColorButton(b);
00257   connect( m_selected, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00258 
00259   b = new QHBox (gbTextArea);
00260   label = new QLabel( i18n("Current line:"), b);
00261   label->setAlignment( AlignLeft|AlignVCenter);
00262   m_current = new KColorButton(b);
00263   connect( m_current, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00264 
00265   blay->addWidget(gbTextArea);
00266 
00267   QVGroupBox *gbBorder = new QVGroupBox(i18n("Additional Elements"), this);
00268 
00269   b = new QHBox (gbBorder);
00270   label = new QLabel( i18n("Left border background:"), b);
00271   label->setAlignment( AlignLeft|AlignVCenter);
00272   m_iconborder = new KColorButton(b);
00273   connect( m_iconborder, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00274 
00275   b = new QHBox (gbBorder);
00276   label = new QLabel( i18n("Bracket highlight:"), b);
00277   label->setAlignment( AlignLeft|AlignVCenter);
00278   m_bracket = new KColorButton(b);
00279   connect( m_bracket, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00280 
00281   b = new QHBox (gbBorder);
00282   label = new QLabel( i18n("Word wrap markers:"), b);
00283   label->setAlignment( AlignLeft|AlignVCenter);
00284   m_wwmarker = new KColorButton(b);
00285   connect( m_wwmarker, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00286 
00287   b = new QHBox (gbBorder);
00288   label = new QLabel( i18n("Tab markers:"), b);
00289   label->setAlignment( AlignLeft|AlignVCenter);
00290   m_tmarker = new KColorButton(b);
00291   connect( m_tmarker, SIGNAL( changed( const QColor & ) ), parent->parentWidget(), SLOT( slotChanged() ) );
00292 
00293   blay->addWidget(gbBorder);
00294 
00295   blay->addStretch();
00296 
00297   // QWhatsThis help
00298   QWhatsThis::add(m_back, i18n("<p>Sets the background color of the editing area.</p>"));
00299   QWhatsThis::add(m_selected, i18n("<p>Sets the background color of the selection.</p>"
00300         "<p>To set the text color for selected text, use the \"<b>Configure "
00301         "Highlighting</b>\" dialog.</p>"));
00302   QWhatsThis::add(m_current, i18n("<p>Sets the background color of the currently "
00303         "active line, which means the line where your cursor is positioned.</p>"));
00304   QWhatsThis::add(m_bracket, i18n("<p>Sets the bracket matching color. This means, "
00305         "if you place the cursor e.g. at a <b>(</b>, the matching <b>)</b> will "
00306         "be highlighted with this color.</p>"));
00307   QWhatsThis::add(m_wwmarker, i18n(
00308         "<p>Sets the color of Word Wrap-related markers:</p>"
00309         "<dl><dt>Static Word Wrap</dt><dd>A vertical line which shows the column where "
00310         "text is going to be wrapped</dd>"
00311         "<dt>Dynamic Word Wrap</dt><dd>An arrow shown to the left of "
00312         "visually-wrapped lines</dd></dl>"));
00313   QWhatsThis::add(m_tmarker, i18n(
00314         "<p>Sets the color of the tabulator marks:</p>"));
00315 }
00316 
00317 KateSchemaConfigColorTab::~KateSchemaConfigColorTab()
00318 {
00319 }
00320 
00321 void KateSchemaConfigColorTab::readConfig (KConfig *config)
00322 {
00323   QColor tmp0 (KGlobalSettings::baseColor());
00324   QColor tmp1 (KGlobalSettings::highlightColor());
00325   QColor tmp2 (KGlobalSettings::alternateBackgroundColor());
00326   QColor tmp3 ( "#FFFF99" );
00327   QColor tmp4 (tmp2.dark());
00328   QColor tmp5 ( KGlobalSettings::textColor() );
00329   QColor tmp6 ( "#EAE9E8" );
00330 
00331   m_back->setColor(config->readColorEntry("Color Background", &tmp0));
00332   m_selected->setColor(config->readColorEntry("Color Selection", &tmp1));
00333   m_current->setColor(config->readColorEntry("Color Highlighted Line", &tmp2));
00334   m_bracket->setColor(config->readColorEntry("Color Highlighted Bracket", &tmp3));
00335   m_wwmarker->setColor(config->readColorEntry("Color Word Wrap Marker", &tmp4));
00336   m_tmarker->setColor(config->readColorEntry("Color Tab Marker", &tmp5));
00337   m_iconborder->setColor(config->readColorEntry("Color Icon Bar", &tmp6));
00338 }
00339 
00340 void KateSchemaConfigColorTab::writeConfig (KConfig *config)
00341 {
00342   config->writeEntry("Color Background", m_back->color());
00343   config->writeEntry("Color Selection", m_selected->color());
00344   config->writeEntry("Color Highlighted Line", m_current->color());
00345   config->writeEntry("Color Highlighted Bracket", m_bracket->color());
00346   config->writeEntry("Color Word Wrap Marker", m_wwmarker->color());
00347   config->writeEntry("Color Tab Marker", m_tmarker->color());
00348   config->writeEntry("Color Icon Bar", m_iconborder->color());
00349 }
00350 
00351 //END KateSchemaConfigColorTab
00352 
00353 //BEGIN FontConfig
00354 KateSchemaConfigFontTab::KateSchemaConfigFontTab( QWidget *parent, const char * )
00355   : QWidget (parent)
00356 {
00357     // sizemanagment
00358   QGridLayout *grid = new QGridLayout( this, 1, 1 );
00359 
00360   m_fontchooser = new KFontChooser ( this, 0L, false, QStringList(), false );
00361   m_fontchooser->enableColumn(KFontChooser::StyleList, false);
00362   grid->addWidget( m_fontchooser, 0, 0);
00363 
00364   connect (m_fontchooser, SIGNAL (fontSelected( const QFont & )), this, SLOT (slotFontSelected( const QFont & )));
00365   connect (m_fontchooser, SIGNAL (fontSelected( const QFont & )), parent->parentWidget(), SLOT (slotChanged()));
00366 }
00367 
00368 KateSchemaConfigFontTab::~KateSchemaConfigFontTab()
00369 {
00370 }
00371 
00372 void KateSchemaConfigFontTab::slotFontSelected( const QFont &font )
00373 {
00374   myFont = font;
00375 }
00376 
00377 void KateSchemaConfigFontTab::readConfig (KConfig *config)
00378 {
00379   QFont f (KGlobalSettings::fixedFont());
00380 
00381   m_fontchooser->setFont (config->readFontEntry("Font", &f));
00382 }
00383 
00384 void KateSchemaConfigFontTab::writeConfig (KConfig *config)
00385 {
00386   config->writeEntry("Font", myFont);
00387 }
00388 
00389 //END FontConfig
00390 
00391 //BEGIN FontColorConfig
00392 KateSchemaConfigFontColorTab::KateSchemaConfigFontColorTab( QWidget *parent, const char * )
00393   : QWidget (parent)
00394 {
00395   m_defaultStyleLists.setAutoDelete(true);
00396 
00397   // sizemanagment
00398   QGridLayout *grid = new QGridLayout( this, 1, 1 );
00399 
00400   m_defaultStyles = new KateStyleListView( this, false );
00401   grid->addWidget( m_defaultStyles, 0, 0);
00402 
00403   connect (m_defaultStyles, SIGNAL (changed()), parent->parentWidget(), SLOT (slotChanged()));
00404 }
00405 
00406 KateSchemaConfigFontColorTab::~KateSchemaConfigFontColorTab()
00407 {
00408 }
00409 
00410 KateAttributeList *KateSchemaConfigFontColorTab::attributeList (uint schema)
00411 {
00412   if (!m_defaultStyleLists[schema])
00413   {
00414     KateAttributeList *list = new KateAttributeList ();
00415     HlManager::self()->getDefaults(schema, *list);
00416 
00417     m_defaultStyleLists.insert (schema, list);
00418   }
00419 
00420   return m_defaultStyleLists[schema];
00421 }
00422 
00423 void KateSchemaConfigFontColorTab::schemaChanged (uint schema)
00424 {
00425   m_defaultStyles->clear ();
00426 
00427   KateAttributeList *l = attributeList (schema);
00428 
00429   for ( uint i = 0; i < HlManager::self()->defaultStyles(); i++ )
00430   {
00431     m_defaultStyles->insertItem( new KateStyleListItem( m_defaultStyles, HlManager::self()->defaultStyleName(i),
00432                               l->at( i ) ) );
00433   }
00434 }
00435 
00436 void KateSchemaConfigFontColorTab::reload ()
00437 {
00438   m_defaultStyles->clear ();
00439   m_defaultStyleLists.clear ();
00440 }
00441 
00442 void KateSchemaConfigFontColorTab::apply ()
00443 {
00444   for ( QIntDictIterator<KateAttributeList> it( m_defaultStyleLists ); it.current(); ++it )
00445     HlManager::self()->setDefaults(it.currentKey(), *(it.current()));
00446 }
00447 
00448 //END FontColorConfig
00449 
00450 //BEGIN FontColorConfig
00451 KateSchemaConfigHighlightTab::KateSchemaConfigHighlightTab( QWidget *parent, const char *, KateSchemaConfigFontColorTab *page )
00452   : QWidget (parent)
00453 {
00454   m_defaults = page;
00455 
00456   m_schema = 0;
00457   m_hl = 0;
00458 
00459   m_hlDict.setAutoDelete (true);
00460 
00461   QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
00462 
00463   // hl chooser
00464   QHBox *hbHl = new QHBox( this );
00465   layout->add (hbHl);
00466 
00467   hbHl->setSpacing( KDialog::spacingHint() );
00468   QLabel *lHl = new QLabel( i18n("H&ighlight:"), hbHl );
00469   hlCombo = new QComboBox( false, hbHl );
00470   lHl->setBuddy( hlCombo );
00471   connect( hlCombo, SIGNAL(activated(int)),
00472            this, SLOT(hlChanged(int)) );
00473 
00474   for( int i = 0; i < HlManager::self()->highlights(); i++) {
00475     if (HlManager::self()->hlSection(i).length() > 0)
00476       hlCombo->insertItem(HlManager::self()->hlSection(i) + QString ("/") + HlManager::self()->hlName(i));
00477     else
00478       hlCombo->insertItem(HlManager::self()->hlName(i));
00479   }
00480   hlCombo->setCurrentItem(0);
00481 
00482   // styles listview
00483   m_styles = new KateStyleListView( this, true );
00484   layout->addWidget (m_styles, 999);
00485 
00486   hlCombo->setCurrentItem ( 0 );
00487   hlChanged ( 0 );
00488 
00489   QWhatsThis::add( m_styles,  i18n("This list displays the contexts of the current syntax highlight mode and offers the means to edit them. The context name reflects the current style settings.<p>To edit using the keyboard, press <strong>&lt;SPACE&gt;</strong> and choose a property from the popup menu.<p>To edit the colors, click the colored squares, or select the color to edit from the popup menu.") );
00490 
00491   connect (m_styles, SIGNAL (changed()), parent->parentWidget(), SLOT (slotChanged()));
00492 }
00493 
00494 KateSchemaConfigHighlightTab::~KateSchemaConfigHighlightTab()
00495 {
00496 }
00497 
00498 void KateSchemaConfigHighlightTab::hlChanged(int z)
00499 {
00500   m_hl = z;
00501 
00502   schemaChanged (m_schema);
00503 }
00504 
00505 void KateSchemaConfigHighlightTab::schemaChanged (uint schema)
00506 {
00507   m_schema = schema;
00508 
00509   kdDebug () << "NEW SCHEMA: " << m_schema << " NEW HL: " << m_hl << endl;
00510 
00511   m_styles->clear ();
00512 
00513   if (!m_hlDict[m_schema])
00514   {
00515     kdDebug () << "NEW SCHEMA, create dict" << endl;
00516 
00517     m_hlDict.insert (schema, new QIntDict<ItemDataList>);
00518     m_hlDict[m_schema]->setAutoDelete (true);
00519   }
00520 
00521   if (!m_hlDict[m_schema]->find(m_hl))
00522   {
00523     kdDebug () << "NEW HL, create list" << endl;
00524 
00525     ItemDataList *list = new ItemDataList ();
00526     HlManager::self()->getHl( m_hl )->getItemDataListCopy (m_schema, *list);
00527     m_hlDict[m_schema]->insert (m_hl, list);
00528   }
00529 
00530   KateAttributeList *l = m_defaults->attributeList (schema);
00531 
00532   for ( ItemData *itemData = m_hlDict[m_schema]->find(m_hl)->first();
00533         itemData != 0L;
00534         itemData = m_hlDict[m_schema]->find(m_hl)->next())
00535   {
00536     kdDebug () << "insert items " << itemData->name << endl;
00537 
00538     m_styles->insertItem( new KateStyleListItem( m_styles, itemData->name,
00539                           l->at(itemData->defStyleNum), itemData ) );
00540 
00541   }
00542 }
00543 
00544 void KateSchemaConfigHighlightTab::reload ()
00545 {
00546   m_styles->clear ();
00547   m_hlDict.clear ();
00548 
00549   hlChanged (0);
00550 }
00551 
00552 void KateSchemaConfigHighlightTab::apply ()
00553 {
00554   for ( QIntDictIterator< QIntDict<ItemDataList> > it( m_hlDict ); it.current(); ++it )
00555     for ( QIntDictIterator< ItemDataList > it2( *it.current() ); it2.current(); ++it2 )
00556        HlManager::self()->getHl( it2.currentKey() )->setItemDataList (it.currentKey(), *(it2.current()));
00557 }
00558 
00559 //END HighlightConfig
00560 
00561 KateSchemaConfigPage::KateSchemaConfigPage( QWidget *parent )
00562   : KateConfigPage( parent ),
00563     m_lastSchema (-1)
00564 {
00565   QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
00566 
00567   QHBox *hbHl = new QHBox( this );
00568   layout->add (hbHl);
00569   hbHl->setSpacing( KDialog::spacingHint() );
00570   QLabel *lHl = new QLabel( i18n("&Schema:"), hbHl );
00571   schemaCombo = new QComboBox( false, hbHl );
00572   lHl->setBuddy( schemaCombo );
00573   connect( schemaCombo, SIGNAL(activated(int)),
00574            this, SLOT(schemaChanged(int)) );
00575 
00576   btndel = new QPushButton( i18n("&Delete"), hbHl );
00577   connect( btndel, SIGNAL(clicked()), this, SLOT(deleteSchema()) );
00578 
00579   QPushButton *btnnew = new QPushButton( i18n("&New..."), hbHl );
00580   connect( btnnew, SIGNAL(clicked()), this, SLOT(newSchema()) );
00581 
00582   m_tabWidget = new QTabWidget ( this );
00583   m_tabWidget->setMargin (KDialog::marginHint());
00584   layout->add (m_tabWidget);
00585 
00586   connect (m_tabWidget, SIGNAL (currentChanged (QWidget *)), this, SLOT (newCurrentPage (QWidget *)));
00587 
00588   m_colorTab = new KateSchemaConfigColorTab (m_tabWidget);
00589   m_tabWidget->addTab (m_colorTab, i18n("Colors"));
00590 
00591   m_fontTab = new KateSchemaConfigFontTab (m_tabWidget);
00592   m_tabWidget->addTab (m_fontTab, i18n("Font"));
00593 
00594   m_fontColorTab = new KateSchemaConfigFontColorTab (m_tabWidget);
00595   m_tabWidget->addTab (m_fontColorTab, i18n("Normal Text Styles"));
00596 
00597   m_highlightTab = new KateSchemaConfigHighlightTab (m_tabWidget, "", m_fontColorTab);
00598   m_tabWidget->addTab (m_highlightTab, i18n("Highlighting Text Styles"));
00599 
00600   hbHl = new QHBox( this );
00601   layout->add (hbHl);
00602   hbHl->setSpacing( KDialog::spacingHint() );
00603   lHl = new QLabel( i18n("&Default schema for %1:").arg(KApplication::kApplication()->aboutData()->programName ()), hbHl );
00604   defaultSchemaCombo = new QComboBox( false, hbHl );
00605   lHl->setBuddy( defaultSchemaCombo );
00606   
00607   reload();
00608   
00609   connect( defaultSchemaCombo, SIGNAL(activated(int)),
00610            this, SLOT(slotChanged()) );
00611 }
00612 
00613 KateSchemaConfigPage::~KateSchemaConfigPage ()
00614 {
00615   // just reload config from disc
00616   KateFactory::self()->schemaManager()->update ();
00617 }
00618 
00619 void KateSchemaConfigPage::apply()
00620 {
00621   if (m_lastSchema > -1)
00622   {
00623     m_colorTab->writeConfig (KateFactory::self()->schemaManager()->schema(m_lastSchema));
00624     m_fontTab->writeConfig (KateFactory::self()->schemaManager()->schema(m_lastSchema));
00625   }
00626 
00627   // just sync the config
00628   KateFactory::self()->schemaManager()->schema (0)->sync();
00629   KateFactory::self()->schemaManager()->update ();
00630 
00631   KateRendererConfig::global()->setSchema (defaultSchemaCombo->currentItem());
00632 
00633   // special for the highlighting stuff
00634   m_fontColorTab->apply ();
00635   m_highlightTab->apply ();
00636 
00637   // sync the hl config for real
00638   HlManager::self()->getKConfig()->sync ();
00639 }
00640 
00641 void KateSchemaConfigPage::reload()
00642 {
00643   // just reload the config from disc
00644   KateFactory::self()->schemaManager()->update ();
00645 
00646   // special for the highlighting stuff
00647   m_fontColorTab->reload ();
00648 
00649   update ();
00650 
00651   defaultSchemaCombo->setCurrentItem (KateRendererConfig::global()->schema());
00652 }
00653 
00654 void KateSchemaConfigPage::reset()
00655 {
00656   reload ();
00657 }
00658 
00659 void KateSchemaConfigPage::defaults()
00660 {
00661   reload ();
00662 }
00663 
00664 void KateSchemaConfigPage::update ()
00665 {
00666   // soft update, no load from disk
00667   KateFactory::self()->schemaManager()->update (false);
00668 
00669   schemaCombo->clear ();
00670   schemaCombo->insertStringList (KateFactory::self()->schemaManager()->list ());
00671 
00672   defaultSchemaCombo->clear ();
00673   defaultSchemaCombo->insertStringList (KateFactory::self()->schemaManager()->list ());
00674 
00675   schemaCombo->setCurrentItem (0);
00676   schemaChanged (0);
00677 
00678   schemaCombo->setEnabled (schemaCombo->count() > 0);
00679 }
00680 
00681 void KateSchemaConfigPage::deleteSchema ()
00682 {
00683   int t = schemaCombo->currentItem ();
00684 
00685   KateFactory::self()->schemaManager()->removeSchema (t);
00686 
00687   update ();
00688 }
00689 
00690 void KateSchemaConfigPage::newSchema ()
00691 {
00692   QString t = KInputDialog::getText (i18n("Name for New Schema"), i18n ("Name:"), i18n("New Schema"), 0, this);
00693 
00694   KateFactory::self()->schemaManager()->addSchema (t);
00695 
00696   // soft update, no load from disk
00697   KateFactory::self()->schemaManager()->update (false);
00698   int i = KateFactory::self()->schemaManager()->list ().findIndex (t);
00699 
00700   update ();
00701   if (i > -1)
00702   {
00703     schemaCombo->setCurrentItem (i);
00704     schemaChanged (i);
00705   }
00706 }
00707 
00708 void KateSchemaConfigPage::schemaChanged (int schema)
00709 {
00710   if (schema < 2)
00711   {
00712     btndel->setEnabled (false);
00713   }
00714   else
00715   {
00716     btndel->setEnabled (true);
00717   }
00718 
00719   if (m_lastSchema > -1)
00720   {
00721     m_colorTab->writeConfig (KateFactory::self()->schemaManager()->schema(m_lastSchema));
00722     m_fontTab->writeConfig (KateFactory::self()->schemaManager()->schema(m_lastSchema));
00723   }
00724 
00725   m_colorTab->readConfig (KateFactory::self()->schemaManager()->schema(schema));
00726   m_fontTab->readConfig (KateFactory::self()->schemaManager()->schema(schema));
00727   m_fontColorTab->schemaChanged (schema);
00728   m_highlightTab->schemaChanged (schema);
00729 
00730   m_lastSchema = schema;
00731 }
00732 
00733 void KateSchemaConfigPage::newCurrentPage (QWidget *w)
00734 {
00735   if (w == m_highlightTab)
00736     m_highlightTab->schemaChanged (m_lastSchema);
00737 }
00738 
00739 // BEGIN SCHEMA ACTION
00740 void KateViewSchemaAction::init()
00741 {
00742   m_view = 0;
00743   last = 0;
00744 
00745   connect(popupMenu(),SIGNAL(aboutToShow()),this,SLOT(slotAboutToShow()));
00746 }
00747 
00748 void KateViewSchemaAction::updateMenu (KateView *view)
00749 {
00750   m_view = view;
00751 }
00752 
00753 void KateViewSchemaAction::slotAboutToShow()
00754 {
00755   KateView *view=m_view;
00756   int count = KateFactory::self()->schemaManager()->list().count();
00757 
00758   for (int z=0; z<count; z++)
00759   {
00760     QString hlName = KateFactory::self()->schemaManager()->list().operator[](z);
00761 
00762     if (names.contains(hlName) < 1)
00763     {
00764       names << hlName;
00765       popupMenu()->insertItem ( hlName, this, SLOT(setSchema(int)), 0,  z+1);
00766     }
00767   }
00768 
00769   if (!view) return;
00770 
00771   popupMenu()->setItemChecked (last, false);
00772   popupMenu()->setItemChecked (view->renderer()->config()->schema()+1, true);
00773 
00774   last = view->renderer()->config()->schema()+1;
00775 }
00776 
00777 void KateViewSchemaAction::setSchema (int mode)
00778 {
00779   KateView *view=m_view;
00780 
00781   if (view)
00782     view->renderer()->config()->setSchema (mode-1);
00783 }
00784 // END SCHEMA ACTION
00785 
00786 //BEGIN KateStyleListView
00787 KateStyleListView::KateStyleListView( QWidget *parent, bool showUseDefaults )
00788     : QListView( parent )
00789 {
00790   addColumn( i18n("Context") );
00791   addColumn( SmallIconSet("text_bold"), QString::null/*i18n("Bold")*/ );
00792   addColumn( SmallIconSet("text_italic"), QString::null/*i18n("Italic")*/ );
00793   addColumn( SmallIconSet("text_under"), QString::null );
00794   addColumn( SmallIconSet("text_strike"), QString::null );
00795   addColumn( i18n("Normal") );
00796   addColumn( i18n("Selected") );
00797   addColumn( i18n("Background") );
00798   addColumn( i18n("Background Selected") );
00799   if ( showUseDefaults )
00800     addColumn( i18n("Use Default Style") );
00801   connect( this, SIGNAL(mouseButtonPressed(int, QListViewItem*, const QPoint&, int)),
00802            this, SLOT(slotMousePressed(int, QListViewItem*, const QPoint&, int)) );
00803   connect( this, SIGNAL(spacePressed(QListViewItem*)),
00804            this, SLOT(showPopupMenu(QListViewItem*)) );
00805   // grap the bg color, selected color and default font
00806   normalcol = KGlobalSettings::textColor();
00807   bgcol = *KateRendererConfig::global()->backgroundColor();
00808   selcol = *KateRendererConfig::global()->selectionColor();
00809   docfont = *KateRendererConfig::global()->font();
00810 
00811   viewport()->setPaletteBackgroundColor( bgcol );
00812 }
00813 
00814 void KateStyleListView::showPopupMenu( KateStyleListItem *i, const QPoint &globalPos, bool showtitle )
00815 {
00816   KPopupMenu m( this );
00817   KateAttribute *is = i->style();
00818   int id;
00819   // the title is used, because the menu obscures the context name when
00820   // displayed on behalf of spacePressed().
00821   QPixmap cl(16,16);
00822   cl.fill( i->style()->textColor() );
00823   QPixmap scl(16,16);
00824   scl.fill( i->style()->selectedTextColor() );
00825   if ( showtitle )
00826     m.insertTitle( i->contextName(), KateStyleListItem::ContextName );
00827   id = m.insertItem( i18n("&Bold"), this, SLOT(mSlotPopupHandler(int)), 0, KateStyleListItem::Bold );
00828   m.setItemChecked( id, is->bold() );
00829   id = m.insertItem( i18n("&Italic"), this, SLOT(mSlotPopupHandler(int)), 0, KateStyleListItem::Italic );
00830   m.setItemChecked( id, is->italic() );
00831   m.insertItem( QIconSet(cl), i18n("Normal &Color..."), this, SLOT(mSlotPopupHandler(int)), 0, KateStyleListItem::Color );
00832   m.insertItem( QIconSet(scl), i18n("&Selected Color..."), this, SLOT(mSlotPopupHandler(int)), 0, KateStyleListItem::SelColor );
00833   if ( ! i->isDefault() ) {
00834     id = m.insertItem( i18n("Use &Default Style"), this, SLOT(mSlotPopupHandler(int)), 0, KateStyleListItem::UseDefStyle );
00835     m.setItemChecked( id, i->defStyle() );
00836   }
00837   m.exec( globalPos );
00838 }
00839 
00840 void KateStyleListView::showPopupMenu( QListViewItem *i )
00841 {
00842   showPopupMenu( (KateStyleListItem*)i, viewport()->mapToGlobal(itemRect(i).topLeft()), true );
00843 }
00844 
00845 void KateStyleListView::mSlotPopupHandler( int z )
00846 {
00847   ((KateStyleListItem*)currentItem())->changeProperty( (KateStyleListItem::Property)z );
00848 }
00849 
00850 // Because QListViewItem::activatePos() is going to become deprecated,
00851 // and also because this attempt offers more control, I connect mousePressed to this.
00852 void KateStyleListView::slotMousePressed(int btn, QListViewItem* i, const QPoint& pos, int c)
00853 {
00854   if ( i ) {
00855     if ( btn == Qt::RightButton ) {
00856       showPopupMenu( (KateStyleListItem*)i, /*mapToGlobal(*/pos/*)*/ );
00857     }
00858     else if ( btn == Qt::LeftButton && c > 0 ) {
00859       // map pos to item/column and call KateStyleListItem::activate(col, pos)
00860       ((KateStyleListItem*)i)->activate( c, viewport()->mapFromGlobal( pos ) - QPoint( 0, itemRect(i).top() ) );
00861     }
00862   }
00863 }
00864 
00865 //END
00866 
00867 //BEGIN KateStyleListItem
00868 static const int BoxSize = 16;
00869 static const int ColorBtnWidth = 32;
00870 
00871 KateStyleListItem::KateStyleListItem( QListView *parent, const QString & stylename,
00872                               KateAttribute *style, ItemData *data )
00873         : QListViewItem( parent, stylename ),
00874           ds( style ),
00875           st( data )
00876 {
00877   if (!st)
00878     is = ds;
00879   else
00880   {
00881     is = new KateAttribute (*style);
00882 
00883     if (data->isSomethingSet())
00884       *is += *data;
00885   }
00886 }
00887 
00888 void KateStyleListItem::updateStyle()
00889 {
00890   // nothing there, not update it, will crash
00891   if (!st)
00892     return;
00893 
00894   if ( is->itemSet(KateAttribute::Weight) )
00895   {
00896     if ( is->weight() != st->weight())
00897       st->setWeight( is->weight() );
00898   }
00899 
00900   if ( is->itemSet(KateAttribute::Italic) )
00901   {
00902     if ( is->italic() != st->italic())
00903       st->setItalic( is->italic() );
00904   }
00905 
00906   if ( is->itemSet(KateAttribute::StrikeOut) )
00907   {
00908     if ( is->strikeOut() != st->strikeOut())
00909 
00910       st->setStrikeOut( is->strikeOut() );
00911   }
00912 
00913   if ( is->itemSet(KateAttribute::Underline) )
00914   {
00915     if ( is->underline() != st->underline())
00916       st->setUnderline( is->underline() );
00917   }
00918 
00919   if ( is->itemSet(KateAttribute::Outline) )
00920   {
00921     if ( is->outline() != st->outline())
00922       st->setOutline( is->outline() );
00923   }
00924 
00925   if ( is->itemSet(KateAttribute::TextColor) )
00926   {
00927     if ( is->textColor() != st->textColor())
00928       st->setTextColor( is->textColor() );
00929   }
00930 
00931   if ( is->itemSet(KateAttribute::SelectedTextColor) )
00932   {
00933     if ( is->selectedTextColor() != st->selectedTextColor())
00934       st->setSelectedTextColor( is->selectedTextColor() );
00935   }
00936 
00937   if ( is->itemSet(KateAttribute::BGColor) )
00938   {
00939     if ( is->bgColor() != st->bgColor())
00940       st->setBGColor( is->bgColor() );
00941   }
00942 
00943   if ( is->itemSet(KateAttribute::SelectedBGColor) )
00944   {
00945     if ( is->selectedBGColor() != st->selectedBGColor())
00946       st->setSelectedBGColor( is->selectedBGColor() );
00947   }
00948   //kdDebug()<<"after update: "<<st->itemsSet()<<endl;
00949   //kdDebug()<<"bold: "<<st->bold()<<" ("<<is->bold()<<")"<<endl;
00950 }
00951 
00952 /* only true for a hl mode item using it's default style */
00953 bool KateStyleListItem::defStyle() { return st && st->isSomethingSet(); }
00954 
00955 /* true for default styles */
00956 bool KateStyleListItem::isDefault() { return st ? false : true; }
00957 
00958 int KateStyleListItem::width( const QFontMetrics & /*fm*/, const QListView * lv, int col ) const
00959 {
00960   int m = lv->itemMargin() * 2;
00961   switch ( col ) {
00962     case ContextName:
00963       // FIXME: width for name column should reflect bold/italic
00964       // (relevant for non-fixed fonts only - nessecary?)
00965       return QFontMetrics( ((KateStyleListView*)lv)->docfont).width( text(0) ) + m;
00966     case Bold:
00967     case Italic:
00968     case UseDefStyle:
00969       return BoxSize + m;
00970     case Color:
00971     case SelColor:
00972     case BgColor:
00973     case SelBgColor:
00974       return ColorBtnWidth +m;
00975     default:
00976       return 0;
00977   }
00978 }
00979 
00980 void KateStyleListItem::activate( int column, const QPoint &localPos )
00981 {
00982   QListView *lv = listView();
00983   int x = 0;
00984   for( int c = 0; c < column-1; c++ )
00985     x += lv->columnWidth( c );
00986   int w;
00987   switch( column ) {
00988     case Bold:
00989     case Italic:
00990     case Underline:
00991     case Strikeout:
00992     case UseDefStyle:
00993       w = BoxSize;
00994       break;
00995     case Color:
00996     case SelColor:
00997     case BgColor:
00998     case SelBgColor:
00999       w = ColorBtnWidth;
01000       break;
01001     default:
01002       return;
01003   }
01004   if ( !QRect( x, 0, w, BoxSize ).contains( localPos ) )
01005   changeProperty( (Property)column );
01006 }
01007 
01008 void KateStyleListItem::changeProperty( Property p )
01009 {
01010   if ( p == Bold )
01011     is->setBold( ! is->bold() );
01012   else if ( p == Italic )
01013     is->setItalic( ! is->italic() );
01014   else if ( p == Underline )
01015     is->setUnderline( ! is->underline() );
01016   else if ( p == Strikeout )
01017     is->setStrikeOut( ! is->strikeOut() );
01018   else if ( p == UseDefStyle )
01019     toggleDefStyle();
01020   else
01021     setColor( p );
01022 
01023   updateStyle ();
01024 
01025   ((KateStyleListView*)listView())->emitChanged();
01026 }
01027 
01028 void KateStyleListItem::toggleDefStyle()
01029 {
01030   if ( *is == *ds ) {
01031     KMessageBox::information( listView(),
01032          i18n("\"Use Default Style\" will be automatically unset when you change any style properties."),
01033          i18n("Kate Styles"),
01034          "Kate hl config use defaults" );
01035   }
01036   else {
01037     delete is;
01038     is = new KateAttribute( *ds );
01039     repaint();
01040   }
01041 }
01042 
01043 void KateStyleListItem::setColor( int column )
01044 {
01045   QColor c;
01046   if ( column == Color) c = is->textColor();
01047   else if ( column == SelColor ) c = is->selectedTextColor();
01048   else if ( column == BgColor ) c = is->bgColor();
01049   else if ( column == SelBgColor ) c = is->selectedBGColor();
01050 
01051   if ( KColorDialog::getColor( c, listView() ) != QDialog::Accepted) return;
01052 
01053   if (st && st->isSomethingSet()) setCustStyle();
01054 
01055   if ( column == Color) is->setTextColor( c );
01056   else if ( column == SelColor ) is->setSelectedTextColor( c );
01057   else if ( column == BgColor ) is->setBGColor( c );
01058   else if ( column == SelBgColor ) is->setSelectedBGColor( c );
01059 
01060   repaint();
01061 }
01062 
01063 void KateStyleListItem::setCustStyle()
01064 {
01065 //   is = st;
01066 //   *is += *ds;
01067 //  st->defStyle = 0;
01068 }
01069 
01070 void KateStyleListItem::paintCell( QPainter *p, const QColorGroup& cg, int col, int width, int align )
01071 {
01072 
01073   if ( !p )
01074     return;
01075 
01076   QListView *lv = listView();
01077   if ( !lv )
01078     return;
01079   Q_ASSERT( lv ); //###
01080 
01081   p->fillRect( 0, 0, width, height(), QBrush( ((KateStyleListView*)lv)->bgcol ) );
01082   int marg = lv->itemMargin();
01083 
01084   // use a provate color group and set the text/highlighted text colors
01085   QColorGroup mcg = cg;
01086   QColor c;
01087 
01088   switch ( col )
01089   {
01090     case ContextName:
01091     {
01092       mcg.setColor(QColorGroup::Text, is->textColor());
01093       mcg.setColor(QColorGroup::HighlightedText, is->selectedTextColor());
01094       QFont f ( ((KateStyleListView*)lv)->docfont );
01095       p->setFont( is->font(f) );
01096       // FIXME - repainting when text is cropped, and the column is enlarged is buggy.
01097       // Maybe I need painting the string myself :(
01098       QListViewItem::paintCell( p, mcg, col, width, align );
01099     }
01100     break;
01101     case Bold:
01102     case Italic:
01103     case Underline:
01104     case Strikeout:
01105     case UseDefStyle:
01106     {
01107       // Bold/Italic/use default checkboxes
01108       // code allmost identical to QCheckListItem
01109       // I use the text color of defaultStyles[0], normalcol in parent listview
01110       mcg.setColor( QColorGroup::Text, ((KateStyleListView*)lv)->normalcol );
01111       int x = 0;
01112       if ( align == AlignCenter ) {
01113         QFontMetrics fm( lv->font() );
01114         x = (width - BoxSize - fm.width(text(0)))/2;
01115       }
01116       int y = (height() - BoxSize) / 2;
01117 
01118       if ( isEnabled() )
01119         p->setPen( QPen( mcg.text(), 2 ) );
01120       else
01121         p->setPen( QPen( lv->palette().color( QPalette::Disabled, QColorGroup::Text ), 2 ) );
01122 
01123       if ( isSelected() && lv->header()->mapToSection( 0 ) != 0 )
01124       {
01125         p->fillRect( 0, 0, x + marg + BoxSize + 4, height(),
01126               mcg.brush( QColorGroup::Highlight ) );
01127         if ( isEnabled() )
01128           p->setPen( QPen( mcg.highlightedText(), 2 ) ); // FIXME! - use defaultstyles[0].selecol. luckily not used :)
01129       }
01130       p->drawRect( x+marg, y+2, BoxSize-4, BoxSize-4 );
01131       x++;
01132       y++;
01133       if ( (col == Bold && is->bold()) ||
01134           (col == Italic && is->italic()) ||
01135           (col == Underline && is->underline()) ||
01136           (col == Strikeout && is->strikeOut()) ||
01137           (col == UseDefStyle && *is == *ds ) )
01138       {
01139         QPointArray a( 7*2 );
01140         int i, xx, yy;
01141         xx = x+1+marg;
01142         yy = y+5;
01143         for ( i=0; i<3; i++ ) {
01144           a.setPoint( 2*i,   xx, yy );
01145           a.setPoint( 2*i+1, xx, yy+2 );
01146           xx++; yy++;
01147         }
01148         yy -= 2;
01149         for ( i=3; i<7; i++ ) {
01150           a.setPoint( 2*i,   xx, yy );
01151           a.setPoint( 2*i+1, xx, yy+2 );
01152           xx++; yy--;
01153         }
01154         p->drawLineSegments( a );
01155       }
01156     }
01157     break;
01158     case Color:
01159     case SelColor:
01160     case BgColor:
01161     case SelBgColor:
01162     {
01163       if ( col == Color) c = is->textColor();
01164       else if ( col == SelColor ) c = is->selectedTextColor();
01165       else if ( col == BgColor ) c = is->itemSet(KateAttribute::BGColor) ? is->bgColor() : ((KateStyleListView*)lv)->bgcol;
01166       else if ( col == SelBgColor ) c = is->itemSet(KateAttribute::SelectedBGColor) ? is->selectedBGColor(): ((KateStyleListView*)lv)->bgcol;
01167       // color "buttons"
01168       mcg.setColor( QColorGroup::Text, ((KateStyleListView*)lv)->normalcol );
01169       int x = 0;
01170       int y = (height() - BoxSize) / 2;
01171       if ( isEnabled() )
01172         p->setPen( QPen( mcg.text(), 2 ) );
01173       else
01174         p->setPen( QPen( lv->palette().color( QPalette::Disabled, QColorGroup::Text ), 2 ) );
01175 
01176       p->drawRect( x+marg, y+2, ColorBtnWidth-4, BoxSize-4 );
01177       p->fillRect( x+marg+1,y+3,ColorBtnWidth-7,BoxSize-7,QBrush( c ) );
01178     }
01179     //case default: // no warning...
01180   }
01181 }
01182 //END
01183 
01184 // kate: space-indent on; indent-width 2; replace-tabs on;
KDE Logo
This file is part of the documentation for kate Library Version 3.2.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Feb 4 12:37:42 2004 by doxygen 1.2.18 written by Dimitri van Heesch, © 1997-2003