/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.impl.protocol.jabber.extensions.whiteboard;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.List;
import javax.xml.parsers.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.whiteboardobjects.*;
import net.java.sip.communicator.util.*;
import org.jitsi.util.xml.*;
import org.w3c.dom.*;
/**
* WhiteboardObjectPolygonJabberImpl
* <p>
* WhiteboardObjectPolygonJabberImpl are created through
* the <tt>WhiteboardSession</tt> session.
* <p>
*
* All WhiteboardObjectPolygonJabberImpl have whiteboard object id.
* @author Julien Waechter
*/
public class WhiteboardObjectPolygonJabberImpl
extends WhiteboardObjectJabberImpl implements WhiteboardObjectPolygon
{
private static final Logger logger =
Logger.getLogger (WhiteboardObjectPolygonJabberImpl.class);
/**
* list of WhiteboardPoint
*/
private List<WhiteboardPoint> listPoints
= new LinkedList<WhiteboardPoint>();
/**
* True is filled, false is unfilled.
*/
private boolean fill;
/**
* The background color of this object
*/
private int backColor;
/**
* Default WhiteboardObjectPolygonJabberImpl constructor.
*/
public WhiteboardObjectPolygonJabberImpl ()
{
super ();
}
/**
* WhiteboardObjectPolygonJabberImpl constructor.
*
* @param xml the XML string object to parse.
*/
public WhiteboardObjectPolygonJabberImpl (String xml)
{
try
{
DocumentBuilder builder
= XMLUtils.newDocumentBuilderFactory().newDocumentBuilder();
InputStream in = new ByteArrayInputStream (xml.getBytes ());
Document doc = builder.parse (in);
Element e = doc.getDocumentElement ();
String elementName = e.getNodeName ();
if (elementName.equals ("polygon"))
{
//we have a polygon
String id = e.getAttribute ("id");
String d = e.getAttribute ("points");
String stroke = e.getAttribute ("stroke");
String stroke_width = e.getAttribute ("stroke-width");
String fill = e.getAttribute ("fill");
this.setID (id);
this.setThickness (Integer.parseInt (stroke_width));
this.setColor (Color.decode (stroke).getRGB ());
this.setPoints (getPolyPoints (d));
this.setFill (!fill.equals ("none"));
}
}
catch (ParserConfigurationException ex)
{
if (logger.isDebugEnabled())
logger.debug ("Problem WhiteboardObject : "+xml);
}
catch (IOException ex)
{
if (logger.isDebugEnabled())
logger.debug ("Problem WhiteboardObject : "+xml);
}
catch (Exception ex)
{
if (logger.isDebugEnabled())
logger.debug ("Problem WhiteboardObject : "+xml);
}
}
/**
* Sets the list of <tt>WhiteboardPoint</tt> instances that this
* <tt>WhiteboardObject</tt> is composed of.
*
* @param points the list of <tt>WhiteboardPoint</tt> instances that this
* <tt>WhiteboardObject</tt> is composed of.
*/
public void setPoints (List<WhiteboardPoint> points)
{
this.listPoints = new LinkedList<WhiteboardPoint>(points);
}
/**
* Returns a list of all the <tt>WhiteboardPoint</tt> instances that this
* <tt>WhiteboardObject</tt> is composed of.
*
* @return the list of <tt>WhiteboardPoint</tt>s composing this object.
*/
public List<WhiteboardPoint> getPoints ()
{
return this.listPoints;
}
/**
* Converts a String in a "1,3 4,5 5,5 6,6" format into
* List of <tt>WhiteboardPoint</tt>.
*
* @param points the String to be converted to a
* List of <tt>WhiteboardPoint</tt>.
* @return a List of the String points parameter
*/
private List<WhiteboardPoint> getPolyPoints (String points)
{
List<WhiteboardPoint> list = new LinkedList<WhiteboardPoint>();
if (points == null)
{
return list;
}
StringTokenizer tokenizer = new StringTokenizer (points);
while (tokenizer.hasMoreTokens ())
{
String token = tokenizer.nextToken ();
String[] coords = token.split (",");
WhiteboardPoint p = new WhiteboardPoint (
Double.parseDouble (coords[0]),
Double.parseDouble (coords[1]));
list.add (p);
}
return list;
}
/**
* Returns the fill state of the WhiteboardObject.
*
* @return True is filled, false is unfilled.
*/
public boolean isFill ()
{
return this.fill;
}
/**
* Sets the fill state of the WhiteboardObject.
* True is filled, false is unfilled.
*
* @param fill The new fill state.
*/
public void setFill (boolean fill)
{
this.fill = fill;
}
/**
* Specifies the background color for this object. The color parameter
* must be encoded with standard RGB encoding: bits 24-31 are alpha, 16-23
* are red, 8-15 are green, 0-7 are blue.
*
* @param backColor the color that we'd like to set for the background of this
* <tt>WhiteboardObject</tt> (using standard RGB encoding).
*/
public void setBackgroundColor (int backColor)
{
this.backColor = backColor;
}
/**
* Returns an integer representing the background color of this object. The
* return value uses standard RGB encoding: bits 24-31 are alpha, 16-23 are
* red, 8-15 are green, 0-7 are blue.
*
* @return the RGB value of the background color of this object.
*/
public int getBackgroundColor ()
{
return this.backColor;
}
/**
* Returns the XML representation of the PacketExtension.
*
* @return the packet extension as XML.
* @todo Implement this org.jivesoftware.smack.packet.PacketExtension
* method
*/
@Override
public String toXML ()
{
String s = "<polygon id=\"#i\" points=\"#p\" " +
"fill=\"#f\" stroke=\"#s\" stroke-width=\"#w\"/>";
s = s.replaceAll ("#i", getID ());
s = s.replaceAll ("#s", colorToHex (getColor ()));
s = s.replaceAll ("#w", ""+getThickness ());
s = s.replaceAll ("#f", ((isFill ())?colorToHex (getColor ()):"none"));
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < listPoints.size (); i++)
{
WhiteboardPoint point = listPoints.get (i);
sb.append (point.getX ());
sb.append (",");
sb.append (point.getY ());
sb.append (" ");
}
s = s.replaceAll ("#p", sb.toString ());
return s;
}
}