Shemplo/Neerc-chat-client

View on GitHub
src/main/java/ru/shemplo/chat/neerc/gfx/panes/EmojiList.java

Summary

Maintainability
C
7 hrs
Test Coverage
package ru.shemplo.chat.neerc.gfx.panes;

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.Tab;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.Background;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import ru.shemplo.chat.neerc.gfx.WindowManager;
import ru.shemplo.chat.neerc.gfx.scenes.MainSceneHolder;
import ru.shemplo.chat.neerc.gfx.scenes.SceneHolder;

public class EmojiList extends AbsTabContent {

    protected ObservableList <String> emojiList;
    protected ListView <String> emojiListView;
    
    public EmojiList (SceneHolder holder, String dialog) {
        super (false, (MainSceneHolder) holder, dialog);
        
        emojiList = FXCollections.observableArrayList ();
        
        Platform.runLater (() -> {
            emojiList.add ("alarm-clock");
            emojiList.add ("alien");
            emojiList.add ("angel");
            emojiList.add ("anger");
            emojiList.add ("angry-1");
            emojiList.add ("angry-2");
            emojiList.add ("angry");
            emojiList.add ("archive");
            emojiList.add ("arms-up");
            emojiList.add ("arm-up");
            emojiList.add ("arrogant");
            emojiList.add ("baby-1");
            emojiList.add ("baby");
            emojiList.add ("bald");
            emojiList.add ("balloon");
            emojiList.add ("barber-shop");
            emojiList.add ("bar-chart-1");
            emojiList.add ("bar-chart");
            emojiList.add ("barrel");
            emojiList.add ("bathtub-1");
            emojiList.add ("bathtub");
            emojiList.add ("battery");
            emojiList.add ("beads");
            emojiList.add ("bed-1");
            emojiList.add ("bed");
            emojiList.add ("bell");
            emojiList.add ("bikini");
            emojiList.add ("bolt");
            emojiList.add ("bomb");
            emojiList.add ("book-1");
            emojiList.add ("book-2");
            emojiList.add ("book-3");
            emojiList.add ("books");
            emojiList.add ("book");
            emojiList.add ("boot");
            emojiList.add ("bored");
            emojiList.add ("bow");
            emojiList.add ("box-1");
            emojiList.add ("box");
            emojiList.add ("boy-1");
            emojiList.add ("boy");
            emojiList.add ("bride");
            emojiList.add ("briefcase");
            emojiList.add ("broken-heart");
            emojiList.add ("calendar-1");
            emojiList.add ("calendar-2");
            emojiList.add ("calendar-3");
            emojiList.add ("calendar-4");
            emojiList.add ("calendar");
            emojiList.add ("candle");
            emojiList.add ("cat-1");
            emojiList.add ("cat-2");
            emojiList.add ("cat-3");
            emojiList.add ("cat-4");
            emojiList.add ("cat-5");
            emojiList.add ("cat-6");
            emojiList.add ("cat-7");
            emojiList.add ("cat-8");
            emojiList.add ("cat");
            emojiList.add ("chain");
            emojiList.add ("chat");
            emojiList.add ("cigarette");
            emojiList.add ("clapping");
            emojiList.add ("clipboard");
            emojiList.add ("clock");
            emojiList.add ("clutch");
            emojiList.add ("coffin");
            emojiList.add ("compact-disc-1");
            emojiList.add ("compact-disc");
            emojiList.add ("confetti-1");
            emojiList.add ("confetti");
            emojiList.add ("confused");
            emojiList.add ("controller");
            emojiList.add ("cool-1");
            emojiList.add ("cool");
            emojiList.add ("couple-1");
            emojiList.add ("couple-2");
            emojiList.add ("couple-3");
            emojiList.add ("couple");
            emojiList.add ("credit-card");
            emojiList.add ("crown");
            emojiList.add ("crying-1");
            emojiList.add ("crying-2");
            emojiList.add ("crying");
            emojiList.add ("cupid");
            emojiList.add ("cute");
            emojiList.add ("dancers");
            emojiList.add ("dancer");
            emojiList.add ("devil-1");
            emojiList.add ("devil");
            emojiList.add ("diamond");
            emojiList.add ("dislike");
            emojiList.add ("dizzy-1");
            emojiList.add ("dizzy");
            emojiList.add ("doctor");
            emojiList.add ("door");
            emojiList.add ("dress");
            emojiList.add ("drops");
            emojiList.add ("drop");
            emojiList.add ("ear");
            emojiList.add ("email-1");
            emojiList.add ("email");
            emojiList.add ("embarrassed");
            emojiList.add ("emoji");
            emojiList.add ("engagement-ring");
            emojiList.add ("explosion");
            emojiList.add ("eyes");
            emojiList.add ("family");
            emojiList.add ("fart");
            emojiList.add ("faucet");
            emojiList.add ("fax");
            emojiList.add ("file-1");
            emojiList.add ("file-2");
            emojiList.add ("file-3");
            emojiList.add ("file");
            emojiList.add ("film");
            emojiList.add ("fire");
            emojiList.add ("fist");
            emojiList.add ("flashlight");
            emojiList.add ("flask");
            emojiList.add ("flirt");
            emojiList.add ("floppy-disk");
            emojiList.add ("folder-1");
            emojiList.add ("folder-2");
            emojiList.add ("folder");
            emojiList.add ("footprint");
            emojiList.add ("frame");
            emojiList.add ("gear");
            emojiList.add ("geisha");
            emojiList.add ("gift");
            emojiList.add ("girl");
            emojiList.add ("goofy");
            emojiList.add ("greed");
            emojiList.add ("grinning");
            emojiList.add ("guard");
            emojiList.add ("gun");
            emojiList.add ("hair-cut");
            emojiList.add ("hammers");
            emojiList.add ("hammer");
            emojiList.add ("hand-1");
            emojiList.add ("handbag");
            emojiList.add ("hand");
            emojiList.add ("happy-1");
            emojiList.add ("happy-2");
            emojiList.add ("happy-3");
            emojiList.add ("happy-4");
            emojiList.add ("happy-5");
            emojiList.add ("happy-6");
            emojiList.add ("happy-7");
            emojiList.add ("happy");
            emojiList.add ("hard-disk");
            emojiList.add ("hat");
            emojiList.add ("heart-1");
            emojiList.add ("heart-2");
            emojiList.add ("heart-3");
            emojiList.add ("heart-4");
            emojiList.add ("heart-5");
            emojiList.add ("heart-6");
            emojiList.add ("heart-7");
            emojiList.add ("heart-8");
            emojiList.add ("heart-9");
            emojiList.add ("heart");
            emojiList.add ("high-heel");
            emojiList.add ("highlighter");
            emojiList.add ("hole");
            emojiList.add ("horn");
            emojiList.add ("hourglass-1");
            emojiList.add ("hourglass");
            emojiList.add ("idea");
            emojiList.add ("inbox");
            emojiList.add ("injury");
            emojiList.add ("in-love");
            emojiList.add ("jeans");
            emojiList.add ("joystick");
            emojiList.add ("key-1");
            emojiList.add ("keyboard");
            emojiList.add ("key");
            emojiList.add ("kimono");
            emojiList.add ("kiss-1");
            emojiList.add ("kiss-2");
            emojiList.add ("kiss-3");
            emojiList.add ("kissing-1");
            emojiList.add ("kissing");
            emojiList.add ("kiss");
            emojiList.add ("knife");
            emojiList.add ("koinobori");
            emojiList.add ("lantern-1");
            emojiList.add ("lantern");
            emojiList.add ("laptop");
            emojiList.add ("laughing-1");
            emojiList.add ("laughing-2");
            emojiList.add ("laughing");
            emojiList.add ("letter-1");
            emojiList.add ("letter");
            emojiList.add ("libra");
            emojiList.add ("like");
            emojiList.add ("link");
            emojiList.add ("lipstick");
            emojiList.add ("loss");
            emojiList.add ("loupe");
            emojiList.add ("love-letter");
            emojiList.add ("magic-ball");
            emojiList.add ("mailbox-1");
            emojiList.add ("mailbox-2");
            emojiList.add ("mailbox-3");
            emojiList.add ("mail-box");
            emojiList.add ("mailbox");
            emojiList.add ("man-1");
            emojiList.add ("man-2");
            emojiList.add ("man");
            emojiList.add ("mask");
            emojiList.add ("massage");
            emojiList.add ("microphone");
            emojiList.add ("microscope");
            emojiList.add ("middle-finger");
            emojiList.add ("money-1");
            emojiList.add ("money-2");
            emojiList.add ("money-bag");
            emojiList.add ("money");
            emojiList.add ("monitor");
            emojiList.add ("monkey-1");
            emojiList.add ("monkey-2");
            emojiList.add ("monkey");
            emojiList.add ("monster");
            emojiList.add ("mouse");
            emojiList.add ("mouth");
            emojiList.add ("muted");
            emojiList.add ("nail-polish");
            emojiList.add ("negative");
            emojiList.add ("nerd");
            emojiList.add ("nervous-1");
            emojiList.add ("nervous");
            emojiList.add ("newspaper-1");
            emojiList.add ("newspaper");
            emojiList.add ("nose");
            emojiList.add ("notebook-1");
            emojiList.add ("notebook-2");
            emojiList.add ("notebook");
            emojiList.add ("ok");
            emojiList.add ("old-woman");
            emojiList.add ("open-book");
            emojiList.add ("outbox");
            emojiList.add ("package");
            emojiList.add ("padlock-1");
            emojiList.add ("padlock-2");
            emojiList.add ("padlock");
            emojiList.add ("pager");
            emojiList.add ("paint-brush");
            emojiList.add ("paperclip-1");
            emojiList.add ("paperclip");
            emojiList.add ("pen-1");
            emojiList.add ("pencil");
            emojiList.add ("pen");
            emojiList.add ("photo-camera-1");
            emojiList.add ("photo-camera");
            emojiList.add ("pick");
            emojiList.add ("pill");
            emojiList.add ("pin");
            emojiList.add ("please");
            emojiList.add ("plug");
            emojiList.add ("pointing-left");
            emojiList.add ("pointing-right");
            emojiList.add ("pointing-up");
            emojiList.add ("policeman");
            emojiList.add ("polo-shirt");
            emojiList.add ("poo");
            emojiList.add ("pound-sterling");
            emojiList.add ("princess");
            emojiList.add ("printer");
            emojiList.add ("punch");
            emojiList.add ("purse");
            emojiList.add ("push-pin");
            emojiList.add ("radio");
            emojiList.add ("raise-hand");
            emojiList.add ("remote-control-1");
            emojiList.add ("remote-control");
            emojiList.add ("repair-tools");
            emojiList.add ("ribbon");
            emojiList.add ("ruler");
            emojiList.add ("run");
            emojiList.add ("sad-10");
            emojiList.add ("sad-11");
            emojiList.add ("sad-12");
            emojiList.add ("sad-13");
            emojiList.add ("sad-1");
            emojiList.add ("sad-2");
            emojiList.add ("sad-3");
            emojiList.add ("sad-4");
            emojiList.add ("sad-5");
            emojiList.add ("sad-6");
            emojiList.add ("sad-7");
            emojiList.add ("sad-8");
            emojiList.add ("sad-9");
            emojiList.add ("sad");
            emojiList.add ("salute");
            emojiList.add ("sandal");
            emojiList.add ("satellite-dish");
            emojiList.add ("scare");
            emojiList.add ("scissors");
            emojiList.add ("scream");
            emojiList.add ("scroll");
            emojiList.add ("serious");
            emojiList.add ("set-square");
            emojiList.add ("shield");
            emojiList.add ("shining");
            emojiList.add ("shirt-1");
            emojiList.add ("shirt-2");
            emojiList.add ("shirt");
            emojiList.add ("shocked");
            emojiList.add ("shoe");
            emojiList.add ("shooting-star");
            emojiList.add ("shopping-bag");
            emojiList.add ("shopping-cart");
            emojiList.add ("shower");
            emojiList.add ("shy");
            emojiList.add ("sick");
            emojiList.add ("skull");
            emojiList.add ("sleep-1");
            emojiList.add ("sleep");
            emojiList.add ("sleepy");
            emojiList.add ("smartphone-1");
            emojiList.add ("smartphone");
            emojiList.add ("smart");
            emojiList.add ("smile-1");
            emojiList.add ("smile");
            emojiList.add ("sneakers");
            emojiList.add ("sofa");
            emojiList.add ("star");
            emojiList.add ("stopwatch-1");
            emojiList.add ("stopwatch");
            emojiList.add ("straight-1");
            emojiList.add ("straight");
            emojiList.add ("strong");
            emojiList.add ("sunglasses");
            emojiList.add ("surprised-1");
            emojiList.add ("surprised-2");
            emojiList.add ("surprised-3");
            emojiList.add ("surprised-4");
            emojiList.add ("surprised");
            emojiList.add ("surprise");
            emojiList.add ("suspicious");
            emojiList.add ("swords");
            emojiList.add ("sword");
            emojiList.add ("syringe");
            emojiList.add ("tag-1");
            emojiList.add ("tag");
            emojiList.add ("tap-1");
            emojiList.add ("tap");
            emojiList.add ("telephone-1");
            emojiList.add ("telephone");
            emojiList.add ("telescope");
            emojiList.add ("television");
            emojiList.add ("tengu");
            emojiList.add ("thermometer");
            emojiList.add ("thinking");
            emojiList.add ("toilet");
            emojiList.add ("tongue-out-1");
            emojiList.add ("tongue-out-2");
            emojiList.add ("tongue-out");
            emojiList.add ("tongue");
            emojiList.add ("top-hat");
            emojiList.add ("trash");
            emojiList.add ("umbrella");
            emojiList.add ("unlocked");
            emojiList.add ("users");
            emojiList.add ("user");
            emojiList.add ("vain");
            emojiList.add ("vase-1");
            emojiList.add ("vase");
            emojiList.add ("vhs");
            emojiList.add ("victory");
            emojiList.add ("video-camera-1");
            emojiList.add ("video-camera-2");
            emojiList.add ("video-camera");
            emojiList.add ("vise");
            emojiList.add ("walk");
            emojiList.add ("watch");
            emojiList.add ("waving-hand");
            emojiList.add ("wink-1");
            emojiList.add ("wink");
            emojiList.add ("woman-1");
            emojiList.add ("woman-2");
            emojiList.add ("woman");
            emojiList.add ("wrench");
            emojiList.add ("yen");
            emojiList.add ("zzz");
        });
        
        final VBox content = new VBox (8.0);
        
        final Label info = new Label ("To copy emoji code to clipboard click on it with secondary mouse button");
        VBox.setMargin (info, new Insets (0, 0, 0, 32.0));
        content.getChildren ().add (info);
        
        emojiListView = new ListView <> ();
        emojiListView.setCellFactory (__ -> new EmojiCell ());
        emojiListView.setBackground (Background.EMPTY);
        VBox.setVgrow (emojiListView, Priority.ALWAYS);
        emojiListView.editableProperty ().set (false);
        emojiListView.setItems (emojiList);
        
        content.getChildren ().add (emojiListView);
        setContent (content);
    }

