Select Git revision
utilities.py
DrawingController.java 7.58 KiB
package server;
import remote.IDrawingController;
import remote.IDrawingUpdate;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
public class DrawingController extends UnicastRemoteObject implements IDrawingController {
private final static int AREA_WIDTH = 600;
private final static int AREA_HEIGHT = 600;
private Server server;
// private SerializableImage bufferedImage;
private BufferedImage bufferedImage;
private Graphics2D g2;
private ArrayList<Shape> shapeList;
private ArrayList<Color> colorList;
private ArrayList<Integer> strokeSizeList;
private ArrayList<String> textList;
private ArrayList<Font> fontList;
private ArrayList<Point> textStartPointList;
protected DrawingController(Server server) throws RemoteException {
this.server = server;
// this.bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
// g2 = (Graphics2D) bufferedImage.getGraphics();
// g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
this.bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
this.shapeList = new ArrayList<Shape>();
this.colorList = new ArrayList<Color>();
this.strokeSizeList = new ArrayList<Integer>();
this.textList = new ArrayList<String>();
this.fontList = new ArrayList<Font>();
this.textStartPointList = new ArrayList<Point>();
}
@Override
public boolean broadcastText(String fromClient, String text, Font font, Point startPoint) throws RemoteException {
System.out.print("Broadcasting drawing to everyone...");
textList.add(text);
fontList.add(font);
textStartPointList.add(startPoint);
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setFont(font);
g2.drawString(text, startPoint.x, startPoint.y);
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
IDrawingUpdate client;
for( User u : server.users )
{
if (!u.getUserName().equals(fromClient)) {
client = u.getIDrawingUpdate();
client.notifyTextDrawing(fromClient, text, font, startPoint);
}
}
System.out.print("...DONE\n");
return true;
}
@Override
public boolean broadcastDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
System.out.print("Broadcasting drawing to everyone...");
shapeList.add(drawing);
colorList.add(color);
strokeSizeList.add(strokeSize);
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
switch (mode) {
case "OVAL":
case "RECTANGLE":
case "CIRCLE":
case "FREEHAND":
case "LINE":
g2.setColor(color);
// g2.fill(drawing); /// Uncomment the line to fill the shapes with color ///
g2.setStroke(new BasicStroke(strokeSize));
g2.draw(drawing);
break;
case "TEXT":
case "ERASE":
default:
break;
}
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setColor(color);
IDrawingUpdate client;
for( User u : server.users )
{
if (!u.getUserName().equals(fromClient)) {
client = u.getIDrawingUpdate();
client.notifyDrawing(fromClient, drawing, mode, color, strokeSize);
}
}
System.out.print("...DONE\n");
return true;
}
public boolean broadcastDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException {
System.out.print("Broadcasting dragging drawing to everyone...");
if (mode.equals("FREEHAND")) {
shapeList.add(drawing);
colorList.add(color);
strokeSizeList.add(strokeSize);
}
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
switch (mode) {
case "FREEHAND":
g2.setColor(color);
g2.setStroke(new BasicStroke(strokeSize));
g2.draw(drawing);
break;
case "ERASE":
g2.setColor(Color.WHITE);
g2.fill(drawing);
g2.draw(drawing);
break;
default:
break;
}
g2 = (Graphics2D) bufferedImage.getGraphics();
g2.setColor(color);
IDrawingUpdate client;
for( User u : server.users )
{
if (!u.getUserName().equals(fromClient)) {
client = u.getIDrawingUpdate();
client.notifyDraggingDrawing(fromClient, drawing, mode, color, strokeSize);
}
}
System.out.print("...DONE\n");
return true;
}
public boolean broadcastClearCanvas(String fromClient) throws RemoteException {
System.out.print("Broadcasting canvas clearance to everyone...");
IDrawingUpdate client;
this.shapeList.clear();
this.colorList.clear();
this.strokeSizeList.clear();
this.textList.clear();
this.fontList.clear();
this.textStartPointList.clear();
BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
g2 = (Graphics2D) image.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for( User u : server.users )
{
if (!u.getUserName().equals(fromClient)) {
client = u.getIDrawingUpdate();
client.notifyCanvasClearance(fromClient);
}
}
System.out.print("...DONE\n");
return true;
}
public BufferedImage getCurrentImage() throws RemoteException {
return bufferedImage;
}
public void getImage(String fromClient) throws RemoteException {
// if (bufferedImage.getImage().)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IDrawingUpdate client;
try {
javax.imageio.ImageIO.write(bufferedImage, "png", baos);
baos.flush();
}
catch (IOException err) {
err.printStackTrace();
}
for( User u : server.users )
{
if (u.getUserName().equals(fromClient)) {
client = u.getIDrawingUpdate();
client.receiveImage(baos.toByteArray());
}
}
}
public ArrayList<Shape> getShapeList() {
return shapeList;
}
public ArrayList<Color> getColorList() {
return colorList;
}
public ArrayList<Integer> getStrokeSizeList() {
return strokeSizeList;
}
public ArrayList<String> getTextList() {
return textList;
}
public ArrayList<Font> getFontList() {
return fontList;
}
public ArrayList<Point> getTextStartPointList() {
return textStartPointList;
}
}