//============================================================================= // // File : scripteditor.cpp // Created on Sun Mar 28 1999 16:11:48 CEST by Szymon Stefanek // Code improvements by Carbone Alessandro & Tonino Imbesi // // This file is part of the KVIrc IRC client distribution // Copyright (C) 1999-2004 Szymon Stefanek // // 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 opinion) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "scripteditor.h" #include #include #include #include "kvi_tal_popupmenu.h" #include "kvi_tal_scrollview.h" #include #include #ifdef COMPILE_USE_QT4 //#define TQSyntaxHighlighter Q3SyntaxHighlighter #else #include #endif #include #include #include #include "kvi_fileutils.h" #include "kvi_locale.h" #include "kvi_filedialog.h" #include "kvi_qstring.h" #include "kvi_config.h" #include "kvi_module.h" #include "kvi_pointerlist.h" // #include "kvi_app.h" #include "kvi_console.h" #include "kvi_window.h" #include "kvi_iconmanager.h" #include "kvi_kvs_kernel.h" #include extern KviPointerList * g_pScriptEditorWindowList; extern KviModule * g_pEditorModulePointer; static TQColor g_clrBackground(255,255,255); static TQColor g_clrNormalText(0,0,0); static TQColor g_clrBracket(255,0,0); static TQColor g_clrComment(0,120,0); static TQColor g_clrFunction(0,17,255); static TQColor g_clrKeyword(85,85,255); static TQColor g_clrVariable(255,0,0); static TQColor g_clrPunctuation(180,180,0); static TQColor g_clrFind(0,0,0); static TQFont g_fntNormal("Courier New",8); KviCompletionBox::KviCompletionBox(TQWidget * parent) : KviTalListBox(parent) { setPaletteForegroundColor(TQColor(0,0,0)); setPaletteBackgroundColor(TQColor(255,255,255)); #ifdef COMPILE_USE_QT4 setHScrollBarMode(KviTalListBox::AlwaysOff); #else setHScrollBarMode(TQScrollView::AlwaysOff); #endif TQFont listfont=font(); listfont.setPointSize(8); setFont(listfont); setVariableWidth(false); setFixedWidth(200); //completelistbox->setColumnMode(KviTalListBox::Variable); hide(); } void KviCompletionBox::updateContents(TQString buffer) { buffer=buffer.stripWhiteSpace(); KviPointerList list; clear(); TQString szModule; TQChar* pCur = (TQChar *)buffer.ucs2(); int pos=buffer.find('.'); if(pos>0) { szModule=buffer.left(pos); if(szModule[0].unicode()=='$') szModule.remove(0,1); } if(pCur->unicode() == '$') { buffer.remove(0,1); if(!buffer.isEmpty()) { if(szModule.isEmpty()) KviKvsKernel::instance()->completeFunction(buffer,&list); else debug("we need a module completion!"); for ( TQString* szCurrent = list.first(); szCurrent; szCurrent = list.next() ) { szCurrent->prepend('$'); //szCurrent->append('('); insertItem(*szCurrent); } } } else { if(szModule.isEmpty()) KviKvsKernel::instance()->completeCommand(buffer,&list); else debug("we need a module completion!"); for ( TQString* szCurrent = list.first(); szCurrent; szCurrent = list.next() ) { szCurrent->append(' '); insertItem(*szCurrent); } } // debug("%s %s %i %i",__FILE__,__FUNCTION__,__LINE__,count()); } void KviCompletionBox::keyPressEvent(TQKeyEvent * e) { // debug("%s %s %i %x",__FILE__,__FUNCTION__,__LINE__,e->key()); switch(e->key()) { case TQt::Key_Escape: hide(); setFocus(); break; case TQt::Key_Return: break; default: if(!e->text().isEmpty()) { e->ignore(); } } KviTalListBox::keyPressEvent(e); } KviScriptEditorWidgetColorOptions::KviScriptEditorWidgetColorOptions(TQWidget * pParent) : TQDialog(pParent) { m_pSelectorInterfaceList = new KviPointerList; m_pSelectorInterfaceList->setAutoDelete(false); setCaption(__tr2qs_ctx("Preferences","editor")); TQGridLayout * g = new TQGridLayout(this,3,3,4,4); KviFontSelector * f = new KviFontSelector(this,__tr2qs_ctx("Font:","editor"),&g_fntNormal,true); g->addMultiCellWidget(f,0,0,0,2); m_pSelectorInterfaceList->append(f); KviTalGroupBox * gbox = new KviTalGroupBox(1,Qt::Horizontal,__tr2qs("Colors" ),this); g->addMultiCellWidget(gbox,1,1,0,2); KviColorSelector * s = addColorSelector(gbox,__tr2qs_ctx("Background:","editor"),&g_clrBackground,true); s = addColorSelector(gbox,__tr2qs_ctx("Normal text:","editor"),&g_clrNormalText,true); s = addColorSelector(gbox,__tr2qs_ctx("Brackets:","editor"),&g_clrBracket,true); s = addColorSelector(gbox,__tr2qs_ctx("Comments:","editor"),&g_clrComment,true); s = addColorSelector(gbox,__tr2qs_ctx("Functions:","editor"),&g_clrFunction,true); s = addColorSelector(gbox,__tr2qs_ctx("Keywords:","editor"),&g_clrKeyword,true); s = addColorSelector(gbox,__tr2qs_ctx("Variables:","editor"),&g_clrVariable,true); s = addColorSelector(gbox,__tr2qs_ctx("Punctuation:","editor"),&g_clrPunctuation,true); s = addColorSelector(gbox,__tr2qs_ctx("Find:","editor"),&g_clrFind,true); TQPushButton * b = new TQPushButton(__tr2qs_ctx("&OK","editor"),this); b->setDefault(true); connect(b,TQT_SIGNAL(clicked()),this,TQT_SLOT(okClicked())); g->addWidget(b,2,1); b = new TQPushButton(__tr2qs_ctx("Cancel","editor"),this); connect(b,TQT_SIGNAL(clicked()),this,TQT_SLOT(reject())); g->addWidget(b,2,2); g->setRowStretch(0,1); g->setColStretch(0,1); } KviScriptEditorWidgetColorOptions::~KviScriptEditorWidgetColorOptions() { delete m_pSelectorInterfaceList; } KviColorSelector * KviScriptEditorWidgetColorOptions::addColorSelector(TQWidget * pParent,const TQString & txt,TQColor * pOption,bool bEnabled) { KviColorSelector * s = new KviColorSelector(pParent,txt,pOption,bEnabled); m_pSelectorInterfaceList->append(s); return s; } void KviScriptEditorWidgetColorOptions::okClicked() { for(KviSelectorInterface * i = m_pSelectorInterfaceList->first();i;i = m_pSelectorInterfaceList->next()) { i->commit(); } accept(); } KviScriptEditorWidget::KviScriptEditorWidget(TQWidget * pParent) : KviTalTextEdit(pParent) { setWordWrap(KviTalTextEdit::NoWrap); m_pParent=pParent; m_szHelp="Nothing"; updateOptions(); m_szFind=""; completelistbox=new KviCompletionBox(this); connect (completelistbox,TQT_SIGNAL(selected(const TQString &)),this,TQT_SLOT(slotComplete(const TQString &))); } KviScriptEditorWidget::~KviScriptEditorWidget() { } #ifdef COMPILE_USE_QT4 Q3PopupMenu * KviScriptEditorWidget::createPopupMenu( const TQPoint& pos ) #else TQPopupMenu * KviScriptEditorWidget::createPopupMenu( const TQPoint& pos ) #endif { #ifdef COMPILE_USE_QT4 Q3PopupMenu *pop=KviTalTextEdit::createPopupMenu(pos); #else TQPopupMenu *pop=KviTalTextEdit::createPopupMenu(pos); #endif pop->insertItem(__tr2qs("Context sensitive help"),this,TQT_SLOT(slotHelp()),TQt::CTRL+TQt::Key_H); pop->insertItem(__tr2qs("&Replace"),this,TQT_SLOT(slotReplace()),TQt::CTRL+TQt::Key_R); return pop; } void KviScriptEditorWidget::slotFind() { m_szFind=((KviScriptEditorImplementation*)m_pParent)->getFindlineedit()->text(); setText(text()); } void KviScriptEditorWidget::slotReplace() { KviScriptEditorReplaceDialog *dialog=new KviScriptEditorReplaceDialog(this,tqtr("Find & Repalce")); connect (dialog,TQT_SIGNAL(replaceAll(const TQString &,const TQString &)),m_pParent,TQT_SLOT(slotReplaceAll(const TQString &,const TQString &))); connect (dialog,TQT_SIGNAL(initFind()),m_pParent,TQT_SLOT(slotInitFind())); connect (dialog,TQT_SIGNAL(nextFind(const TQString &)),m_pParent,TQT_SLOT(slotNextFind(const TQString &))); if(dialog->exec()){}; } void KviScriptEditorWidget::slotHelp() { contextSensitiveHelp(); } void KviScriptEditorWidget::updateOptions() { setPaper(TQBrush(g_clrBackground)); setFont(g_fntNormal); setColor(g_clrNormalText); TQPalette p = palette(); p.setColor(TQColorGroup::Text,g_clrNormalText); setPalette(p); #ifdef COMPILE_USE_QT4 setTextFormat(TQt::PlainText); #else setTextFormat(KviTalTextEdit::PlainText); #endif // this will rehighlight everything setText(text()); // an "hack" to ensure Update all in the editor KviScriptSyntaxHighlighter *h = new KviScriptSyntaxHighlighter(this); (void)h; ((KviScriptEditorImplementation*)m_pParent)->getFindlineedit()->setPaletteForegroundColor(g_clrFind); } void KviScriptEditorWidget::keyPressEvent(TQKeyEvent * e) { if(e->state() == TQt::ControlButton) { switch(e->key()) { case TQt::Key_B: insert("$b"); return; case TQt::Key_K: insert("$k"); return; case TQt::Key_O: insert("$o"); return; case TQt::Key_U: insert("$u"); return; case TQt::Key_Enter: case TQt::Key_Return: case TQt::Key_Backspace: case TQt::Key_PageUp: e->ignore(); // allow the parent to process it return; break; } } if(e->state() == TQt::ShiftButton) { if (e->key() == TQt::Key_Insert) { completition(); return; } } switch(e->key()) { case TQt::Key_Period: case TQt::Key_Left: case TQt::Key_Right: if(!completelistbox->isVisible()) completition(0); break; case TQt::Key_Up: case TQt::Key_Escape: case TQt::Key_PageUp: case TQt::Key_PageDown: case TQt::Key_End: case TQt::Key_Home: if(completelistbox->isVisible()) completelistbox->hide(); break; case TQt::Key_Down: if(completelistbox->isVisible()) { completelistbox->setFocus(); completelistbox->setCurrentItem(0); return; } break; case TQt::Key_Return: KviTalTextEdit::keyPressEvent(e); int para,pos; getCursorPosition(¶,&pos); if(para > 0) { TQString szPrev=text(para-1); if(!szPrev.isEmpty()) { if(szPrev.at(szPrev.length() - 1).unicode() == ' ') szPrev.remove(szPrev.length() - 1,1); TQString szCur; const TQChar * pCur = (const TQChar *)szPrev.ucs2(); if(pCur) { while(pCur->unicode() && pCur->isSpace()) { szCur.append(*pCur); pCur++; } } insertAt(szCur,para,0); setCursorPosition(para,szCur.length()+pos); } // debug("|%i|",pos); } return; default: setFocus(); break; } KviTalTextEdit::keyPressEvent(e); emit keyPressed(); if(completelistbox->isVisible()) completition(0); } void KviScriptEditorWidget::contentsMousePressEvent(TQMouseEvent *e) { completelistbox->hide(); if (e->button() == Qt::RightButton) { // bool bIsFirstWordInLine; TQString buffer; int para = paragraphAt(e->pos()); int index=charAt(e->pos(),¶); buffer=this->text(para); getWordOnCursor(buffer,index); TQString tmp=buffer; KviPointerList l; if (tmp.left(1) == "$") { tmp.remove(0,1); KviKvsKernel::instance()->completeFunction(tmp,&l); if (l.count() != 1) buffer=""; else buffer=*(l.at(0)); } else { KviKvsKernel::instance()->completeCommand(tmp,&l); if (l.count() != 1) buffer=""; else buffer=*(l.at(0)); } //debug (buffer); m_szHelp=buffer; } KviTalTextEdit::contentsMousePressEvent(e); } bool KviScriptEditorWidget::contextSensitiveHelp() const { TQString buffer; int para,index; getCursorPosition(¶,&index); buffer=text(para); getWordOnCursor(buffer,index); /* TQString tmp=buffer; KviPointerList * l; if(tmp.left(1) == "$") { tmp.remove(0,1); l = g_pUserParser->completeFunctionAllocateResult(tmp); } else { l = g_pUserParser->completeCommandAllocateResult(tmp); } bool bOk = false; if(l) { for(TQString * s = l->first();s;s = l->next()) { if(KviTQString::equalCI(*s,buffer)) { l->last(); bOk = true; } } } g_pUserParser->freeCompletionResult(l); if(!bOk)return false; */ TQString parse; KviTQString::sprintf(parse,"timer -s (help,0){ help -s %Q; }",&buffer); debug ("parsing %s",parse.latin1()); KviKvsScript::run(parse,(KviWindow*)g_pApp->activeConsole()); return true; } void KviScriptEditorWidget::getWordOnCursor(TQString &buffer,int index) const { TQRegExp re("[ \t=,\\(\\)\"}{\\[\\]\r\n+-*><;@!]"); //debug("BUFFER IS %s",buffer.utf8().data()); int start = buffer.findRev(re,index); int end = buffer.find(re,index); TQString tmp; if(start!=end) { if(start<0)start=0; else start++; if(end<0)end=index; tmp = buffer.mid(start,end-start); } buffer = tmp; //debug("BUFFER NOW IS %s",buffer.utf8().data()); } void KviScriptEditorWidget::completition(bool bCanComplete) { int line,index; TQString buffer; TQString word; getCursorPosition(&line,&index); buffer=this->text(line); bool bIsFirstWordInLine; getWordBeforeCursor(buffer,index,&bIsFirstWordInLine); if(!buffer.isEmpty()) completelistbox->updateContents(buffer); if (completelistbox->count() == 1) word=completelistbox->text(0); if (!word.isEmpty() && bCanComplete) { insert(word); completelistbox->hide(); } if( completelistbox->count() == 0 ) completelistbox->hide(); else if(!completelistbox->isVisible()) { if (completelistbox->count() <6) completelistbox->resize(completelistbox->width(),(completelistbox->count()*completelistbox->fontMetrics().height()+20)); else completelistbox->resize(completelistbox->width(),6*completelistbox->fontMetrics().height()+20); int posy=paragraphRect(line).bottom(); int posx=fontMetrics().width(this->text(line).left(index)); completelistbox->move(posx,posy); completelistbox->show(); } } void KviScriptEditorWidget::getWordBeforeCursor(TQString &buffer,int index,bool *bIsFirstWordInLine) { TQString tmp = buffer.left(index); buffer=tmp; int idx = buffer.findRev(' '); int idx1 = buffer.findRev("="); int idx2 = buffer.findRev(','); int idx3 = buffer.findRev('('); int idx4 = buffer.findRev('"'); if(idx1 > idx) idx= idx1; if(idx2 > idx)idx = idx2; if(idx3 > idx)idx = idx3; if(idx4 > idx)idx = idx4; *bIsFirstWordInLine = false; if(idx > -1)buffer.remove(0,idx); else { *bIsFirstWordInLine = true; buffer.insert(0," "); } } void KviScriptEditorWidget::slotComplete(const TQString &str) { TQString complete=str; int line,index; getCursorPosition(&line,&index); TQString buffer; buffer=this->text(line); bool bIsFirstWordInLine; getWordBeforeCursor(buffer,index,&bIsFirstWordInLine); int len=buffer.length(); // if (buffer[1].unicode() == '$') len --; complete.remove(0,len-1); if (buffer[1].unicode() == '$') complete.append("("); else complete.append(" "); insert (complete); completelistbox->hide(); setFocus(); } KviScriptSyntaxHighlighter::KviScriptSyntaxHighlighter(KviScriptEditorWidget * pWidget) : TQSyntaxHighlighter(pWidget) { } KviScriptSyntaxHighlighter::~KviScriptSyntaxHighlighter() { } #define IN_COMMENT 1 #define IN_LINE 2 #define IN_STRING 4 int KviScriptSyntaxHighlighter::highlightParagraph(const TQString &text,int endStateOfLastPara) { const TQChar * pBuf = (const TQChar *)text.ucs2(); const TQChar * c = pBuf; if(!c)return endStateOfLastPara; if(endStateOfLastPara < 0)endStateOfLastPara = 0; bool bNewCommand = !(endStateOfLastPara & IN_LINE); bool bInComment = endStateOfLastPara & IN_COMMENT; bool bInString = endStateOfLastPara & IN_STRING; const TQChar * pBegin; while(c->unicode()) { if(bInComment) { pBegin = c; while(c->unicode() && (c->unicode() != '*'))c++; if(!c->unicode()) { setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrComment); return IN_COMMENT; } c++; if(c->unicode() == '/') { // end of the comment! c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrComment); bInComment = false; bNewCommand = true; } continue; } if(c->isSpace()) { while(c->unicode() && c->isSpace())c++; if(!c->unicode())continue; } pBegin = c; // this does not break the bNewCommand flag if((c->unicode() == '{') || (c->unicode() == '}')) { c++; setFormat(pBegin - pBuf,1,g_fntNormal,g_clrBracket); continue; } if(bNewCommand) { bNewCommand = false; if(c->unicode() == '#') { if(c > pBuf) { const TQChar * prev = c - 1; if((prev->unicode() == ']') || (prev->unicode() == '}')) { // array or hash count c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrPunctuation); continue; } } // comment until the end of the line while(c->unicode())c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrComment); continue; } if(c->unicode() == '/') { c++; if(c->unicode() == '/') { while(c->unicode())c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrComment); continue; } else if(c->unicode() == '*') { c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrComment); bInComment = true; continue; } c--; } if(c->unicode() && (c->isLetterOrNumber() || (c->unicode() == '_'))) { c++; while(c->unicode() && (c->isLetterOrNumber() || (c->unicode() == '.') || (c->unicode() == '_') || (c->unicode() == ':')))c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrKeyword); // special processing for callbacks and magic commands if(pBegin->unicode() == 'e') { if(c - pBegin == 4) { // might be "else" TQString tmp(pBegin,4); if(tmp.lower() == "else")bNewCommand = true; continue; } } else if(pBegin->unicode() == 'f') { if(c - pBegin == 8) { // might be "function" TQString tmp(pBegin,8); if(tmp.lower() == "function")bNewCommand = true; continue; } } if(pBegin->unicode() == 'i') { if(c - pBegin == 8) { // might be "internal" TQString tmp(pBegin,8); if(tmp.lower() == "internal")bNewCommand = true; continue; } } // not an else or special command function... FIXME: should check for callbacks.. but that's prolly too difficult :) continue; } } if(c->unicode() == '$') { c++; if(c->unicode() == '$') { c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrKeyword); } else { while(c->unicode() && (c->isLetterOrNumber() || (c->unicode() == '.') || (c->unicode() == '_') || (c->unicode() == ':')))c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrFunction); } continue; } if(c->unicode() == '-') { TQChar * pTmp =(TQChar *) c; c++; if(c->unicode() == '-') c++; if(c->isLetter()) { while(c->unicode() && (c->isLetterOrNumber() || (c->unicode() == '_')))c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrKeyword); continue; } else { while(c!=pTmp) c--; } } if(c->unicode() == '%') { c++; if(c->unicode() && (c->isLetterOrNumber() || (c->unicode() == ':') || (c->unicode() == '_'))) { while(c->unicode() && (c->isLetterOrNumber() || (c->unicode() == ':') || (c->unicode() == '_')))c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrVariable); continue; } c--; } if(!c->unicode())continue; if(c->isLetterOrNumber() || c->unicode() == '_') { c++; while(c->unicode() && c->isLetterOrNumber() || (c->unicode() == '_'))c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrNormalText); continue; } if(c->unicode() == '\\') { c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrPunctuation); // the next char is to be interpreted as normal text pBegin = c; if(c->unicode() && (c->unicode() != '\n')) { c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrNormalText); continue; } // this is never returned since TQt sux in string processing // it sets the newlines to spaces and we have no secure way to undestand that this was the end of a line return IN_LINE; } if(c->unicode() == '"') { bInString = !bInString; c++; setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrPunctuation); continue; } else if(c->unicode() == ';') { if(!bInString) bNewCommand = true; // the next will be a new command } c++; if(bInString) { setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrNormalText); } else { setFormat(pBegin - pBuf,c - pBegin,g_fntNormal,g_clrPunctuation); } } bool i=TRUE; TQString szFind=((KviScriptEditorWidget *)textEdit())->m_szFind; if (!szFind.isEmpty()) { int index=0; while (i) { index=text.find(szFind,index,false); if (index != -1) { setFormat(index,szFind.length(),g_clrFind); index += szFind.length(); } else i=false; } } if(bInString) return IN_LINE | IN_STRING; else return 0; } // 22.02.2005 :: 00:01 // valgrind --leak-check=yes --num-callers=10 -v kvirc -f // //==30299== Warning: SIGSEGV not in user code; either from syscall kill() //==30299== or possible Valgrind bug. This message is only shown 3 times. //==30299== Warning: SIGSEGV not in user code; either from syscall kill() //==30299== or possible Valgrind bug. This message is only shown 3 times. //==30299== Warning: SIGSEGV not in user code; either from syscall kill() //==30299== or possible Valgrind bug. This message is only shown 3 times. KviScriptEditorImplementation::KviScriptEditorImplementation(TQWidget * par) :KviScriptEditor(par) { if(g_pScriptEditorWindowList->isEmpty())loadOptions(); g_pScriptEditorWindowList->append(this); m_lastCursorPos=TQPoint(0,0); TQGridLayout * g = new TQGridLayout(this,2,3,0,0); m_pFindLineedit = new TQLineEdit(" ",this); #ifndef COMPILE_USE_QT4 m_pFindLineedit->setFrameStyle(TQFrame::Sunken | TQFrame::Panel); #endif m_pFindLineedit->setText(""); m_pFindLineedit->setPaletteForegroundColor(g_clrFind); m_pEditor = new KviScriptEditorWidget(this); g->addMultiCellWidget(m_pEditor,0,0,0,3); g->setRowStretch(0,1); #ifdef COMPILE_USE_QT4 TQToolButton * b = new TQToolButton(TQt::DownArrow,this,"dsa2"); #else TQToolButton * b = new TQToolButton(DownArrow,this); #endif b->setMinimumWidth(24); g->addWidget(b,1,0); KviTalPopupMenu * pop = new KviTalPopupMenu(b); pop->insertItem(__tr2qs_ctx("&Open...","editor"),this,TQT_SLOT(loadFromFile())); pop->insertItem(__tr2qs_ctx("&Save As...","editor"),this,TQT_SLOT(saveToFile())); pop->insertSeparator(); pop->insertItem(__tr2qs_ctx("&Configure Editor...","editor"),this,TQT_SLOT(configureColors())); b->setPopup(pop); b->setPopupDelay(1); g->setColStretch(1,1); g->setColStretch(2,10); g->addWidget(m_pFindLineedit,1,2); TQLabel *lab= new TQLabel("find",this); lab->setText(tr("Find")); g->addWidget(lab,1,1); m_pRowColLabel = new TQLabel("0",this); m_pRowColLabel->setFrameStyle(TQFrame::Sunken | TQFrame::Panel); m_pRowColLabel->setMinimumWidth(80); g->addWidget(m_pRowColLabel,1,3); connect(m_pFindLineedit,TQT_SIGNAL(returnPressed()),m_pEditor,TQT_SLOT(slotFind())); connect(m_pFindLineedit,TQT_SIGNAL(returnPressed()),this,TQT_SLOT(slotFind())); connect(m_pEditor,TQT_SIGNAL(keyPressed()),this,TQT_SLOT(updateRowColLabel())); connect(m_pEditor,TQT_SIGNAL(textChanged()),this,TQT_SLOT(updateRowColLabel())); connect(m_pEditor,TQT_SIGNAL(selectionChanged()),this,TQT_SLOT(updateRowColLabel())); m_lastCursorPos = TQPoint(-1,-1); } KviScriptEditorImplementation::~KviScriptEditorImplementation() { g_pScriptEditorWindowList->removeRef(this); if(g_pScriptEditorWindowList->isEmpty())saveOptions(); } void KviScriptEditorImplementation::loadOptions() { TQString tmp; g_pEditorModulePointer->getDefaultConfigFileName(tmp); KviConfig cfg(tmp,KviConfig::Read); g_clrBackground = cfg.readColorEntry("Background",TQColor(0,0,0));; g_clrNormalText = cfg.readColorEntry("NormalText",TQColor(100,255,0)); g_clrBracket = cfg.readColorEntry("Bracket",TQColor(255,0,0)); g_clrComment = cfg.readColorEntry("Comment",TQColor(0,120,0)); g_clrFunction = cfg.readColorEntry("Function",TQColor(255,255,0)); g_clrKeyword = cfg.readColorEntry("Keyword",TQColor(120,120,150)); g_clrVariable = cfg.readColorEntry("Variable",TQColor(200,200,200)); g_clrPunctuation = cfg.readColorEntry("Punctuation",TQColor(180,180,0)); g_clrFind = cfg.readColorEntry("Find",TQColor(255,0,0)); g_fntNormal = cfg.readFontEntry("Font",TQFont("Fixed",12)); } bool KviScriptEditorImplementation::isModified() { return m_pEditor->isModified(); } void KviScriptEditorImplementation::slotFind() { emit find(m_pFindLineedit->text()); } void KviScriptEditorImplementation::slotNextFind(const TQString &text) { // emit nextFind(const TQString &text); }void KviScriptEditorImplementation::slotInitFind() { emit initFind(); } void KviScriptEditorImplementation::slotReplaceAll(const TQString &txt,const TQString &txt1) { emit replaceAll(txt,txt1); } void KviScriptEditorImplementation::saveOptions() { TQString tmp; g_pEditorModulePointer->getDefaultConfigFileName(tmp); KviConfig cfg(tmp,KviConfig::Write); cfg.writeEntry("Background",g_clrBackground);; cfg.writeEntry("NormalText",g_clrNormalText); cfg.writeEntry("Bracket",g_clrBracket); cfg.writeEntry("Comment",g_clrComment); cfg.writeEntry("Function",g_clrFunction); cfg.writeEntry("Keyword",g_clrKeyword); cfg.writeEntry("Variable",g_clrVariable); cfg.writeEntry("Punctuation",g_clrPunctuation); cfg.writeEntry("Find",g_clrFind); cfg.writeEntry("Font",g_fntNormal); } void KviScriptEditorImplementation::setFocus() { m_pEditor->setFocus(); } void KviScriptEditorImplementation::focusInEvent(TQFocusEvent *) { m_pEditor->setFocus(); } void KviScriptEditorImplementation::setEnabled(bool bEnabled) { TQWidget::setEnabled(bEnabled); m_pEditor->setEnabled(bEnabled); m_pRowColLabel->setEnabled(bEnabled); } void KviScriptEditorImplementation::saveToFile() { TQString fName; if(KviFileDialog::askForSaveFileName(fName, __tr2qs_ctx("Choose a Filename - KVIrc","editor"), TQString(), TQString(),false,true,true)) { TQString buffer = m_pEditor->text(); //if(tmp.isEmpty())tmp = ""; //KviStr buffer = tmp.utf8().data(); if(!KviFileUtils::writeFile(fName,buffer)) { TQString tmp; TQMessageBox::warning(this, __tr2qs_ctx("Save Failed - KVIrc","editor"), KviTQString::sprintf(tmp,__tr2qs_ctx("Can't open the file %s for writing.","editor"),&fName)); } } } void KviScriptEditorImplementation::setText(const KviTQCString &txt) { m_pEditor->setText(txt.data()); #ifdef COMPILE_USE_QT4 m_pEditor->setTextFormat(TQt::PlainText); #else m_pEditor->setTextFormat(KviTalTextEdit::PlainText); #endif m_pEditor->moveCursor(KviTalTextEdit::MoveEnd,false); m_pEditor->setModified(false); updateRowColLabel(); } void KviScriptEditorImplementation::getText(KviTQCString &txt) { txt = m_pEditor->text(); } TQLineEdit * KviScriptEditorImplementation::getFindlineedit() { return m_pFindLineedit; } void KviScriptEditorImplementation::setText(const TQString &txt) { m_pEditor->setText(txt); #ifdef COMPILE_USE_QT4 m_pEditor->setTextFormat(TQt::PlainText); #else m_pEditor->setTextFormat(KviTalTextEdit::PlainText); #endif m_pEditor->moveCursor(KviTalTextEdit::MoveEnd,false); m_pEditor->setModified(false); updateRowColLabel(); } void KviScriptEditorImplementation::getText(TQString &txt) { txt = m_pEditor->text(); } void KviScriptEditorImplementation::setFindText(const TQString &txt) { m_pFindLineedit->setText(txt); m_pEditor->slotFind(); } void KviScriptEditorImplementation::setFindLineeditReadOnly(bool b) { m_pFindLineedit->setReadOnly(b); } void KviScriptEditorImplementation::updateRowColLabel() { int iRow,iCol; m_pEditor->getCursorPosition(&iRow,&iCol); if(iRow != m_lastCursorPos.x() || iCol != m_lastCursorPos.y()) { m_lastCursorPos = TQPoint(iRow,iCol); TQString tmp; KviTQString::sprintf(tmp,__tr2qs_ctx("Row: %d Col: %d","editor"),iRow,iCol); m_pRowColLabel->setText(tmp); } } TQPoint KviScriptEditorImplementation::getCursor() { return m_lastCursorPos; } void KviScriptEditorImplementation::setCursorPosition(TQPoint pos) { m_pEditor->setCursorPosition(pos.x(),pos.y()); m_pEditor->setFocus(); m_pEditor->ensureCursorVisible(); TQString tmp; KviTQString::sprintf(tmp,__tr2qs_ctx("Row: %d Col: %d","editor"),pos.x(),pos.y()); m_pRowColLabel->setText(tmp); m_lastCursorPos=pos; } void KviScriptEditorImplementation::loadFromFile() { TQString fName; if(KviFileDialog::askForOpenFileName(fName, __tr2qs_ctx("Load Script File - KVIrc","editor"), TQString(), TQString(),false,true)) { TQString buffer; if(KviFileUtils::loadFile(fName,buffer)) { m_pEditor->setText(buffer); m_pEditor->moveCursor(KviTalTextEdit::MoveEnd,false); updateRowColLabel(); } else { TQString tmp; TQMessageBox::warning(this, __tr2qs_ctx("Open Failed - KVIrc","editor"), KviTQString::sprintf(tmp,__tr2qs_ctx("Can't open the file %s for reading.","editor"),&fName)); } } } void KviScriptEditorImplementation::configureColors() { KviScriptEditorWidgetColorOptions dlg(this); if(dlg.exec() == TQDialog::Accepted) { m_pEditor->updateOptions(); saveOptions(); } } KviScriptEditorReplaceDialog::KviScriptEditorReplaceDialog( TQWidget* parent, const char* name) : TQDialog( parent) { m_pParent=parent; emit initFind(); setPaletteForegroundColor( TQColor( 0, 0, 0 ) ); setPaletteBackgroundColor( TQColor( 236, 233, 216 ) ); TQGridLayout *layout = new TQGridLayout( this, 1, 1, 11, 6, "replace layout"); m_pFindlineedit = new TQLineEdit( this, "findlineedit" ); #ifndef COMPILE_USE_QT4 m_pFindlineedit->setSizePolicy( TQSizePolicy( (TQSizePolicy::SizeType)7, (TQSizePolicy::SizeType)0, 0, 0, m_pFindlineedit->sizePolicy().hasHeightForWidth() ) ); m_pFindlineedit->setFrameShape( TQLineEdit::LineEditPanel ); m_pFindlineedit->setFrameShadow( TQLineEdit::Sunken ); #endif layout->addMultiCellWidget( m_pFindlineedit, 2, 2, 1, 2 ); m_pReplacelineedit = new TQLineEdit( this, "replacelineedit" ); #ifndef COMPILE_USE_QT4 m_pReplacelineedit->setFrameShape( TQLineEdit::LineEditPanel ); m_pReplacelineedit->setFrameShadow( TQLineEdit::Sunken ); #endif layout->addMultiCellWidget( m_pReplacelineedit, 3, 3, 1, 2 ); m_pFindlineedit->setFocus(); TQLabel *findlabel = new TQLabel( this, "findlabel" ); findlabel->setText(tr("Word to Find")); #ifndef COMPILE_USE_QT4 findlabel->setAutoResize(true); #endif layout->addWidget( findlabel, 2, 0 ); TQLabel *replacelabel = new TQLabel( this, "replacelabel" ); replacelabel->setText(tr("Replace with")); #ifndef COMPILE_USE_QT4 replacelabel->setAutoResize(true); #endif layout->addWidget( replacelabel, 3, 0 ); TQPushButton *cancelbutton = new TQPushButton( this, "cancelButton" ); cancelbutton->setText(tr("&Cancel")); layout->addWidget( cancelbutton, 5, 2 ); replacebutton = new TQPushButton( this, "replacebutton" ); replacebutton->setText(tr("&Replace")); replacebutton->setEnabled( FALSE ); layout->addWidget( replacebutton, 5, 0 ); checkReplaceAll = new KviStyledCheckBox( this, "replaceAll" ); checkReplaceAll->setText(tr("&Replace in all Aliases")); layout->addWidget( checkReplaceAll, 4, 0 ); findNext = new TQPushButton(this, "findNext(WIP)" ); findNext->setText(tr("&Findnext")); layout->addWidget( findNext, 2, 3 ); findNext->setEnabled(false); replace = new TQPushButton(this, "replace" ); replace->setText(tr("&Replace(WIP)")); layout->addWidget( replace, 3, 3 ); replace->setEnabled(false); #ifndef COMPILE_USE_QT4 clearWState( WState_Polished ); setTabOrder(m_pFindlineedit,m_pReplacelineedit); #endif // signals and slots connections connect( replacebutton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotReplace() ) ); connect( findNext, TQT_SIGNAL( clicked() ),this,TQT_SLOT( slotNextFind())); connect( cancelbutton, TQT_SIGNAL( clicked() ), this, TQT_SLOT( reject() ) ); connect( m_pFindlineedit, TQT_SIGNAL( textChanged(const TQString &)), this, TQT_SLOT( textChanged(const TQString &))); } KviScriptEditorReplaceDialog::~KviScriptEditorReplaceDialog() { } void KviScriptEditorReplaceDialog::textChanged(const TQString &txt) { if (!txt.isEmpty()) replacebutton->setEnabled(TRUE); else replacebutton->setEnabled(FALSE); } void KviScriptEditorReplaceDialog::slotReplace() { TQString txt=((KviScriptEditorWidget *)m_pParent)->text(); if (checkReplaceAll->isChecked()) emit replaceAll(m_pFindlineedit->text(),m_pReplacelineedit->text()); txt.replace(m_pFindlineedit->text(),m_pReplacelineedit->text(),false); ((KviScriptEditorWidget *)m_pParent)->setText(txt); ((KviScriptEditorWidget *)m_pParent)->setModified(true); m_pFindlineedit->setText(""); m_pReplacelineedit->setText(""); setTabOrder(m_pFindlineedit,m_pReplacelineedit); } void KviScriptEditorReplaceDialog::slotNextFind() { emit nextFind(m_pFindlineedit->text()); }