COSC-4P82-Final-Project/lib/beagle-3.0.3/PACC/SVG/Canvas.cpp

166 lines
4.6 KiB
C++

/*
* Portable Agile C++ Classes (PACC)
* Copyright (C) 2001-2003 by Marc Parizeau
* http://manitou.gel.ulaval.ca/~parizeau/PACC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact:
* Laboratoire de Vision et Systemes Numeriques
* Departement de genie electrique et de genie informatique
* Universite Laval, Quebec, Canada, G1K 7P4
* http://vision.gel.ulaval.ca
*
*/
/*!\file PACC/SVG/Canvas.cpp
* \brief Class methods for the SVG containers (Group, Frame, and Canvas).
* \author Marc Parizeau and Michel Fortin, Laboratoire de vision et systèmes numériques, Université Laval
* $Revision: 1.5.2.1 $
* $Date: 2007/09/10 18:24:08 $
*/
#include "SVG/Canvas.hpp"
#include "XML/Finder.hpp"
#include <iostream>
#include <sstream>
using namespace std;
using namespace PACC;
/*!
*/
void SVG::Canvas::clear(void)
{
// find embedded group tag
XML::Finder lFinder(this);
XML::Iterator lPos = lFinder.find("/svg/g");
((Group&)*lPos).clear();
// send empty canvas to viewer
updateViewer();
}
/*!
*/
SVG::Canvas& SVG::Canvas::operator<<(const SVG::Primitive& inElement)
{
// find embedded group tag
XML::Finder lFinder(this);
XML::Iterator lPos = lFinder.find("/svg/g");
// insert new element into internal group.
((Group&)*lPos) << inElement;
// send serialized canvas to viewer
updateViewer();
return *this;
}
/*!
*/
SVG::Canvas& SVG::Canvas::operator=(const SVG::Frame &inFrame)
{
// find embedded group tag
XML::Finder lFinder(this);
XML::Iterator lPos = lFinder.find("/svg/g");
((Group&)*lPos).clear();
((Group&)*lPos) << inFrame;
updateViewer();
return *this;
}
//!
string SVG::Canvas::getTitle(void) const
{
// find embedded title tag
XML::Finder lFinder((XML::Node*)this);
XML::Iterator lPos = lFinder.find("/svg/title");
// return title value
if(lPos && lPos->getFirstChild()) return lPos->getFirstChild()->getValue();
else return "";
}
//! This method also adjusts the frame attributes, and connect to the viewer.
void SVG::Canvas::initCanvas(const string& inTitle)
{
// insert title
setTitle(inTitle);
// insert xmlns attribute
setAttribute("xmlns", "http://www.w3.org/2000/svg");
// remove position attributes
removeAttribute("x");
removeAttribute("y");
// insert change of referential group
SVG::Group lGroup;
lGroup.setTransform(Scale(1, -1)+Translate(0, -String::convertToFloat(getAttribute("height"))));
insertAsLastChild(new Node((Node&)lGroup));
// allocate socket
if(mSocket) delete mSocket;
mSocket = new Socket::Cafe(Socket::Address(mPort, mAddress));
// send serialize canvas to viewer
ostringstream lStream;
lStream << "NEWW ";
write(lStream);
mSocket->sendMessage(lStream.str());
mSocket->receiveMessage(mWinID);
}
//!
void SVG::Canvas::updateViewer(void) const
{
// make the message
ostringstream lStream;
lStream << "REFR" << mWinID;
write(lStream);
// try send the message
try {
mSocket->sendMessage(lStream.str());
} catch(const Socket::Exception& inErr) {
// try reconnecting once
mSocket->connect(Socket::Address(mPort, mAddress));
mSocket->sendMessage(lStream.str());
}
}
//!
void SVG::Canvas::setTitle(const string& inTitle)
{
// find embedded title tag
XML::Finder lFinder((XML::Node*)this);
XML::Iterator lPos = lFinder.find("/svg/title");
// update title value
if(lPos) {
if(lPos->getFirstChild()) lPos->getFirstChild()->setValue(inTitle);
else lPos->insertAsLastChild(new Node(inTitle, XML::eString));
} else {
lPos = insertAsLastChild(new Node("title"));
lPos->insertAsLastChild(new Node(inTitle, XML::eString));
}
}
/*!
*/
SVG::Point SVG::Canvas::waitForClick(int &outButtonClicked, double inMaxDelay) const
{
ostringstream lOutStream;
lOutStream << "GCLK" << mWinID;
mSocket->sendMessage(lOutStream.str());
string lMessage;
mSocket->receiveMessage(lMessage);
Point lPos;
istringstream lInStream(lMessage);
lInStream >> lPos.x >> lPos.y >> outButtonClicked;
lPos.y = getSize().height - lPos.y;
return lPos;
}