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/compoundwidget.cpp

325 lines
9.5 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 <tdelocale.h>
#include <kdialogbase.h>
#include <kiconloader.h>
#include "compoundwidget.moc"
#endif
#include "compoundwidget.h"
#include <tqlayout.h>
#include <tqcursor.h>
#include <tqlineedit.h>
#include <tqpainter.h>
#include <tqtooltip.h>
#include "concwidget.h"
#include "kwidgetstreamer.h"
#include "tqcheckbox.h"
//================================================================================
CompoundDetailWindow::CompoundDetailWindow( TQWidget* parent, const char* name )
:TQWidget( parent, name )
{
TQVBoxLayout* layout = new TQVBoxLayout( this );
layout->setAutoAdd( true );
TQLabel* label = new TQLabel( i18n("&Title:"), this);
_title = new TQLineEdit( this );
label->setBuddy( _title );
label = new TQLabel( i18n("&Description:"), this );
_description = new TQMultiLineEdit( this );
label->setBuddy( _description );
_allowReplace = new TQCheckBox( i18n("&Automatically replace using this item"), this );
TQToolTip::add( _allowReplace, i18n("When the content of this box is typed in to the ASCII line,<br>"
"this box will automatically be added around it,<br>"
"if this check box is selected.") );
_allowReplace->setChecked( true );
_title->setFocus();
}
TQString CompoundDetailWindow::title() const
{
return _title->text();
}
TQString CompoundDetailWindow::description() const
{
return _description->text();
}
bool CompoundDetailWindow::allowReplace() const
{
return _allowReplace->isChecked();
}
void CompoundDetailWindow::setTitle( TQString txt )
{
_title->setText( txt );
}
void CompoundDetailWindow::setDescription( TQString txt )
{
_description->setText( txt );
}
void CompoundDetailWindow::setAllowReplace( bool b )
{
_allowReplace->setChecked( b );
}
//================================================================================
CompoundWidget::CompoundWidget( RegExpEditorWindow* editorWindow, TQWidget* parent,
const char* name )
:SingleContainerWidget( editorWindow, parent, name == 0 ? "CompoundWidget" : name )
{
_child = new ConcWidget( editorWindow, this );
init();
}
CompoundWidget::CompoundWidget( CompoundRegExp* regexp, RegExpEditorWindow* editorWindow,
TQWidget* parent, const char* name )
: SingleContainerWidget( editorWindow, parent, name == 0 ? "CompoundWidget" : name )
{
init();
_content->setTitle( regexp->title() );
_content->setDescription( regexp->description() );
_content->setAllowReplace( regexp->allowReplace() );
RegExpWidget* child = WidgetFactory::createWidget( regexp->child(), _editorWindow, this );
if ( !( _child = dynamic_cast<ConcWidget*>(child) ) ) {
_child = new ConcWidget( _editorWindow, child, this );
}
_hidden = regexp->hidden();
}
void CompoundWidget::init( )
{
_configWindow = new KDialogBase( this, "_configWindow", true,
i18n("Configure Compound"),
KDialogBase::Ok | KDialogBase::Cancel );
_content = new CompoundDetailWindow( _configWindow );
_configWindow->setMainWidget( _content );
connect( _configWindow, TQ_SIGNAL(cancelClicked()), this, TQ_SLOT(slotConfigCanceled())) ;
connect(_configWindow, TQ_SIGNAL(finished()), this, TQ_SLOT(slotConfigWindowClosed()));
_down = getIcon( TQString::fromLocal8Bit( "1downarrow" ));
_up = getIcon( TQString::fromLocal8Bit( "1uparrow" ) );
_hidden = false;
_backRefId = -1;
}
TQSize CompoundWidget::sizeHint() const
{
TQFontMetrics metrics = fontMetrics();
_childSize = _child->sizeHint();
_textSize = metrics.size( 0, _content->title() );
int width, height;
if ( _hidden ) {
_pixmapSize = _up.size();
width = 2*pw + TQMAX( 2*bdSize+_textSize.width(), 2*bdSize+_pixmapSize.width());
height = _pixmapSize.height() + 2*bdSize + _textSize.height()+pw;
}
else {
_pixmapSize = _down.size();
int headerLineWidth = 2*pw + 2*bdSize + _pixmapSize.width();
if ( _textSize.width() != 0)
headerLineWidth += 3*bdSize + _textSize.width();
width = TQMAX( 2*pw + _childSize.width(), headerLineWidth );
height = TQMAX( _textSize.height(), _pixmapSize.height() ) +
2*bdSize + _childSize.height() + pw;
}
return TQSize( width, height );
}
void CompoundWidget::paintEvent( TQPaintEvent *e )
{
TQSize mySize = sizeHint();
TQPainter painter(this);
drawPossibleSelection( painter, mySize);
int horLineY, childY;
// draw top line
if ( _hidden ) {
horLineY = _pixmapSize.height()/2;
childY = _pixmapSize.height() + bdSize;
_pixmapPos = TQPoint( mySize.width()-pw-bdSize-_pixmapSize.width(), 0 );
painter.drawLine( pw, horLineY, _pixmapPos.x(), horLineY );
painter.drawLine( mySize.width() - bdSize - pw, horLineY,
mySize.width(), horLineY);
painter.drawPixmap( _pixmapPos, _up );
}
else {
int maxH = TQMAX( _textSize.height(), _pixmapSize.height() );
int offset = 0;
horLineY = maxH/2;
childY = maxH+bdSize;
painter.drawLine(pw, horLineY, bdSize, horLineY);
if ( _textSize.width() != 0 ) {
offset += pw + 2*bdSize;
painter.drawText(offset, horLineY-_textSize.height()/2,
bdSize+_textSize.width(), horLineY+_textSize.height()/2,
0, _content->title());
offset += _textSize.width() + bdSize;
}
_pixmapPos = TQPoint( mySize.width()-pw-bdSize-_pixmapSize.width(),
horLineY - _pixmapSize.height()/2 );
painter.drawLine( offset, horLineY, _pixmapPos.x(), horLineY );
painter.drawPixmap( _pixmapPos, _down );
painter.drawLine( mySize.width()-bdSize-pw, horLineY, mySize.width(), horLineY );
}
// draw rest frame
painter.drawLine(0, horLineY, 0, mySize.height() );
painter.drawLine( mySize.width()-pw, horLineY, mySize.width()-pw, mySize.height() );
painter.drawLine( 0, mySize.height()-pw, mySize.width(), mySize.height()-pw );
// place/size child
if ( _hidden ) {
_child->hide();
painter.drawText( pw+bdSize, childY,
pw+bdSize+_textSize.width(), childY+_textSize.height(), 0,
_content->title() );
}
else {
TQSize curSize = _child->size();
TQSize newSize = TQSize( TQMAX( _child->sizeHint().width(), mySize.width()-2*pw),
_child->sizeHint().height());
_child->move( pw, childY );
if ( curSize != newSize ) {
_child->resize(newSize);
// I resized the child, so give it a chance to relect thus.
_child->update();
}
_child->show();
}
RegExpWidget::paintEvent( e );
}
void CompoundWidget::slotConfigWindowClosed()
{
_editorWindow->updateContent( 0 );
update();
}
void CompoundWidget::slotConfigCanceled()
{
TQDataStream stream( _backup, IO_ReadOnly );
KWidgetStreamer streamer;
streamer.fromStream( stream, _content );
repaint();
}
RegExp* CompoundWidget::regExp() const
{
return new CompoundRegExp( isSelected(), _content->title(), _content->description(),
_hidden, _content->allowReplace(), _child->regExp() );
}
void CompoundWidget::mousePressEvent( TQMouseEvent* event )
{
if ( event->button() == TQt::LeftButton &&
TQRect( _pixmapPos, _pixmapSize ).contains( event->pos() ) ) {
// Skip otherwise we will never see the mouse release
// since it is eaten by Editor window.
}
else
SingleContainerWidget::mousePressEvent( event );
}
void CompoundWidget::mouseReleaseEvent( TQMouseEvent* event)
{
if ( event->button() == TQt::LeftButton &&
TQRect( _pixmapPos, _pixmapSize ).contains( event->pos() ) ) {
_hidden = !_hidden;
_editorWindow->updateContent( 0 );
repaint(); // is this necesary?
_editorWindow->emitChange();
}
else
SingleContainerWidget::mouseReleaseEvent( event );
}
bool CompoundWidget::updateSelection( bool parentSelected )
{
if ( _hidden ) {
bool changed = RegExpWidget::updateSelection( parentSelected );
_child->selectWidget( _isSelected );
if (changed)
repaint();
return changed;
}
else {
return SingleContainerWidget::updateSelection( parentSelected );
}
}
int CompoundWidget::edit()
{
_configWindow->move(TQCursor::pos() - TQPoint(_configWindow->sizeHint().width()/2,
_configWindow->sizeHint().height()/2) );
TQDataStream stream( _backup, IO_WriteOnly );
KWidgetStreamer streamer;
streamer.toStream( _content, stream );
return _configWindow->exec();
}
int nextId()
{
static int counter = 0;
return ++counter;
}
TQPixmap CompoundWidget::getIcon( const TQString& name )
{
#ifdef TQT_ONLY
TQPixmap pix;
pix.convertFromImage( qembed_findImage(name) );
return pix;
#else
return SmallIcon( name );
#endif
}