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.
koffice/kword/KWTextImage.cpp

162 lines
5.7 KiB

/* This file is part of the KDE project
Copyright (C) 2001 David Faure <faure@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 as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
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.
*/
#include <kdebug.h>
#include <KoPictureCollection.h>
#include "KWDocument.h"
#include "defs.h"
#include "KWTextFrameSet.h"
#include "KWTextImage.h"
KWTextImage::KWTextImage( KWTextDocument *textdoc, const TQString & filename )
: KoTextCustomItem( textdoc ), place( PlaceInline )
{
KWDocument * doc = textdoc->textFrameSet()->kWordDocument();
if ( !filename.isEmpty() )
{
m_image = doc->pictureCollection()->loadPicture( filename );
Q_ASSERT( !m_image.isNull() );
resize(); // Zoom if necessary
}
}
void KWTextImage::setImage( const KoPictureCollection & collection )
{
kdDebug(32001) << "Loading text image " << m_image.getKey().toString() << " (in KWTextImage::setImage)" << endl;
m_image=collection.findPicture( m_image.getKey() );
Q_ASSERT( !m_image.isNull() );
kdDebug(32001) << "size: " << m_image.getOriginalSize().width() << "x" << m_image.getOriginalSize().height() << endl;
resize();
}
void KWTextImage::resize()
{
if ( m_deleted )
return;
if ( !m_image.isNull() ) {
//KWDocument * doc = static_cast<KWTextDocument *>(parent)->textFrameSet()->kWordDocument();
width = m_image.getOriginalSize().width();
// width is a 100%-zoom pixel size. We want a LU pixel size -> we simply need 'to LU', i.e. ptToLayoutPt
width = KoTextZoomHandler::ptToLayoutUnitPt( width );
height = m_image.getOriginalSize().height();
height = KoTextZoomHandler::ptToLayoutUnitPt( height );
kdDebug() << "KWTextImage::resize: " << width << ", " << height << endl;
// no! m_image.setSize( TQSize( width, height ) );
}
}
void KWTextImage::drawCustomItem( TQPainter* p, int x, int y, int wpix, int hpix, int /*ascentpix*/, int cx, int cy, int cw, int ch, const TQColorGroup& cg, bool selected, int /*offset*/, bool drawingShadow)
{
if ( drawingShadow )
return;
// (x,y) is the position of the inline item (in pixels)
// (wpix,hpix) is the size of the inline item (in pixels)
// (cx,cy,cw,ch) is the rectangle to be painted, in pixels too
if ( m_image.isNull() ) {
kdDebug() << "KWTextImage::draw null image!" << endl;
p->fillRect( x, y, 50, 50, cg.dark() );
return;
}
TQSize imgSize( wpix, hpix );
TQRect rect( TQPoint(x, y), imgSize );
if ( !rect.intersects( TQRect( cx, cy, cw, ch ) ) )
return;
TQPixmap pixmap=m_image.generatePixmap( imgSize, true );
//if ( placement() == PlaceInline )
p->drawPixmap( x, y, pixmap );
//else
// p->drawPixmap( cx, cy, pixmap, cx - x, cy - y, cw, ch );
if ( selected && placement() == PlaceInline && p->device()->devType() != TQInternal::Printer ) {
p->fillRect( rect , TQBrush( cg.highlight(), TQBrush::Dense4Pattern) );
}
}
void KWTextImage::save( TQDomElement & parentElem )
{
// This code is similar to KWPictureFrameSet::save
KWDocument * doc = static_cast<KWTextDocument *>(parent)->textFrameSet()->kWordDocument();
TQDomElement imageElem = parentElem.ownerDocument().createElement( "PICTURE" );
parentElem.appendChild( imageElem );
//imageElem.setAttribute( "keepAspectRatio", "true" );
TQDomElement elem = parentElem.ownerDocument().createElement( "KEY" );
imageElem.appendChild( elem );
image().getKey().saveAttributes( elem );
// Now we must take care that a <KEY> element will be written as a child of <PICTURES>
doc->addTextImageRequest( this );
}
void KWTextImage::load( TQDomElement & parentElem )
{
// This code is similar to KWPictureFrameSet::load
KWDocument * doc = static_cast<KWTextDocument *>(parent)->textFrameSet()->kWordDocument();
// <IMAGE> (KOffice 1.0) or <PICTURE> (KWord 1.2)
TQDomNode node=parentElem.namedItem( "PICTURE" );
if ( node.isNull() )
{
node=parentElem.namedItem( "IMAGE" );
}
TQDomElement image = node.toElement();
if ( image.isNull() )
image = parentElem; // The data is directly child of <FORMAT>
// <KEY>
TQDomElement keyElement = image.namedItem( "KEY" ).toElement();
if ( !keyElement.isNull() )
{
KoPictureKey key;
key.loadAttributes( keyElement );
m_image.setKey(key);
doc->addTextImageRequest( this );
}
else
{
// <FILENAME> (old format, up to KWord-1.1-beta2)
TQDomElement filenameElement = image.namedItem( "FILENAME" ).toElement();
if ( !filenameElement.isNull() )
{
TQString filename = filenameElement.attribute( "value" );
m_image.setKey( KoPictureKey( filename ) );
doc->addTextImageRequest( this );
}
else
{
kdError(32001) << "Missing KEY or FILENAME tag in IMAGE (KWTextImage::load)" << endl;
}
}
}
KoPictureKey KWTextImage::getKey( void ) const
{
return m_image.getKey();
}
void KWTextImage::saveOasis( KoXmlWriter&, KoSavingContext& ) const
{
// Not implemented
}