* contrib/hbide/resources/curlinehilight.png
+ contrib/hbide/resources/horzruler.png
* contrib/hbide/resources/togglelinenumber.png
* contrib/hbide/resources/toolsutilities.ui
* contrib/hbide/resources/toolsutilities.uic
* contrib/hbide/resources/setup.ui
* contrib/hbide/resources/setup.uic
* contrib/hbqt/qth/HBQPlainTextEdit.qth
* contrib/hbqt/qth/QTableWidget.qth
- contrib/hbqt/qth/HBQSyntaxHighLighter.qth
+ contrib/hbqt/qth/HBQSyntaxHighlighter.qth
* contrib/hbqt/doc/en/class_hbqplaintextedit.txt
* contrib/hbqt/doc/en/class_hbqsyntaxhighlighter.txt
* contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
* contrib/hbqt/qtgui/QTableWidget.cpp
* contrib/hbqt/qtgui/THBQPlainTextEdit.prg
* contrib/hbqt/qtgui/HBQSyntaxHighlighter.cpp
* contrib/hbqt/qtgui/THBQSyntaxHighlighter.prg
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
* contrib/hbqt/hbqt_hbqsyntaxhighlighter.cpp
* contrib/hbqt/hbqt_hbqsyntaxhighlighter.h
* contrib/hbide/hbide.hbp
* contrib/hbide/hbide.ch
* contrib/hbide/hbide.prg
+ contrib/hbide/idedict.prg
* contrib/hbide/idedocks.prg
* contrib/hbide/ideedit.prg
* contrib/hbide/ideeditor.prg
* contrib/hbide/idemisc.prg
* contrib/hbide/ideobject.prg
* contrib/hbide/idesaveload.prg
* contrib/hbide/ideshortcuts.prg
* contrib/hbide/idestylesheets.prg
* contrib/hbide/idethemes.prg
* contrib/hbide/idetools.prg
% Widened padding for menubar prompts to show up at a proper distance.
+ Controlled "RETURN" keyword not to jump to first indentation place,
with env variable - HBIDE_RETURN_ATBEGINING=yes. Scheduled to be
included in "Setup" interface.
+ Allowed hbIDE execution with any text type file. It was accepting .PRG.CPP only.
+ Broadened the scope of keyword coloring for any case, mixed or absolute.
It was all lower or all upper previously.
+ Prepared ground for user defined keywords through user dictionaries.
+ Added new flags in "Setup" dialog ( yet not active ).
Please have a look into the contents of different pages and
let me know what else can qualify to be included therein.
+ More macro for Tools parameter - ${source_fullname_less_ext}
% Tools & Utilities dialog made modeless. At times it is desirable
to execute a tool multiple times and also to gather output logs.
+ Tools & Utilities dialog now remembers its last opened position.
+ Implemented: user-configurable 5 toolbars which can be populated
through Tool & Utilities interface. Invoke "Tools & Utilities"
interface and play with the toolbars. You will find it really
rewarding. I am also trying to find a way to hook
"Kayboard Mappings" macros to be included under this interface.
Your input is welcome. I will write the help in about a week,
but interface is straight enough to grab/grasp/use.
+ Implemented: to switch on/off horizontal ruler.
+ Implemented: to remember the last settings for next run for
Horizontal Ruler, Line Numbers display and Current Line highlighting.
238 lines
7.1 KiB
C++
238 lines
7.1 KiB
C++
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* Harbour Project source code:
|
|
* QT wrapper main header
|
|
*
|
|
* Copyright 2009 Pritpal Bedi <pritpal@vouchcac.com>
|
|
* www - http://harbour-project.org
|
|
*
|
|
* 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, or (at your option)
|
|
* 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 software; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
|
*
|
|
* As a special exception, the Harbour Project gives permission for
|
|
* additional uses of the text contained in its release of Harbour.
|
|
*
|
|
* The exception is that, if you link the Harbour libraries with other
|
|
* files to produce an executable, this does not by itself cause the
|
|
* resulting executable to be covered by the GNU General Public License.
|
|
* Your use of that executable is in no way restricted on account of
|
|
* linking the Harbour library code into it.
|
|
*
|
|
* This exception does not however invalidate any other reasons why
|
|
* the executable file might be covered by the GNU General Public License.
|
|
*
|
|
* This exception applies only to the code released by the Harbour
|
|
* Project under the name Harbour. If you copy code from other
|
|
* Harbour Project or Free Software Foundation releases into a copy of
|
|
* Harbour, as the General Public License permits, the exception does
|
|
* not apply to the code that you add in this way. To avoid misleading
|
|
* anyone as to the status of such modified files, you must delete
|
|
* this exception notice from them.
|
|
*
|
|
* If you write modifications of your own for Harbour, it is your choice
|
|
* whether to permit this exception to apply to your modifications.
|
|
* If you do not wish that, delete this exception notice.
|
|
*
|
|
*/
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
#include "hbqt.h"
|
|
|
|
#if QT_VERSION >= 0x040500
|
|
|
|
#include "hbqt_hbqsyntaxhighlighter.h"
|
|
|
|
#include <QtCore/QPointer>
|
|
#include <QtCore/QHash>
|
|
#include <QtGui/QTextCharFormat>
|
|
|
|
HBQTextBlockUserData::HBQTextBlockUserData() : QTextBlockUserData()
|
|
{
|
|
state = -1;
|
|
}
|
|
HBQTextBlockUserData::~HBQTextBlockUserData()
|
|
{
|
|
}
|
|
int HBQTextBlockUserData::hbSetState( int istate )
|
|
{
|
|
int iCurState = state;
|
|
state = istate;
|
|
return iCurState;
|
|
}
|
|
int HBQTextBlockUserData::hbState()
|
|
{
|
|
return state;
|
|
}
|
|
HBQTextBlockUserData * HBQTextBlockUserData::data( const QTextBlock& block )
|
|
{
|
|
return static_cast<HBQTextBlockUserData *>( block.userData() );
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
HBQSyntaxHighlighter::HBQSyntaxHighlighter( QTextDocument * parent )
|
|
: QSyntaxHighlighter( parent )
|
|
{
|
|
HighlightingRule rule;
|
|
multiLineCommentFormat.setForeground( Qt::red );
|
|
|
|
commentStartExpression = QRegExp( "/\\*" );
|
|
commentEndExpression = QRegExp( "\\*/" );
|
|
|
|
commentSingleLine = QRegExp( "//[^\n]*" );
|
|
|
|
patternQuotation = QRegExp( "\"[^\"]+\"|\'[^\']+\'" );
|
|
}
|
|
|
|
void HBQSyntaxHighlighter::hbSetRule( QString name, QString pattern, const QTextCharFormat & format )
|
|
{
|
|
if( pattern != "" )
|
|
HighlightingRules.insert( name, HighlightingRule( QRegExp( pattern ), format ) );
|
|
else
|
|
HighlightingRules.remove( name );
|
|
}
|
|
void HBQSyntaxHighlighter::hbSetRuleWithRegExp( QString name, const QRegExp & reg, const QTextCharFormat & format )
|
|
{
|
|
HighlightingRules.insert( name, HighlightingRule( reg, format ) );
|
|
}
|
|
void HBQSyntaxHighlighter::hbSetFormat( QString name, const QTextCharFormat & format )
|
|
{
|
|
if( ( QString ) "TerminatedStrings" == name )
|
|
{
|
|
quotationFormat = format;
|
|
}
|
|
else
|
|
{
|
|
if( HighlightingRules.contains( name ) )
|
|
{
|
|
HighlightingRule rule = HighlightingRules.value( name );
|
|
QRegExp reg = rule.pattern;
|
|
HighlightingRules.insert( name, HighlightingRule( reg, format ) );
|
|
}
|
|
else
|
|
{
|
|
HighlightingRules.remove( name );
|
|
}
|
|
}
|
|
}
|
|
void HBQSyntaxHighlighter::hbSetMultiLineCommentFormat( const QTextCharFormat & format )
|
|
{
|
|
multiLineCommentFormat = format;
|
|
}
|
|
void HBQSyntaxHighlighter::hbSetSingleLineCommentFormat( const QTextCharFormat & format )
|
|
{
|
|
singleLineCommentFormat = format;
|
|
}
|
|
|
|
void HBQSyntaxHighlighter::hbSetFormatColumnSelection( int start, int count, const QColor & color )
|
|
{
|
|
setFormat( start, count, color );
|
|
}
|
|
|
|
void HBQSyntaxHighlighter::highlightBlock( const QString &text )
|
|
{
|
|
#if 0
|
|
QTextBlock curBlock( currentBlock() );
|
|
int iState = -1;
|
|
HBQTextBlockUserData * data = ( HBQTextBlockUserData * ) curBlock.userData();
|
|
|
|
QTextBlockFormat fmt( curBlock.blockFormat() );
|
|
if( data )
|
|
{
|
|
iState = data->state;
|
|
HB_TRACE( HB_TR_ALWAYS, ( "iState = %i", iState ) );
|
|
|
|
switch( iState )
|
|
{
|
|
case 99:
|
|
fmt.setBackground( QColor( 255,255,0 ) );
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
//HB_TRACE( HB_TR_ALWAYS, ( "SYNTSX HIGHLIGHTING" ) );
|
|
|
|
int index = 0;
|
|
|
|
foreach( const HighlightingRule &rule, HighlightingRules )
|
|
{
|
|
#if 0
|
|
QRegExp expression( rule.pattern );
|
|
index = expression.indexIn( text );
|
|
while( index >= 0 )
|
|
{
|
|
int length = expression.matchedLength();
|
|
setFormat( index, length, rule.format );
|
|
index = expression.indexIn( text, index + length );
|
|
}
|
|
#endif
|
|
index = rule.pattern.indexIn( text );
|
|
while( index >= 0 )
|
|
{
|
|
int length = rule.pattern.matchedLength();
|
|
setFormat( index, length, rule.format );
|
|
index = rule.pattern.indexIn( text, index + length );
|
|
}
|
|
}
|
|
|
|
/* Quoted text */
|
|
index = patternQuotation.indexIn( text );
|
|
while( index >= 0 )
|
|
{
|
|
int length = patternQuotation.matchedLength();
|
|
setFormat( index, length, quotationFormat );
|
|
index = patternQuotation.indexIn( text, index + length );
|
|
}
|
|
|
|
/* Single Line Comments */
|
|
index = commentSingleLine.indexIn( text );
|
|
while( index >= 0 )
|
|
{
|
|
int length = commentSingleLine.matchedLength();
|
|
setFormat( index, length, singleLineCommentFormat );
|
|
index = commentSingleLine.indexIn( text, index + length );
|
|
}
|
|
|
|
setCurrentBlockState( 0 );
|
|
|
|
/* Multi Line Comments */
|
|
int startIndex = 0;
|
|
if( previousBlockState() != 1 )
|
|
{
|
|
startIndex = commentStartExpression.indexIn( text );
|
|
}
|
|
while( startIndex >= 0 )
|
|
{
|
|
int endIndex = commentEndExpression.indexIn( text, startIndex );
|
|
int commentLength;
|
|
if( endIndex == -1 )
|
|
{
|
|
setCurrentBlockState( 1 );
|
|
commentLength = text.length() - startIndex;
|
|
}
|
|
else
|
|
{
|
|
commentLength = endIndex - startIndex + commentEndExpression.matchedLength();
|
|
}
|
|
setFormat( startIndex, commentLength, multiLineCommentFormat );
|
|
startIndex = commentStartExpression.indexIn( text, startIndex + commentLength );
|
|
}
|
|
}
|
|
|
|
#endif
|