    @Override
    public void onResponsibleTabOpened (Tab owner) {}

    @Override
    public void onResponsibleTabClosed (Tab owner) {}
    
    private static final class EmojiCell extends ListCell <String> {
        
        private static WindowManager manager;
        
        static {
            try {
                manager = WindowManager.getInstance ();
            } catch (InterruptedException e) {/* impossible */}
        }
        
        public EmojiCell () {
            setBackground (Background.EMPTY);
            
            setOnContextMenuRequested (cme -> {
                final Clipboard cb = Clipboard.getSystemClipboard ();
                final ClipboardContent cc = new ClipboardContent ();
                cc.putString (String.format (":%s:", getItem ()));
                cb.setContent (cc);
            });
        }
        
        @Override
        protected void updateItem (String item, boolean empty) {
            super.updateItem (item, empty || item == null);
            if (empty || item == null) { 
                setGraphic (null);
                return; 
            }
            
            final MessageInterpreter messageInterpreter = manager
                . getSharedContext ().getMessageInterpreter ();
            
            final HBox line = new HBox (8.0);
            line.maxWidthProperty ().bind (getListView ().widthProperty ().subtract (16.0));
            line.getStyleClass ().add ("message-row");
            line.setPadding (new Insets (4));
            line.setMinHeight (30.0);
            
            final Label emojiIcon = messageInterpreter.makeIconLabel (item, 42);
            emojiIcon.getStyleClass ().add ("message-source");
            emojiIcon.setAlignment  (Pos.CENTER);
            
            final Label emojiCode = new Label (String.format (":%s:", item));
            emojiCode.getStyleClass ().add ("message-source");
            emojiCode.setAlignment  (Pos.CENTER);
            
            final Label emojiName = new Label (item);
            emojiName.getStyleClass ().add ("message-source");
            emojiName.setAlignment  (Pos.CENTER);
            
            line.getChildren ().addAll (emojiIcon, emojiCode, emojiName);
            setWrapText (true);
            setGraphic (line);
        }
        
    }
    
}