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.
tdeutils/kregexpeditor/regexpbuttons.cpp

218 lines
8.7 KiB

/*
* Copyright (c) 2002-2003 Jesper K. Pedersen <blackie@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
**/
#ifdef TQT_ONLY
#include "compat.h"
#include "images.h"
#else
#include <kiconloader.h>
#include <tdelocale.h>
#include <kstandarddirs.h>
#include "regexpbuttons.moc"
#endif
#include "regexpbuttons.h"
#include "dcbutton.h"
#include <tqtooltip.h>
#include <tqwhatsthis.h>
#include <tqbuttongroup.h>
#include <tqlayout.h>
#include <tqsignalmapper.h>
#include "regexpconverter.h"
RegExpButtons::RegExpButtons( TQWidget *parent, const char *name )
: TQDockWindow( TQDockWindow::InDock, parent, name), _keepMode(false)
{
TQBoxLayout *layout = boxLayout();
_grp = new TQButtonGroup(this);
_grp->hide();
_grp->setExclusive( true );
_mapper = new TQSignalMapper( this, "RegExpButtons::_mapper" );
connect( _mapper, TQ_SIGNAL( mapped(int) ), this, TQ_SIGNAL( clicked(int) ) );
// The "select" button.
_selectBut = new TQToolButton( this);
#ifdef TQT_ONLY
TQPixmap pix;
pix.convertFromImage( qembed_findImage( "select" ) );
#else
TQPixmap pix = TDEGlobal::iconLoader()->loadIcon(locate("data", TQString::fromLatin1("kregexpeditor/pics/select.png") ), TDEIcon::Toolbar );
#endif
_selectBut->setPixmap( pix );
layout->addWidget( _selectBut );
_grp->insert(_selectBut);
_selectBut->setToggleButton( true );
connect( _selectBut, TQ_SIGNAL(clicked()), TQ_SIGNAL(doSelect()));
connect( _selectBut, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotSetNonKeepMode()) );
TQToolTip::add( _selectBut, i18n("Selection tool"));
TQWhatsThis::add( _selectBut, i18n("<qt>This will change the state of the editor to <i>selection state</i>.<p>"
"In this state you will not be inserting <i>regexp items</i>, but instead select them. "
"To select a number of items, press down the left mouse button and drag it over the items.<p>"
"When you have selected a number of items, you may use cut/copy/paste. These functions are "
"found in the right mouse button menu.</qt>"));
// Insert buttons.
DoubleClickButton* but;
but = insert(TEXT, "text", i18n("Text"),
i18n( "<qt>This will insert a text field, where you may write text. The text you write will "
"be matched literally. (i.e. you do not need to escape any characters)</qt>" ) );
layout->addWidget( but );
but = insert(CHARSET, "characters", i18n("A single character specified in a range"),
i18n("<qt>This will match a single character from a predefined range.<p>"
"When you insert this widget a dialog box will appear, which lets you specify "
"which characters this <i>regexp item</i> will match.</qt>") );
layout->addWidget( but );
but = insert(DOT, "anychar", i18n("Any character"),
i18n("<qt>This will match any single character</qt>") );
layout->addWidget( but );
but = insert(REPEAT, "repeat", i18n("Repeated content"),
i18n("<qt>This <i>regexp item</i> will repeat the <i>regexp items</i> it surrounds "
"a specified number of times.<p>"
"The number of times to repeat may be specified using ranges. e.g. You may specify "
"that it should match from 2 to 4 times, that it should match exactly 5 times, or "
"that it should match at least one time.<p>"
"Examples:<br>"
"If you specify that it should match <i>any</i> time, and the content it surrounds "
"is <tt>abc</tt>, then this <i>regexp item</i> will match the empty string, "
"the string <tt>abc</tt>, the string <tt>abcabc</tt>, the string <tt>abcabcabcabc</tt>, "
"etc.</qt>") );
layout->addWidget( but );
but = insert(ALTN, "altn", i18n("Alternatives"),
i18n("<qt>This <i>regexp item</i> will match any of its alternatives.</p>"
"You specify alternatives by placing <i>regexp items</i> on top of "
"each other inside this widget.</qt>") );
layout->addWidget( but );
but = insert(COMPOUND, "compound", i18n("Compound regexp"),
i18n("<qt>This <i>regexp item</i> serves two purposes:"
"<ul><li>It makes it possible for you to collapse a huge <i>regexp item</i> into "
"a small box. This makes it easier for you to get an overview of large "
"<i>regexp items</i>. This is especially useful if you load a predefined <i>regexp item</i> "
"you perhaps don't care about the inner workings of.") );
layout->addWidget( but );
but = insert(BEGLINE, "begline", i18n("Beginning of line"),
i18n("<qt>This will match the beginning of a line.</qt>") );
layout->addWidget( but );
but = insert(ENDLINE, "endline", i18n("End of line"),
i18n("<qt>This will match the end of a line.</qt>") );
layout->addWidget( but );
_wordBoundary = insert(WORDBOUNDARY, "wordboundary", i18n("Word boundary"),
i18n("<qt>This asserts a word boundary (This part does not actually match any characters)</qt>") );
layout->addWidget( _wordBoundary );
_nonWordBoundary = insert(NONWORDBOUNDARY, "nonwordboundary", i18n("Non Word boundary"),
i18n("<qt>This asserts a non-word boundary "
"(This part does not actually match any characters)</qt>") );
layout->addWidget( _nonWordBoundary );
_posLookAhead = insert(POSLOOKAHEAD, "poslookahead", i18n("Positive Look Ahead"),
i18n("<qt>This asserts a regular expression (This part does not actually match any characters). "
"You can only use this at the end of a regular expression.</qt>") );
layout->addWidget( _posLookAhead );
_negLookAhead = insert(NEGLOOKAHEAD, "neglookahead", i18n("Negative Look Ahead"),
i18n("<qt>This asserts a regular expression that must not match "
"(This part does not actually match any characters). "
"You can only use this at the end of a regular expression.</qt>") );
layout->addWidget( _negLookAhead );
}
DoubleClickButton* RegExpButtons::insert(RegExpType tp, const char* name, TQString tooltip, TQString whatsthis)
{
#ifdef TQT_ONLY
TQPixmap pix;
pix.convertFromImage( qembed_findImage( TQString::fromLatin1( name ) ) );
#else
TQPixmap pix = TDEGlobal::iconLoader()->loadIcon(locate("data", TQString::fromLatin1("kregexpeditor/pics/")+TQString::fromLatin1(name) +
TQString::fromLatin1(".png") ), TDEIcon::Toolbar );
#endif
DoubleClickButton* but = new DoubleClickButton( pix, this, "RegExpButtons::but");
_mapper->setMapping( but, tp );
connect( but, TQ_SIGNAL( clicked() ), _mapper, TQ_SLOT( map() ) );
connect( but, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotSetNonKeepMode() ) );
connect( but, TQ_SIGNAL( doubleClicked() ), this, TQ_SLOT( slotSetKeepMode() ) );
_grp->insert( but );
but->setToggleButton( true );
TQToolTip::add( but, tooltip );
TQWhatsThis::add( but, whatsthis );
return but;
}
void RegExpButtons::slotUnSelect()
{
if ( _grp->selected() ) {
TQToolButton *pb = static_cast<TQToolButton*>(_grp->selected());
if (pb) {
pb->setOn( false );
}
}
}
void RegExpButtons::slotSetKeepMode( )
{
_keepMode = true;
}
void RegExpButtons::slotSetNonKeepMode( )
{
_keepMode = false;
}
void RegExpButtons::slotSelectNewAction()
{
if ( ! _keepMode ) {
emit doSelect();
_grp->setButton(_grp->id(_selectBut));
}
}
void RegExpButtons::setFeatures( int features )
{
_wordBoundary->setShown( features & RegExpConverter::WordBoundary );
_nonWordBoundary->setShown( features & RegExpConverter::NonWordBoundary );
_posLookAhead->setShown( features & RegExpConverter::PosLookAhead );
_negLookAhead->setShown( features & RegExpConverter::NegLookAhead );
}