Projet_COO_POO/src_reseau/session/VueSession.java
2021-01-31 16:33:59 +01:00

264 lines
No EOL
6.9 KiB
Java
Raw Permalink Blame History

package session;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.BoxView;
import javax.swing.text.ComponentView;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.IconView;
import javax.swing.text.LabelView;
import javax.swing.text.ParagraphView;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import communication.filetransfer.FileTransferUtils;
import database.SQLiteManager;
import messages.Message;
import messages.Message.TypeMessage;
public class VueSession extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JButton sendMessage;
private JButton importFile;
private JTextPane chatWindow;
private JTextArea chatInput;
private ControleurSession c;
public VueSession(Socket socketComm, String idOther, String pseudoOther, InetAddress ipOther, SQLiteManager sqlManager)
throws IOException {
this.c = new ControleurSession(this, socketComm, idOther, pseudoOther, ipOther, sqlManager);
this.setBorder(new EmptyBorder(5, 5, 5, 5));
this.setLayout(new BorderLayout(0, 0));
this.chatInput = new JTextArea();
this.chatInput.setColumns(10);
this.chatInput.setLineWrap(true);
this.chatInput.setWrapStyleWord(true);
this.chatInput.addKeyListener(this.c);
this.chatWindow = new JTextPane();
this.chatWindow.setEditable(false);
this.chatWindow.setEditorKit(new WrapEditorKit());
JScrollPane chatScroll = new JScrollPane(this.chatWindow);
chatScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
JPanel bottom = new JPanel();
bottom.setLayout(new BorderLayout(0, 0));
// remap "ENTER" to "none" to avoid "\n" in the input area after sending message
KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
this.chatInput.getInputMap().put(enter, "none");
KeyStroke shiftEnter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK);
this.chatInput.getInputMap().put(shiftEnter, "insert-break");
this.importFile = new JButton("Importer..");
this.importFile.addActionListener(this.c);
JScrollPane inputScroll = new JScrollPane(this.chatInput);
inputScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
this.sendMessage = new JButton("Envoyer");
this.sendMessage.addActionListener(this.c);
bottom.add(this.importFile, BorderLayout.WEST);
bottom.add(inputScroll, BorderLayout.CENTER);
bottom.add(this.sendMessage, BorderLayout.EAST);
this.add(chatScroll, BorderLayout.CENTER);
this.add(bottom, BorderLayout.SOUTH);
this.setPreferredSize(new Dimension(500, 500));
this.displayHistorique();
}
protected JButton getButtonEnvoyer() {
return this.sendMessage;
}
protected JButton getButtonImportFile() {
return this.importFile;
}
protected String getInputedText() {
return this.chatInput.getText();
}
protected void appendInputedText(String str) {
this.chatInput.append(str);
}
protected void resetZoneSaisie() {
this.chatInput.setText("");
}
private void setCaretToEnd() {
this.chatWindow.setCaretPosition(this.chatWindow.getDocument().getLength());
}
protected void appendString(String str) {
try {
Document doc = this.chatWindow.getDocument();
doc.insertString(doc.getLength(), str, null);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
protected void appendMessage(Message message) {
try {
StyledDocument sdoc = this.chatWindow.getStyledDocument();
// sdoc.setParagraphAttributes(sdoc.getLength(), message.toString().length()-1,
// style, false);
sdoc.insertString(sdoc.getLength(), message.toString(), null);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
protected void appendImage(Message message) {
this.setCaretToEnd();
String imgString = message.toString();
Icon ic;
try {
BufferedImage img = FileTransferUtils.decodeImage(imgString);
ic = new ImageIcon(img);
this.chatWindow.insertIcon(ic);
this.appendString("\n");
} catch (IOException e) {
e.printStackTrace();
}
}
private void printLineSeparator() {
this.appendString("------------------------------------------\n");
}
protected void endSession(String pseudoOther) {
this.printLineSeparator();
this.appendString(pseudoOther + " a mis fin <20> la session.");
this.chatInput.setEnabled(false);
this.chatInput.setFocusable(false);
this.sendMessage.setEnabled(false);
this.importFile.setEnabled(false);
}
private void displayHistorique() {
ArrayList<Message> historique = this.c.getHistorique();
for (Message m : historique) {
if(m.getTypeMessage() == TypeMessage.IMAGE) {
this.appendImage(m);
}else {
this.appendMessage(m);
}
}
if (historique.size() > 0) {
this.printLineSeparator();
}
}
public void destroyAll() {
if (this.c != null) {
this.c.destroyAll();
}
this.c = null;
this.chatInput = null;
this.chatWindow = null;
this.sendMessage = null;
}
// ------------- PRIVATE CLASS TO WRAP TEXT -------------//
class WrapEditorKit extends StyledEditorKit {
private static final long serialVersionUID = 1L;
ViewFactory defaultFactory = new WrapColumnFactory();
public ViewFactory getViewFactory() {
return defaultFactory;
}
}
class WrapColumnFactory implements ViewFactory {
public View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
if (kind.equals(AbstractDocument.ContentElementName)) {
return new WrapLabelView(elem);
} else if (kind.equals(AbstractDocument.ParagraphElementName)) {
return new ParagraphView(elem);
} else if (kind.equals(AbstractDocument.SectionElementName)) {
return new BoxView(elem, View.Y_AXIS);
} else if (kind.equals(StyleConstants.ComponentElementName)) {
return new ComponentView(elem);
} else if (kind.equals(StyleConstants.IconElementName)) {
return new IconView(elem);
}
}
// default to text display
return new LabelView(elem);
}
}
class WrapLabelView extends LabelView {
public WrapLabelView(Element elem) {
super(elem);
}
public float getMinimumSpan(int axis) {
switch (axis) {
case View.X_AXIS:
return 0;
case View.Y_AXIS:
return super.getMinimumSpan(axis);
default:
throw new IllegalArgumentException("Invalid axis: " + axis);
}
}
}
}