diff --git a/src/GUI/ApplicationMain.java b/src/GUI/ApplicationMain.java
index 32275b92f8dece89d30856904b4cab47a776d11d..25d25f4238c061bc82cd416b2254a65cd33b5c88 100644
--- a/src/GUI/ApplicationMain.java
+++ b/src/GUI/ApplicationMain.java
@@ -6,6 +6,7 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
import java.rmi.RemoteException;
import java.util.ArrayList;
@@ -29,8 +30,7 @@ public class ApplicationMain extends JPanel {
this.paintGUI = new PaintGUI(client);
}
- public void createAndShowGUI()
- {
+ public void createAndShowGUI() {
frame = new JFrame("Application Main");
JFrame.setDefaultLookAndFeelDecorated(true);
Container content = frame.getContentPane();
@@ -40,32 +40,39 @@ public class ApplicationMain extends JPanel {
chatScreen.setUserName(client.getUserName());
- try {
- // Update canvas
- ArrayList<Shape> shapeList = client.getDrawingController().getShapeList();
- ArrayList<Color> colorList = client.getDrawingController().getColorList();
- ArrayList<Integer> strokeSizeList = client.getDrawingController().getStrokeSizeList();
-
- ArrayList<String> textList = client.getDrawingController().getTextList();
- ArrayList<Font> fontList = client.getDrawingController().getFontList();
- ArrayList<Point> textStartPointList = client.getDrawingController().getTextStartPointList();
+// try {
+// // Update canvas
+// ArrayList<Shape> shapeList = client.getDrawingController().getShapeList();
+// ArrayList<Color> colorList = client.getDrawingController().getColorList();
+// ArrayList<Integer> strokeSizeList = client.getDrawingController().getStrokeSizeList();
+//
+// ArrayList<String> textList = client.getDrawingController().getTextList();
+// ArrayList<Font> fontList = client.getDrawingController().getFontList();
+// ArrayList<Point> textStartPointList = client.getDrawingController().getTextStartPointList();
- Graphics2D g2 = paintGUI.getDrawingArea().getG2();
+// Graphics2D g2 = paintGUI.getDrawingArea().getG2();
// for (int i = 0; i < textList.size(); i++) {
// g2.setFont(fontList.get(i));
// g2.drawString(textList.get(i), textStartPointList.get(i).x, textStartPointList.get(i).y);
// client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
// }
- for (int i = 0; i < shapeList.size(); i++) {
- g2.setStroke(new BasicStroke(strokeSizeList.get(i)));
- g2.setColor(colorList.get(i));
- g2.draw(shapeList.get(i));
- paintGUI.getDrawingArea().repaint();
- }
+// for (int i = 0; i < shapeList.size(); i++) {
+// g2.setStroke(new BasicStroke(strokeSizeList.get(i)));
+// g2.setColor(colorList.get(i));
+// g2.draw(shapeList.get(i));
+// paintGUI.getDrawingArea().repaint();
+// }
+// }
+// catch (RemoteException e) {
+// e.printStackTrace();
+// }
+
+ try {
+ client.getDrawingController().getImage(client.getUserName());
}
- catch (RemoteException e) {
- e.printStackTrace();
+ catch (RemoteException err) {
+ err.printStackTrace();
}
diff --git a/src/GUI/DrawingArea.java b/src/GUI/DrawingArea.java
index 481c938471b92a3d62209282dd34a3560bf87ede..6b6235858b7312f7481ef352e5c19e07d57caa8b 100644
--- a/src/GUI/DrawingArea.java
+++ b/src/GUI/DrawingArea.java
@@ -386,7 +386,7 @@ public class DrawingArea extends JPanel implements MouseMotionListener, MouseLis
case TEXT:
break;
}
-
+ g2.setStroke(lineStroke);
repaint();
try {
drawingController.broadcastDraggingDrawing(client.getUserName(), drawing, currentMode.toString(), shapeColor, strokeSize);
diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
index 1b87a668692f5c400ca04d65c24daad095848d3e..f4bd5e1a33bd859eaf8db0daf974d560242eb33e 100644
--- a/src/GUI/PaintGUI.java
+++ b/src/GUI/PaintGUI.java
@@ -27,7 +27,8 @@ public class PaintGUI extends JPanel {
JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn;
JButton freehandBtn, lineBtn, circleBtn, rectBtn, ovalBtn, eraserBtn, textBtn;
JButton colorPaletteBtn, setFontBtn;
- JTextField textInput, textSize;
+ JTextField textInput;
+ JTextField textSize;
JComboBox strokeOptions;
JComboBox eraserSizeOptions;
@@ -111,6 +112,7 @@ public class PaintGUI extends JPanel {
textSize.setColumns(2);
textSize.addFocusListener(focusListener);
// textSize.setVisible(false);
+ setTextDetail();
/// Set up elements ///
clearBtn = new JButton("Clear");
@@ -126,7 +128,6 @@ public class PaintGUI extends JPanel {
/// Toolbox panel ///
toolbox1.add(colorPaletteBtn);
-// toolbox.add(setFontBtn);
toolbox1.add(freehandBtn);
toolbox1.add(lineBtn);
toolbox1.add(circleBtn);
@@ -135,6 +136,7 @@ public class PaintGUI extends JPanel {
toolbox1.add(eraserBtn);
toolbox1.add(textBtn);
toolbox2.add(textInput);
+// toolbox2.add(setFontBtn);
toolbox2.add(textSize);
toolbox2.add(strokeOptions);
toolbox2.add(eraserSizeOptions);
@@ -199,11 +201,32 @@ public class PaintGUI extends JPanel {
file = new File(filePath);
}
+
drawingArea.saveAsPNGFile(file);
+
+ try
+ {
+ client.getDrawingController().broadcastClearCanvas(client.getUserName());
+ }
+ catch (RemoteException err)
+ {
+ JOptionPane.showMessageDialog(null,
+ "Error in clearing the canvas", "Error", JOptionPane.ERROR_MESSAGE);
+ }
+
drawingArea.clear();
} else if (returnVal == JOptionPane.NO_OPTION) {
+ try
+ {
+ client.getDrawingController().broadcastClearCanvas(client.getUserName());
+ }
+ catch (RemoteException err)
+ {
+ JOptionPane.showMessageDialog(null,
+ "Error in clearing the canvas", "Error", JOptionPane.ERROR_MESSAGE);
+ }
drawingArea.clear();
}
@@ -361,8 +384,6 @@ public class PaintGUI extends JPanel {
}
-
-
// public void showGUI() {
// frame = new JFrame("Shared Whiteboard System");
// JFrame.setDefaultLookAndFeelDecorated(true);
diff --git a/src/GUI/SerializableImage.java b/src/GUI/SerializableImage.java
index 159436e9213b1b666e2e4448a16afa3c7536808d..10ddffd3c0500cafb7cf7661d9546288018f4d02 100644
--- a/src/GUI/SerializableImage.java
+++ b/src/GUI/SerializableImage.java
@@ -2,15 +2,38 @@ package GUI;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
+import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.io.*;
+import java.util.Hashtable;
-public class SerializableImage implements Serializable {
+public class SerializableImage extends BufferedImage implements Serializable {
transient BufferedImage image;
+ public SerializableImage(int width, int height, int imageType) {
+ super(width, height, imageType);
+ image = new BufferedImage(width, height, imageType);
+ }
+
+ public BufferedImage getImage() {
+ return image;
+ }
+
+ public void setImage(BufferedImage image) {
+ this.image = image;
+ }
+
+ public SerializableImage(int width, int height, int imageType, IndexColorModel cm) {
+ super(width, height, imageType, cm);
+ }
+
+ public SerializableImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?, ?> properties) {
+ super(cm, raster, isRasterPremultiplied, properties);
+ }
+
+
public void writeObject(ObjectOutputStream output) throws IOException {
output.defaultWriteObject();
ImageIO.write(image, "png", output);
diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java
index bccf0339c196411c022f16f408709239a90cc8d3..43883b2e581f3067691b42ca1d22592a42b8be66 100644
--- a/src/client/DrawingUpdate.java
+++ b/src/client/DrawingUpdate.java
@@ -4,6 +4,9 @@ import GUI.DrawingArea;
import remote.IDrawingUpdate;
import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
@@ -75,4 +78,21 @@ public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate
client.getApplicationMain().getPaintGUI().getDrawingArea().clear();
return true;
}
+
+ public boolean receiveImage(byte[] rawImage) throws RemoteException {
+ try {
+// BufferedImage bufferedImage = client.getApplicationMain().getPaintGUI().getDrawingArea().getImage();
+ BufferedImage bufferedImage = javax.imageio.ImageIO.read(new ByteArrayInputStream(rawImage));
+ client.getApplicationMain().getPaintGUI().getDrawingArea().setImage(bufferedImage);
+ Graphics2D g2 = (Graphics2D) bufferedImage.getGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
+
+ // do whatever you wish with the image
+ }
+ catch (IOException err) {
+ err.printStackTrace();
+ }
+ return true;
+ }
}
diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java
index e30900af1ff1193799bb14110c0231985a9d2837..635c490c49e86dd5ee1bee1ed89ca997de08308c 100644
--- a/src/remote/IDrawingController.java
+++ b/src/remote/IDrawingController.java
@@ -1,5 +1,8 @@
package remote;
+import GUI.SerializableImage;
+import client.Client;
+
import java.awt.*;
import java.awt.image.BufferedImage;
import java.rmi.Remote;
@@ -30,5 +33,7 @@ public interface IDrawingController extends Remote {
ArrayList<Font> getFontList() throws RemoteException;
ArrayList<Point> getTextStartPointList() throws RemoteException;
// BufferedImage getCurrentImage() throws RemoteException;
+ SerializableImage getCurrentImage() throws RemoteException;
+ void getImage(String fromClient) throws RemoteException;
}
diff --git a/src/remote/IDrawingUpdate.java b/src/remote/IDrawingUpdate.java
index 91e26578ba95c104afab0a9b5affde0349a919fe..02f17f1e685503799e74e2ca9f3f7d26bdff404d 100644
--- a/src/remote/IDrawingUpdate.java
+++ b/src/remote/IDrawingUpdate.java
@@ -10,4 +10,5 @@ public interface IDrawingUpdate extends Remote, Serializable {
boolean notifyDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException;
boolean notifyDraggingDrawing(String fromClient, Shape drawing, String mode, Color color, int strokeSize) throws RemoteException;
boolean notifyCanvasClearance(String fromClient) throws RemoteException;
+ boolean receiveImage(byte[] rawImage) throws RemoteException;
}
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
index dd89137a80de993953a9355dd991794b20a43aed..d52aebe4592c31b9e5c84be2d689a33490ac17fb 100644
--- a/src/server/DrawingController.java
+++ b/src/server/DrawingController.java
@@ -1,16 +1,14 @@
package server;
import GUI.SerializableImage;
+import client.Client;
import remote.IDrawingController;
import remote.IDrawingUpdate;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
+import java.io.*;
import java.lang.reflect.Array;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
@@ -19,7 +17,7 @@ import java.util.ArrayList;
public class DrawingController extends UnicastRemoteObject implements IDrawingController {
private final static int AREA_WIDTH = 600;
- private final static int AREA_HEIGHT = 620;
+ private final static int AREA_HEIGHT = 600;
private Server server;
private SerializableImage serializableImage;
@@ -38,14 +36,15 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
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.serializableImage = new SerializableImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+// 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.serializableImage = new SerializableImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
+ g2 = (Graphics2D) serializableImage.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>();
@@ -63,6 +62,14 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
fontList.add(font);
textStartPointList.add(startPoint);
+
+ g2 = (Graphics2D) serializableImage.getGraphics();
+ g2.setFont(font);
+ g2.drawString(text, startPoint.x, startPoint.y);
+ g2 = (Graphics2D) serializableImage.getGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+
IDrawingUpdate client;
for( User u : server.users )
@@ -87,6 +94,29 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
colorList.add(color);
strokeSizeList.add(strokeSize);
+ g2 = (Graphics2D) serializableImage.getGraphics();
+ 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) serializableImage.getGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g2.setColor(color);
+
+
+
IDrawingUpdate client;
for( User u : server.users )
@@ -111,6 +141,28 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
strokeSizeList.add(strokeSize);
}
+ g2 = (Graphics2D) serializableImage.getGraphics();
+ 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) serializableImage.getGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g2.setColor(color);
+
+
IDrawingUpdate client;
for( User u : server.users )
@@ -139,6 +191,10 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
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)) {
@@ -152,9 +208,30 @@ public class DrawingController extends UnicastRemoteObject implements IDrawingCo
return true;
}
-// public ImageCanvas getCurrentImage() {
-// return image;
-// }
+ public SerializableImage getCurrentImage() throws RemoteException {
+ return serializableImage;
+ }
+
+ public void getImage(String fromClient) throws RemoteException {
+// if (serializableImage.getImage().)
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ IDrawingUpdate client;
+ try {
+ javax.imageio.ImageIO.write(serializableImage, "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;