package ru.testing.client.websocket;
import javafx.collections.ObservableList;
import javafx.scene.control.*;
import javafx.scene.input.MouseButton;
import ru.testing.client.common.objects.ReceivedMessage;
import ru.testing.client.controllers.TabWsMessagesController;
import ru.testing.client.elements.ContextMenuItems;
import ru.testing.client.elements.tabs.WsMessageTab;
/**
* Output message cell factory
*/
public class ReceivedMessageCellFactory extends ListCell<ReceivedMessage> {
private static final String SEND_MESSAGE_CSS = "message_send";
private ObservableList<ReceivedMessage> list;
private TabWsMessagesController controller;
public ReceivedMessageCellFactory(TabWsMessagesController controller, boolean isFiltered) {
this.controller = controller;
if (isFiltered) {
this.list = controller.getReceivedFilteredMessageList();
} else {
this.list = controller.getReceivedMessageList();
}
}
@Override
protected void updateItem(ReceivedMessage item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(String.format(ReceivedMessageFormat.DEFAULT.getFormat(), item.getFormattedTime(), item.getMessage()));
if (item.getMessageType() == ReceivedMessageType.SEND) {
getStyleClass().add(SEND_MESSAGE_CSS);
} else {
getStyleClass().removeAll(SEND_MESSAGE_CSS);
}
setContextMenu(getContextMenu(item));
} else {
setText(null);
setGraphic(null);
getStyleClass().removeAll(SEND_MESSAGE_CSS);
}
}
@Override
protected boolean isItemChanged(ReceivedMessage oldItem, ReceivedMessage newItem) {
MultipleSelectionModel<ReceivedMessage> selectionModel = controller.getOutputTextView().getSelectionModel();
setOnMouseClicked(event -> {
if (event.getButton().equals(MouseButton.SECONDARY)) {
selectionModel.clearSelection();
selectionModel.select(getItem());
}
if (event.getButton().equals(MouseButton.PRIMARY)) {
if (event.getClickCount() >= 2) {
new WsMessageTab(getItem());
}
}
});
return oldItem != null ? !oldItem.equals(newItem) : newItem != null;
}
/**
* Context menu for output message view
*
* @param item ReceivedMessage
* @return ContextMenu
*/
private ContextMenu getContextMenu(final ReceivedMessage item) {
final ContextMenu contextMenu = new ContextMenu();
ContextMenuItems m = new ContextMenuItems();
contextMenu.getItems().addAll(
m.copyCellMessage(item),
m.copyCellTime(item),
m.copyCellAll(item),
new SeparatorMenuItem(),
m.saveMessageToFile(item),
m.showMessage(item),
new SeparatorMenuItem(),
m.deselectCell(controller.getOutputTextView()),
m.clearListView(list)
);
return contextMenu;
}
}