You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kile/src/kile/kilelogwidget.cpp

202 lines
5.7 KiB

/***************************************************************************
begin : Sat Dec 20 2003
copyright : (C) 2003 by Jeroen Wijnhout
email : Jeroen.Wijnhout@kdemail.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
****************************************************************************/
#include "kilelogwidget.h"
#include <tqregexp.h>
#include <tqfileinfo.h>
#include <tqpopupmenu.h>
#include <tqstylesheet.h>
#include "kiledebug.h"
#include <kurl.h>
#include <tdelocale.h>
#include "kiletool_enums.h"
#include "kileinfo.h"
#include "kileconfig.h"
namespace KileWidget
{
LogMsg::LogMsg(KileInfo *info, TQWidget *parent, const char *name ) :
KTextEdit(parent,name),
m_info(info)
{
setTabStopWidth(10);
connect(this, TQ_SIGNAL(clicked(int, int)), this, TQ_SLOT(slotClicked(int, int)));
}
LogMsg::~LogMsg(){
}
void LogMsg::highlight()
{
blockSignals(true); // block signals to avoid recursion
setUpdatesEnabled(false);
int cursorParagraph, cursorIndex;
getCursorPosition( &cursorParagraph, &cursorIndex );
int line=0;
for(uint i = 0 ; i < m_info->outputInfo()->size() ; ++i )
{
line = (*m_info->outputInfo())[i].outputLine();
setSelection( line,0, line,paragraphLength(line) );
switch ( (*m_info->outputInfo())[i].type() )
{
case LatexOutputInfo::itmError : setColor(TQColor(0xCC, 0x00, 0x00)); break;
case LatexOutputInfo::itmWarning : setColor(TQColor(0x00, 0x00, 0xCC )); break;
case LatexOutputInfo::itmBadBox : setColor(TQColor(0x00, 0x80, 0x00)); break;
default : break;
}
removeSelection();
}
setCursorPosition( cursorParagraph, cursorIndex );
setUpdatesEnabled(true);
blockSignals(false); // block signals to avoid recursion
}
void LogMsg::highlight(uint l, int direction /* = 1 */)
{
setCursorPosition(l + direction * 3 , 0);
setSelection(l, 0, l, paragraphLength(l));
}
void LogMsg::highlightByIndex(int index, int size, int direction /* = 1 */)
{
int parags = paragraphs();
int problemsFound = 0;
int targetProblemNumber = size - index;
static TQRegExp reProblem(".*:[0-9]+:.*");
//start from the bottom (most recent error) because
//there could very well be errors with the same name
for ( int i = parags - 1; i >= 0; --i )
{
if ( reProblem.exactMatch(text(i)) ) ++problemsFound;
if ( problemsFound == targetProblemNumber )
{
highlight(i, direction);
break;
}
}
}
void LogMsg::slotClicked(int parag, int /*index*/)
{
int l = 0;
TQString s = text(parag), file = TQString();
static TQRegExp reES = TQRegExp("(^.*):([0-9]+):.*");
//maybe there is an error summary
if ( reES.search(s) != -1 )
{
l = reES.cap(2).toInt();
file = reES.cap(1);
}
else
{
//look for error at line parag
for (uint i=0; i< m_info->outputInfo()->size(); ++i)
{
if ( (*m_info->outputInfo())[i].outputLine() == parag)
{
file = (*m_info->outputInfo())[i].source();
l = (*m_info->outputInfo())[i].sourceLine();
break;
}
}
}
file = m_info->getFullFromPrettyName(file);
if ( file != TQString() )
{
emit(fileOpen(KURL::fromPathOrURL(file), TQString()));
if ( l > 0 ) emit(setLine(TQString::number(l)));
}
}
void LogMsg::printMsg(int type, const TQString & message, const TQString &tool)
{
if ( type == KileTool::Error ) emit showingErrorMessage(this);
TQString ot = "", ct = "</font>";
TQString myMsg = TQStyleSheet::escape(message);
switch (type)
{
case KileTool::Warning :
ot = "<font color='blue'>";
break;
case KileTool::ProblemWarning :
if ( KileConfig::hideProblemWarning() ) return;
ot = "<font color='blue'>";
break;
case KileTool::Error : case KileTool::ProblemError :
ot = "<font color='red'>";
break;
case KileTool::ProblemBadBox :
if ( KileConfig::hideProblemBadBox() ) return;
ot = "<font color='#666666'>";
break;
default : ot = "<font color='black'>"; break;
}
if (tool.isNull())
append(ot + myMsg + ct);
else
append(ot + "<b>[" + tool + "]</b> " + myMsg + ct );
scrollToBottom();
}
void LogMsg::printProblem(int type, const TQString & problem)
{
KILE_DEBUG() << "\t" << problem << endl;
printMsg(type, problem, TQString());
}
TQPopupMenu* LogMsg::createPopupMenu (const TQPoint & pos)
{
//get standard popup menu
TQPopupMenu * popup = KTextEdit::createPopupMenu(pos);
//add toggle operations for hiding warnings/badboxes
popup->insertSeparator();
m_idBadBox = popup->insertItem(i18n("Hide &Bad Boxes"));
popup->setItemChecked(m_idBadBox, KileConfig::hideProblemBadBox());
m_idWarning = popup->insertItem(i18n("Hide (La)TeX &Warnings"));
popup->setItemChecked(m_idWarning, KileConfig::hideProblemWarning());
disconnect ( popup , TQ_SIGNAL(activated(int)), this , TQ_SLOT(handlePopup(int )));
connect ( popup , TQ_SIGNAL(activated(int)), this , TQ_SLOT(handlePopup(int )));
return popup;
}
void LogMsg::handlePopup(int id)
{
if ( id == m_idBadBox ) KileConfig::setHideProblemBadBox(!KileConfig::hideProblemBadBox());
else if ( id == m_idWarning ) KileConfig::setHideProblemWarning(!KileConfig::hideProblemWarning());
}
}
#include "kilelogwidget.moc"