00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "katedialogs.h"
00020 #include <klocale.h>
00021 #include <kdebug.h>
00022 #include <qgroupbox.h>
00023 #include <qvgroupbox.h>
00024 #include <qhgroupbox.h>
00025 #include <qhbox.h>
00026 #include <qvbox.h>
00027 #include <qlayout.h>
00028 #include <qpushbutton.h>
00029 #include <qwidgetstack.h>
00030 #include <qlabel.h>
00031 #include <qlistview.h>
00032 #include <qlineedit.h>
00033 #include <qcombobox.h>
00034 #include <qcheckbox.h>
00035
00036 #include <kglobal.h>
00037 #include <qmap.h>
00038 #include <kmessagebox.h>
00039 #include <kstddirs.h>
00040
00041
00042
00043
00044
00045
00046 StyleChanger::StyleChanger( QWidget *parent )
00047 : QWidget(parent)
00048 {
00049 QLabel *label;
00050
00051 QGridLayout *glay = new QGridLayout( this, 4, 3, 0, KDialog::spacingHint() );
00052 CHECK_PTR(glay);
00053 glay->addColSpacing( 1, KDialog::spacingHint() );
00054 glay->setColStretch( 2, 10 );
00055
00056 col = new KColorButton(this);
00057 CHECK_PTR(col);
00058 connect(col,SIGNAL(changed(const QColor&)),this,SLOT(changed()));
00059 label = new QLabel(col,i18n("Normal:"),this);
00060 CHECK_PTR(label);
00061 glay->addWidget(label,0,0);
00062 glay->addWidget(col,1,0);
00063
00064 selCol = new KColorButton(this);
00065 CHECK_PTR(selCol);
00066 connect(selCol,SIGNAL(changed(const QColor&)),this,SLOT(changed()));
00067 label = new QLabel(selCol,i18n("Selected:"),this);
00068 CHECK_PTR(label);
00069 glay->addWidget(label,2,0);
00070 glay->addWidget(selCol,3,0);
00071
00072 bold = new QCheckBox(i18n("Bold"),this);
00073 CHECK_PTR(bold);
00074 connect(bold,SIGNAL(clicked()),SLOT(changed()));
00075 glay->addWidget(bold,1,2);
00076
00077 italic = new QCheckBox(i18n("Italic"),this);
00078 CHECK_PTR(italic);
00079 connect(italic,SIGNAL(clicked()),SLOT(changed()));
00080 glay->addWidget(italic,2,2);
00081 }
00082
00083 void StyleChanger::setRef(ItemStyle *s) {
00084
00085 style = s;
00086 col->setColor(style->col);
00087 selCol->setColor(style->selCol);
00088 bold->setChecked(style->bold);
00089 italic->setChecked(style->italic);
00090
00091 }
00092
00093 void StyleChanger::setEnabled(bool enable) {
00094
00095 col->setEnabled(enable);
00096 selCol->setEnabled(enable);
00097 bold->setEnabled(enable);
00098 italic->setEnabled(enable);
00099 }
00100
00101 void StyleChanger::changed() {
00102
00103 if (style) {
00104 style->col = col->color();
00105 style->selCol = selCol->color();
00106 style->bold = bold->isChecked();
00107 style->italic = italic->isChecked();
00108 }
00109 }
00110
00111 HighlightDialog::HighlightDialog( HlManager *hlManager, ItemStyleList *styleList,
00112 HlDataList *highlightDataList,
00113 int hlNumber, QWidget *parent,
00114 const char *name, bool modal )
00115 :KDialogBase(parent,name,modal,i18n("Highlight Settings"), Ok|Cancel, Ok)
00116 {
00117
00118 QFrame *page=addPage("FIXME");
00119 (new QVBoxLayout(page))->setAutoAdd(true);
00120 content=new HighlightDialogPage(hlManager,styleList,highlightDataList,hlNumber,page);
00121 }
00122
00123 void HighlightDialog::done(int r)
00124 {
00125 kdDebug(13010)<<"HighlightDialod done"<<endl;
00126 content->saveData();
00127 KDialogBase::done(r);
00128 }
00129
00130 HighlightDialogPage::HighlightDialogPage(HlManager *hlManager, ItemStyleList *styleList,
00131 HlDataList* highlightDataList,
00132 int hlNumber,QWidget *parent, const char *name)
00133 :QTabWidget(parent,name),defaultItemStyleList(styleList),hlData(0L)
00134
00135 {
00136
00137
00138
00139 QFrame *page1 = new QFrame(this);
00140 addTab(page1,i18n("&Defaults"));
00141 QGridLayout *grid = new QGridLayout(page1, 1, 1);
00142
00143 QVGroupBox *dvbox1 = new QVGroupBox( i18n("Default Item Styles"), page1 );
00144 new QLabel( i18n("Item:"), dvbox1 );
00145 QComboBox *styleCombo = new QComboBox( false, dvbox1 );
00146 defaultStyleChanger = new StyleChanger( dvbox1 );
00147 for( int i = 0; i < hlManager->defaultStyles(); i++ ) {
00148 styleCombo->insertItem(hlManager->defaultStyleName(i));
00149 }
00150 connect(styleCombo, SIGNAL(activated(int)), this, SLOT(defaultChanged(int)));
00151 grid->addWidget(dvbox1, 0,0);
00152
00153 defaultChanged(0);
00154
00155
00156
00157 QFrame *page2 = new QFrame(this);
00158 addTab(page2,i18n("&Highlight Modes"));
00159
00160 QVBoxLayout *bl=new QVBoxLayout(page2);
00161 bl->setAutoAdd(true);
00162 QHGroupBox *hbox1 = new QHGroupBox( i18n("Config Select"), page2 );
00163 hbox1->layout()->setMargin(5);
00164 QVBox *vbox1=new QVBox(hbox1);
00165
00166 QVGroupBox *vbox2 = new QVGroupBox( i18n("Item Style"), page2 );
00167
00168 QVGroupBox *vbox3 = new QVGroupBox( i18n("Highlight Auto Select"), hbox1 );
00169
00170
00171 QLabel *label = new QLabel( i18n("Highlight:"), vbox1 );
00172 hlCombo = new QComboBox( false, vbox1 );
00173 QHBox *modHl = new QHBox(vbox1);
00174
00175
00176 connect( hlCombo, SIGNAL(activated(int)),
00177 this, SLOT(hlChanged(int)) );
00178 for( int i = 0; i < hlManager->highlights(); i++) {
00179 hlCombo->insertItem(hlManager->hlName(i));
00180 }
00181 hlCombo->setCurrentItem(hlNumber);
00182
00183
00184 label = new QLabel( i18n("Item:"), vbox2 );
00185 itemCombo = new QComboBox( false, vbox2 );
00186 connect( itemCombo, SIGNAL(activated(int)), this, SLOT(itemChanged(int)) );
00187
00188 label = new QLabel( i18n("File Extensions:"), vbox3 );
00189 wildcards = new QLineEdit( vbox3 );
00190 label = new QLabel( i18n("Mime Types:"), vbox3 );
00191 mimetypes = new QLineEdit( vbox3 );
00192
00193
00194 styleDefault = new QCheckBox(i18n("Default"), vbox2 );
00195 connect(styleDefault,SIGNAL(clicked()),SLOT(changed()));
00196 styleChanger = new StyleChanger( vbox2 );
00197
00198 hlDataList = highlightDataList;
00199 hlChanged(hlNumber);
00200 }
00201
00202
00203 void HighlightDialogPage::defaultChanged(int z)
00204 {
00205 defaultStyleChanger->setRef(defaultItemStyleList->at(z));
00206 }
00207
00208
00209 void HighlightDialogPage::hlChanged(int z)
00210 {
00211 writeback();
00212
00213 hlData = hlDataList->at(z);
00214
00215 wildcards->setText(hlData->wildcards);
00216 mimetypes->setText(hlData->mimetypes);
00217
00218 itemCombo->clear();
00219 for (ItemData *itemData = hlData->itemDataList.first(); itemData != 0L;
00220 itemData = hlData->itemDataList.next()) {
00221 kdDebug(13010) << itemData->name << endl;
00222 itemCombo->insertItem(i18n(itemData->name.latin1()));
00223 }
00224
00225 itemChanged(0);
00226 }
00227
00228 void HighlightDialogPage::itemChanged(int z)
00229 {
00230 itemData = hlData->itemDataList.at(z);
00231
00232 styleDefault->setChecked(itemData->defStyle);
00233 styleChanger->setRef(itemData);
00234 }
00235
00236 void HighlightDialogPage::changed()
00237 {
00238 itemData->defStyle = styleDefault->isChecked();
00239 }
00240
00241 void HighlightDialogPage::writeback() {
00242 if (hlData) {
00243 hlData->wildcards = wildcards->text();
00244 hlData->mimetypes = mimetypes->text();
00245 }
00246 }
00247
00248 void HighlightDialogPage::saveData() {
00249 kdDebug(13010)<<"HighlightDialogPage::saveData()"<<endl;
00250 writeback();
00251 }
00252
00253
00254 void HighlightDialogPage::hlEdit() {
00255 HlEditDialog diag(0,0,"hlEdit", true,hlData);
00256 diag.show();
00257 }
00258
00259 void HighlightDialogPage::hlNew() {
00260 HlEditDialog diag(0,0,"hlEdit",true,0);
00261 diag.show();
00262 }
00263
00264
00265 HlEditDialog::HlEditDialog(HlManager *,QWidget *parent, const char *name, bool modal,HlData *data)
00266 :KDialogBase(KDialogBase::Swallow, i18n("Highlight Conditions"), Ok|Cancel, Ok, parent, name, modal)
00267 {
00268 currentItem=0;
00269 transTableCnt=0;
00270 QHBox *wid=new QHBox(this);
00271 QVBox *lbox=new QVBox(wid);
00272 contextList=new KListView(lbox);
00273 contextList->setRootIsDecorated(true);
00274 contextList->addColumn(i18n("Syntax structure"));
00275 contextList->setSorting(-1);
00276 QHBox *bbox=new QHBox(lbox);
00277 QPushButton *addContext=new QPushButton(i18n("New Context"),bbox);
00278 QPushButton *addItem=new QPushButton(i18n("New Item"),bbox);
00279 QVGroupBox *opt = new QVGroupBox( i18n("Options"), wid);
00280 stack=new QWidgetStack(opt);
00281 initContextOptions(contextOptions=new QVBox(stack));
00282 stack->addWidget(contextOptions,HlEContext);
00283 initItemOptions(itemOptions=new QVBox(stack));
00284 stack->addWidget(itemOptions,HlEItem);
00285 stack->raiseWidget(HlEContext);
00286 setMainWidget(wid);
00287 if (data!=0) loadFromDocument(data);
00288 else newDocument();
00289 connect(contextList,SIGNAL(currentChanged(QListViewItem*)),this,SLOT(currentSelectionChanged(QListViewItem*)));
00290 connect(addContext,SIGNAL(clicked()),this,SLOT(contextAddNew()));
00291 connect(addItem,SIGNAL(clicked()),this,SLOT(ItemAddNew()));
00292 }
00293
00294 void HlEditDialog::newDocument()
00295 {
00296 KStandardDirs *dirs = KGlobal::dirs();
00297 QStringList list=dirs->findAllResources("data","kate/syntax/syntax.template",false,true);
00298 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
00299 {
00300 HlData data("","",*it);
00301 loadFromDocument(&data);
00302 return;
00303 }
00304 KMessageBox::error(this,i18n("Can't find template file"));
00305 }
00306
00307
00308 void HlEditDialog::initContextOptions(QVBox *co)
00309 {
00310 if( co!=0)
00311 {
00312 QHBox *tmp = new QHBox(co);
00313 (void) new QLabel(i18n("Description:"),tmp);
00314 ContextDescr=new QLineEdit(tmp);
00315 tmp= new QHBox(co);
00316 (void) new QLabel(i18n("Attribute:"),tmp);
00317 ContextAttribute=new QComboBox(tmp);
00318 tmp= new QHBox(co);
00319 (void) new QLabel(i18n("LineEnd:"),tmp);
00320 ContextLineEnd = new QComboBox(tmp);
00321 connect(ContextDescr,SIGNAL(textChanged(const QString&)),this,SLOT(contextDescrChanged(const QString&)));
00322 connect(ContextLineEnd,SIGNAL(activated(int)),this,SLOT(contextLineEndChanged(int)));
00323 connect(ContextAttribute,SIGNAL(activated(int)),this,SLOT(contextAttributeChanged(int)));
00324 }
00325 else
00326 kdDebug(13010)<<"initContextOptions: Widget is 0"<<endl;
00327 }
00328
00329
00330 void HlEditDialog::insertTranslationList(QString tag, QString trans,int length)
00331 {
00332 ItemInfo data(trans,length);
00333 id2tag.insert(transTableCnt,tag);
00334 id2info.insert(transTableCnt,data);
00335 tag2id.insert(tag,transTableCnt);
00336 transTableCnt++;
00337 }
00338
00339
00340 void HlEditDialog::initItemOptions(QVBox *co)
00341 {
00342 if (co!=0)
00343 {
00344 QHBox *tmp = new QHBox(co);
00345 (void) new QLabel(i18n("Type:"),tmp);
00346 ItemType = new QComboBox(tmp);
00347 tmp= new QHBox(co);
00348 (void) new QLabel(i18n("Parameter:"),tmp);
00349 ItemParameter= new QLineEdit(tmp);
00350 tmp= new QHBox(co);
00351 (void) new QLabel(i18n("Attribute:"),tmp);
00352 ItemAttribute= new QComboBox(tmp);
00353 (void) new QLabel(i18n("Context switch:"),tmp);
00354 ItemContext = new QComboBox(tmp);
00355 co->setSpacing(15);
00356 QPushButton *delItem=new QPushButton(i18n("Delete this item"),co);
00357
00358
00359 insertTranslationList("CharDetect","CharDetect",1);
00360 insertTranslationList("2CharDetect","2CharDetect",2);
00361 insertTranslationList("RangeDetect","RangeDetect",2);
00362 insertTranslationList("StringDetect","StringDetect",-1);
00363 insertTranslationList("AnyChar","AnyChar",-1);
00364 insertTranslationList("RegExpr","RegExpr",-1);
00365 insertTranslationList("Int","Int",0);
00366 insertTranslationList("Float","Float",0);
00367 insertTranslationList("keyword","keyword",0);
00368 insertTranslationList("dataType","dataType",0);
00369 ItemType->clear();
00370 for (int i=0; i<transTableCnt; i++) ItemType->insertItem(id2info[i].trans_i18n);
00371 connect(ItemType,SIGNAL(activated(int)),this,SLOT(ItemTypeChanged(int)));
00372 connect(ItemParameter,SIGNAL(textChanged(const QString&)),this,SLOT(ItemParameterChanged(const QString&)));
00373 connect(ItemAttribute,SIGNAL(activated(int)),this,SLOT(ItemAttributeChanged(int)));
00374 connect(ItemContext,SIGNAL(activated(int)),this,SLOT(ItemContextChanged(int)));
00375 }
00376 else
00377 kdDebug(13010)<<"initItemOptions: Widget is 0"<<endl;
00378 }
00379
00380 void HlEditDialog::loadFromDocument(HlData *hl)
00381 {
00382 struct syntaxContextData *data;
00383 QListViewItem *last=0,*lastsub=0;
00384
00385 HlManager::self()->syntax->setIdentifier(hl->identifier);
00386 data=HlManager::self()->syntax->getGroupInfo("highlighting","context");
00387 int i=0;
00388 if (data)
00389 {
00390 while (HlManager::self()->syntax->nextGroup(data))
00391 {
00392 kdDebug(13010)<< "Adding context to list"<<endl;
00393 last= new QListViewItem(contextList,last,
00394 HlManager::self()->syntax->groupData(data,QString("name")),
00395 QString("%1").arg(i),
00396 HlManager::self()->syntax->groupData(data,QString("attribute")),
00397 HlManager::self()->syntax->groupData(data,QString("lineEndContext")));
00398 i++;
00399 lastsub=0;
00400 while (HlManager::self()->syntax->nextItem(data))
00401 {
00402 kdDebug(13010)<< "Adding item to list"<<endl;
00403 lastsub=addContextItem(last,lastsub,data);
00404 }
00405
00406
00407 }
00408 if (data) HlManager::self()->syntax->freeGroupInfo(data);
00409 }
00410 ContextAttribute->clear();
00411 ItemAttribute->clear();
00412 data=HlManager::self()->syntax->getGroupInfo("highlighting","itemData");
00413 while (HlManager::self()->syntax->nextGroup(data))
00414 {
00415 ContextAttribute->insertItem(HlManager::self()->syntax->groupData(data,QString("name")));
00416 ItemAttribute->insertItem(HlManager::self()->syntax->groupData(data,QString("name")));
00417 }
00418 if (data) HlManager::self()->syntax->freeGroupInfo(data);
00419 }
00420
00421 QListViewItem *HlEditDialog::addContextItem(QListViewItem *_parent,QListViewItem *prev,struct syntaxContextData *data)
00422 {
00423
00424 kdDebug(13010)<<HlManager::self()->syntax->groupItemData(data,QString("name")) << endl;
00425
00426 QString dataname=HlManager::self()->syntax->groupItemData(data,QString(""));
00427 QString attr=(HlManager::self()->syntax->groupItemData(data,QString("attribute")));
00428 QString context=(HlManager::self()->syntax->groupItemData(data,QString("context")));
00429 char chr;
00430 if (! HlManager::self()->syntax->groupItemData(data,QString("char")).isEmpty())
00431 chr= (HlManager::self()->syntax->groupItemData(data,QString("char")).latin1())[0];
00432 else
00433 chr=0;
00434 QString stringdata=HlManager::self()->syntax->groupItemData(data,QString("String"));
00435 char chr1;
00436 if (! HlManager::self()->syntax->groupItemData(data,QString("char1")).isEmpty())
00437 chr1= (HlManager::self()->syntax->groupItemData(data,QString("char1")).latin1())[0];
00438 else
00439 chr1=0;
00440 bool insensitive=(HlManager::self()->syntax->groupItemData(data,QString("insensitive"))==QString("TRUE"));
00441 QString param("");
00442 if ((dataname=="keyword") || (dataname=="dataType")) param=dataname;
00443 else if (dataname=="CharDetect") param=chr;
00444 else if ((dataname=="2CharDetect") || (dataname=="RangeDetect")) param=QString("%1%2").arg(chr).arg(chr1);
00445 else if ((dataname=="StringDetect") || (dataname=="AnyChar") || (dataname=="RegExpr")) param=stringdata;
00446 else kdDebug(13010)<<"***********************************"<<endl<<"Unknown entry for Context:"<<dataname<<endl;
00447 kdDebug(13010)<<dataname << endl;
00448 return new QListViewItem(_parent,prev,i18n(dataname.latin1())+" "+param,dataname,param,attr,context);
00449 }
00450
00451
00452 void HlEditDialog::currentSelectionChanged ( QListViewItem *it)
00453 {
00454 kdDebug(13010)<<"Update data view"<<endl<<"Depth:"<<it->depth()<<endl;
00455 currentItem=it;
00456 if (it->depth()==0) showContext();
00457 else showItem();
00458 }
00459
00460
00461
00462
00463
00464
00465
00466 void HlEditDialog::showContext()
00467 {
00468 stack->raiseWidget(HlEContext);
00469 ContextDescr->setText(currentItem->text(0));
00470 ContextAttribute->setCurrentItem(currentItem->text(2).toInt());
00471 ContextLineEnd->clear();
00472 for (QListViewItem *it=contextList->firstChild();it;it=it->nextSibling())
00473 ContextLineEnd->insertItem(it->text(0));
00474 ContextLineEnd->setCurrentItem(currentItem->text(3).toInt());
00475
00476
00477 }
00478
00479 void HlEditDialog::contextDescrChanged(const QString& name)
00480 {
00481 if (currentItem)
00482 {
00483 currentItem->setText(0,name);
00484 ContextLineEnd->changeItem(name,currentItem->text(3).toInt());
00485 }
00486 }
00487
00488 void HlEditDialog::contextAttributeChanged(int id)
00489 {
00490 if (currentItem)
00491 {
00492 currentItem->setText(2,QString("%1").arg(id));
00493 }
00494 }
00495
00496 void HlEditDialog::contextLineEndChanged(int id)
00497 {
00498 kdDebug(13010)<<"contextLineEndChanged"<<endl;
00499 if (currentItem)
00500 {
00501 currentItem->setText(3,QString("%1").arg(id));
00502 }
00503 }
00504
00505 void HlEditDialog::contextAddNew()
00506 {
00507 QListViewItem *it=contextList->firstChild();
00508 for (;it->nextSibling()!=0;it=it->nextSibling());
00509 it=new QListViewItem(contextList,it,i18n("New Context"),QString("%1").arg(it->text(1).toInt()),"0","0");
00510 contextList->setSelected(it,true);
00511 }
00512
00513
00514
00515
00516
00517 void HlEditDialog::showItem()
00518 {
00519 stack->raiseWidget(HlEItem);
00520 ItemContext->clear();
00521 for (QListViewItem *it=contextList->firstChild();it;it=it->nextSibling())
00522 ItemContext->insertItem(it->text(0));
00523 ItemContext->setCurrentItem(currentItem->text(4).toInt());
00524 ItemAttribute->setCurrentItem(currentItem->text(3).toInt());
00525 QMap<QString,int>::Iterator iter=tag2id.find(currentItem->text(1));
00526 if (iter==tag2id.end())
00527 kdDebug(13010)<<"Oops, unknown itemtype in showItem: "<<currentItem->text(1)<<endl;
00528 else
00529 {
00530 ItemType->setCurrentItem(*iter);
00531 if (id2info[*iter].length==0) ItemParameter->hide();
00532 else
00533 {
00534 ItemParameter->setMaxLength(id2info[*iter].length);
00535 ItemParameter->show();
00536 ItemParameter->setText(currentItem->text(2));
00537 }
00538 }
00539
00540 }
00541
00542 void HlEditDialog::ItemTypeChanged(int id)
00543 {
00544 if (currentItem)
00545 {
00546 currentItem->setText(1,id2tag[id]);
00547 ItemParameter->setMaxLength(id2info[id].length);
00548 ItemParameterChanged(ItemParameter->text());
00549 }
00550 }
00551
00552 void HlEditDialog::ItemParameterChanged(const QString& name)
00553 {
00554 if (currentItem)
00555 {
00556 currentItem->setText(2,name);
00557 currentItem->setText(0,id2info[ItemType->currentItem()].trans_i18n+" "+currentItem->text(2));
00558 }
00559 }
00560
00561 void HlEditDialog::ItemAttributeChanged(int attr)
00562 {
00563 if (currentItem)
00564 {
00565 currentItem->setText(3,QString("%1").arg(attr));
00566 }
00567 }
00568
00569 void HlEditDialog::ItemContextChanged(int cont)
00570 {
00571 if (currentItem)
00572 {
00573 currentItem->setText(4,QString("%1").arg(cont));
00574 }
00575 }
00576
00577 void HlEditDialog::ItemAddNew()
00578 {
00579 QListViewItem *it;
00580 if (currentItem)
00581 {
00582 if (currentItem->depth()==0) it=currentItem->firstChild();
00583 else
00584 it=currentItem;
00585 if (it) for (;it->nextSibling();it=it->nextSibling());
00586 (void) new QListViewItem(it ? it->parent() : currentItem,it,"StringDetect "+i18n("New Item"),"StringDetect",i18n("New Item"),0,it ? it->parent()->text(1) : currentItem->text(1));
00587 }
00588 }