/* KD Tools - a set of useful widgets for TQt */ /**************************************************************************** ** Copyright (C) 2001-2003 Klarälvdalens Datakonsult AB. All rights reserved. ** ** This file is part of the KD Tools library. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** Licensees holding valid commercial KD Tools licenses may use this file in ** accordance with the KD Tools Commercial License Agreement provided with ** the Software. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.klaralvdalens-datakonsult.se/?page=products for ** information about KD Tools Commercial License Agreements. ** ** Contact info@klaralvdalens-datakonsult.se if any conditions of this ** licensing are not clear to you. ** **********************************************************************/ #include #include #include #include #include #if defined( SUN7 ) || defined( _SGIAPI ) #include #else #include #endif #ifdef TQ_WS_WIN #define M_PI 3.14159265358979323846 #endif KDFrame::~KDFrame() { _profileSections.clear(); // is ignored if auto-deletion is disabled } KDFrame::KDFrameCorner::~KDFrameCorner() { // Intentionally left blank for now. } void KDFrame::paintBackground( TQPainter& painter, const TQRect& innerRect ) const { /* first draw the brush (may contain a pixmap)*/ if( TQt::NoBrush != _background.style() ) { TQPen oldPen( painter.pen() ); TQPoint oldOrig( painter.brushOrigin() ); TQBrush oldBrush( painter.brush() ); painter.setPen( TQt::NoPen ); const TQPoint newTopLeft( painter.xForm( innerRect.topLeft() ) ); painter.setBrushOrigin( newTopLeft.x(), newTopLeft.y() ); painter.setBrush( _background ); painter.drawRect( innerRect.x(), innerRect.y(), innerRect.width(), innerRect.height() ); painter.setPen( oldPen ); painter.setBrushOrigin( oldOrig ); painter.setBrush( oldBrush ); } /* next draw the backPixmap over the brush */ if( ! _backPixmap.isNull() ) { TQPoint ol = innerRect.topLeft(); if( PixCentered == _backPixmapMode ) { ol.setX( innerRect.center().x() - _backPixmap.width() / 2 ); ol.setY( innerRect.center().y() - _backPixmap.height()/ 2 ); bitBlt( painter.device(), ol, &_backPixmap ); } else { TQWMatrix m; double zW = (double)innerRect.width() / (double)_backPixmap.width(); double zH = (double)innerRect.height() / (double)_backPixmap.height(); switch ( _backPixmapMode ) { case PixCentered: break; case PixScaled: { double z; z = TQMIN( zW, zH ); m.scale( z, z ); } break; case PixStretched: m.scale( zW, zH ); break; } TQPixmap pm = _backPixmap.xForm( m ); ol.setX( innerRect.center().x() - pm.width() / 2 ); ol.setY( innerRect.center().y() - pm.height()/ 2 ); bitBlt( painter.device(), ol, &pm ); } } } void KDFrame::paintEdges( TQPainter& painter, const TQRect& innerRect ) const { /* Note: The following code OF COURSE is only dummy-code and will be replaced. At the moment it is used to draw the simple frames which were set by the setSimpleFrame() function. */ if( !_topProfile.isEmpty() ){ KDFrameProfileSection* section; for ( section = ((KDFrameProfile)_topProfile).last(); section; section = ((KDFrameProfile)_topProfile).prev() ){ const TQPen oldPen = painter.pen(); const TQBrush oldBrush = painter.brush(); TQPen thePen; thePen = section->pen(); int penWidth = TQMAX(thePen.width(), 1) * TQMAX(section->width(), 1); //tqDebug("paintEdges: thePen.width() = %i", thePen.width()); //tqDebug("paintEdges: section->width() = %i", section->width()); //tqDebug("paintEdges: penWidth = %i", penWidth); thePen.setWidth( penWidth ); painter.setPen( thePen ); painter.setBrush( TQt::NoBrush ); painter.drawRect( innerRect.x()-penWidth, innerRect.y()-penWidth, innerRect.width() +2*penWidth, innerRect.height() +2*penWidth ); painter.setBrush( oldBrush ); painter.setPen( oldPen ); } } } void KDFrame::paintCorners( TQPainter& /*painter*/, const TQRect& /*innerRect*/ ) const { // At the moment nothing is done here since the setSimpleFrame() function // does not allow specifying corners: all predefined frames have normal // (default) corners. ; } void KDFrame::paint( TQPainter* painter, KDFramePaintSteps steps, TQRect innerRect ) const { if( painter ) { const TQRect& rect = innerRect.isValid() ? innerRect : _innerRect; switch( steps ) { case PaintBackground: paintBackground( *painter, rect ); break; case PaintEdges: paintEdges( *painter, rect ); break; case PaintCorners: paintCorners( *painter, rect ); break; case PaintBorder: paintEdges( *painter, rect ); paintCorners( *painter, rect ); break; case PaintAll: paintBackground( *painter, rect ); paintEdges( *painter, rect ); paintCorners( *painter, rect ); break; } } } void KDFrame::clearProfile( ProfileName name ) { switch( name ) { case ProfileTop: _topProfile.clear(); break; case ProfileRight: _rightProfile.clear(); break; case ProfileBottom:_bottomProfile.clear(); break; case ProfileLeft: _leftProfile.clear(); break; } } void KDFrame::addProfileSection( ProfileName name, int wid, TQPen pen, KDFrameProfileSection::Direction dir, KDFrameProfileSection::Curvature curv ) { switch( name ) { case ProfileTop: _topProfile.append( new KDFrameProfileSection( dir, curv, wid, pen ) ); break; case ProfileRight: _rightProfile.append( new KDFrameProfileSection( dir, curv, wid, pen ) ); break; case ProfileBottom:_bottomProfile.append(new KDFrameProfileSection( dir, curv, wid, pen ) ); break; case ProfileLeft: _leftProfile.append( new KDFrameProfileSection( dir, curv, wid, pen ) ); break; } } void KDFrame::setProfile( ProfileName name, const KDFrameProfile& profile ) { switch( name ) { case ProfileTop: _topProfile = profile; break; case ProfileRight: _rightProfile = profile; break; case ProfileBottom:_bottomProfile = profile; break; case ProfileLeft: _leftProfile = profile; break; } } const KDFrameProfile& KDFrame::profile( ProfileName name ) const { switch( name ) { case ProfileTop: return _topProfile; break; case ProfileRight: return _rightProfile; break; case ProfileBottom:return _bottomProfile; break; default: return _leftProfile; } return _leftProfile; } void KDFrame::setSimpleFrame( SimpleFrame frame, int lineWidth, int midLineWidth, TQPen pen, TQBrush background, const TQPixmap* backPixmap, BackPixmapMode backPixmapMode ) { _profileSections.clear(); _topProfile.clear(); _rightProfile.clear(); _bottomProfile.clear(); _leftProfile.clear(); _background = background; _backPixmap = backPixmap ? *backPixmap : TQPixmap(); _backPixmapMode = backPixmapMode; if( FrameFlat == frame ) { //tqDebug("_profileSections.count() before = %i", _profileSections.count()); KDFrameProfileSection* newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); //tqDebug( "_profileSections.count() after = %i, lineWidth = %i", // _profileSections.count(), // lineWidth ); _topProfile.append( newsection ); _rightProfile = _topProfile; _bottomProfile = _topProfile; _leftProfile = _topProfile; } else { switch( frame ) { case FrameElegance: { int line1 = lineWidth / 8; int line2 = lineWidth / 16; int line3 = line2; int gap2 = line2 * 4; int gap1 = lineWidth - line1 - line2 - line3 - gap2; TQPen noP( TQt::NoPen ); KDFrameProfileSection* newsection; newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, line1, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, gap1, noP ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, line2, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, gap2, noP ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, line3, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); } break; case FrameBoxRaized: { KDFrameProfileSection* newsection; newsection = new KDFrameProfileSection( KDFrameProfileSection::DirRaising, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, midLineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirSinking, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); break; } case FrameBoxSunken: { KDFrameProfileSection* newsection; newsection = new KDFrameProfileSection( KDFrameProfileSection::DirSinking, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, midLineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirRaising, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); } break; case FramePanelRaized: { KDFrameProfileSection* newsection; newsection = new KDFrameProfileSection( KDFrameProfileSection::DirRaising, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); break; } case FramePanelSunken: { KDFrameProfileSection* newsection; newsection = new KDFrameProfileSection( KDFrameProfileSection::DirSinking, KDFrameProfileSection::CvtPlain, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); } break; case FrameSemicircular: { KDFrameProfileSection* newsection; newsection = new KDFrameProfileSection( KDFrameProfileSection::DirRaising, KDFrameProfileSection::CvtConvex, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirPlain, KDFrameProfileSection::CvtPlain, midLineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); newsection = new KDFrameProfileSection( KDFrameProfileSection::DirSinking, KDFrameProfileSection::CvtConcave, lineWidth, pen ); _profileSections.append( newsection ); _topProfile.append( newsection ); } break; default: break; } } _rightProfile = _topProfile; _bottomProfile = _topProfile; _leftProfile = _topProfile; setCorners( CornerNormal, 0 ); } void KDFrame::createFrameNode( TQDomDocument& document, TQDomNode& parent, const TQString& elementName, const KDFrame& frame ) { TQDomElement frameElement = document.createElement( elementName ); parent.appendChild( frameElement ); KDXML::createIntNode( document, frameElement, "ShadowWidth", frame._shadowWidth ); KDXML::createStringNode( document, frameElement, "CornerName", cornerNameToString( frame._sunPos ) ); KDXML::createBrushNode( document, frameElement, "Background", frame._background ); KDXML::createPixmapNode( document, frameElement, "BackPixmap", frame._backPixmap ); KDXML::createStringNode( document, frameElement, "BackPixmapMode", backPixmapModeToString( frame._backPixmapMode ) ); KDXML::createRectNode( document, frameElement, "InnerRect", frame._innerRect ); createFrameProfileNode( document, frameElement, "TopProfile", frame._topProfile ); createFrameProfileNode( document, frameElement, "RightProfile", frame._rightProfile ); createFrameProfileNode( document, frameElement, "BottomProfile", frame._bottomProfile ); createFrameProfileNode( document, frameElement, "LeftProfile", frame._leftProfile ); KDFrameCorner::createFrameCornerNode( document, frameElement, "CornerTL", frame._cornerTL ); KDFrameCorner::createFrameCornerNode( document, frameElement, "CornerTR", frame._cornerTR ); KDFrameCorner::createFrameCornerNode( document, frameElement, "CornerBL", frame._cornerBL ); KDFrameCorner::createFrameCornerNode( document, frameElement, "CornerBR", frame._cornerBR ); } void KDFrame::createFrameProfileNode( TQDomDocument& document, TQDomNode& parent, const TQString& elementName, KDFrameProfile profile ) { TQDomElement profileElement = document.createElement( elementName ); parent.appendChild( profileElement ); for( const KDFrameProfileSection* section = profile.first(); section != 0; section = profile.next() ) KDFrameProfileSection::createFrameProfileSectionNode( document, profileElement, "ProfileSection", section ); } void KDFrame::KDFrameCorner::createFrameCornerNode( TQDomDocument& document, TQDomNode& parent, const TQString& elementName, const KDFrameCorner& corner ) { TQDomElement cornerElement = document.createElement( elementName ); parent.appendChild( cornerElement ); KDXML::createStringNode( document, cornerElement, "Style", KDFrame::cornerStyleToString( corner._style ) ); KDXML::createIntNode( document, cornerElement, "Width", corner._width ); createFrameProfileNode( document, cornerElement, "Profile", corner._profile ); } bool KDFrame::readFrameNode( const TQDomElement& element, KDFrame& frame ) { bool ok = true; int tempShadowWidth; CornerName tempCornerName=CornerTopLeft; TQBrush tempBackground; TQPixmap tempBackPixmap; BackPixmapMode tempBackPixmapMode=PixStretched; TQRect tempInnerRect; KDFrameProfile tempTopProfile, tempRightProfile, tempBottomProfile, tempLeftProfile; KDFrameCorner tempCornerTL, tempCornerTR, tempCornerBL, tempCornerBR; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "ShadowWidth" ) { ok = ok & KDXML::readIntNode( element, tempShadowWidth ); } else if( tagName == "CornerName" ) { TQString value; ok = ok & KDXML::readStringNode( element, value ); tempCornerName = stringToCornerName( value ); } else if( tagName == "Background" ) { ok = ok & KDXML::readBrushNode( element, tempBackground ); } else if( tagName == "BackPixmap" ) { ok = ok & KDXML::readPixmapNode( element, tempBackPixmap ); } else if( tagName == "BackPixmapMode" ) { TQString value; ok = ok & KDXML::readStringNode( element, value ); tempBackPixmapMode = stringToBackPixmapMode( value ); } else if( tagName == "InnerRect" ) { ok = ok & KDXML::readRectNode( element, tempInnerRect ); } else if( tagName == "TopProfile" ) { ok = ok & readFrameProfileNode( element, tempTopProfile ); } else if( tagName == "RightProfile" ) { ok = ok & readFrameProfileNode( element, tempRightProfile ); } else if( tagName == "BottomProfile" ) { ok = ok & readFrameProfileNode( element, tempBottomProfile ); } else if( tagName == "LeftProfile" ) { ok = ok & readFrameProfileNode( element, tempLeftProfile ); } else if( tagName == "CornerTL" ) { ok = ok & KDFrameCorner::readFrameCornerNode( element, tempCornerTL ); } else if( tagName == "CornerTR" ) { ok = ok & KDFrameCorner::readFrameCornerNode( element, tempCornerTR ); } else if( tagName == "CornerBL" ) { ok = ok & KDFrameCorner::readFrameCornerNode( element, tempCornerBL ); } else if( tagName == "CornerBR" ) { ok = ok & KDFrameCorner::readFrameCornerNode( element, tempCornerBR ); } else { tqDebug( "Unknown tag in frame" ); } } node = node.nextSibling(); } if( ok ) { frame._shadowWidth = tempShadowWidth; frame._sunPos = tempCornerName; frame._background = tempBackground; frame._backPixmap = tempBackPixmap; frame._backPixmapMode = tempBackPixmapMode; frame._innerRect = tempInnerRect; frame._topProfile = tempTopProfile; frame._rightProfile = tempRightProfile; frame._bottomProfile = tempBottomProfile; frame._leftProfile = tempLeftProfile; frame._cornerTL = tempCornerTL; frame._cornerTR = tempCornerTR; frame._cornerBL = tempCornerBL; frame._cornerBR = tempCornerBR; } return ok; } bool KDFrame::readFrameProfileNode( const TQDomElement& element, KDFrameProfile& profile ) { TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "ProfileSection" ) { KDFrameProfileSection* section = new KDFrameProfileSection(); KDFrameProfileSection::readFrameProfileSectionNode( element, section ); profile.append( section ); } else { tqDebug( "Unknown tag in double map" ); return false; } } node = node.nextSibling(); } return true; } bool KDFrame::KDFrameCorner::readFrameCornerNode( const TQDomElement& element, KDFrameCorner& corner ) { bool ok = true; CornerStyle tempStyle=CornerNormal; int tempWidth; KDFrameProfile tempProfile; TQDomNode node = element.firstChild(); while( !node.isNull() ) { TQDomElement element = node.toElement(); if( !element.isNull() ) { // was really an element TQString tagName = element.tagName(); if( tagName == "Style" ) { TQString value; ok = ok & KDXML::readStringNode( element, value ); tempStyle = stringToCornerStyle( value ); } else if( tagName == "Width" ) { ok = ok & KDXML::readIntNode( element, tempWidth ); } else if( tagName == "Profile" ) { KDFrameProfile profile; ok = ok & readFrameProfileNode( element, profile ); } else { tqDebug( "Unknown tag in frame" ); } } node = node.nextSibling(); } if( ok ) { corner._style = tempStyle; corner._width = tempWidth; corner._profile = tempProfile; } return ok; } #include "KDFrame.moc"