package com.github.donkirkby.vograbulary; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.github.donkirkby.vograbulary.LetterDisplay.LetterDisplayListener; public class WordDisplay { public interface WordDisplayListener { void onClick(WordDisplay wordDisplay); } private LetterDisplayFactory factory; private List<LetterDisplay> letters = new ArrayList<>(); private List<WordDisplayListener> listeners = new ArrayList<>(); private int centreX; private int centreY; private double rotation; private LetterDisplayListener letterDisplayListener = new LetterDisplayListener() { @Override public void onClick(LetterDisplay letter) { for (WordDisplayListener listener : listeners) { listener.onClick(WordDisplay.this); } } }; public WordDisplay(LetterDisplayFactory factory) { this.factory = factory; } public void addListener(WordDisplayListener listener) { listeners.add(listener); } @Override public String toString() { return "WordDisplay(\"" + getWord() + "\")"; } public void setWord(String word) { for (LetterDisplay letter : letters) { factory.destroy(letter); } letters.clear(); rotation = 0; for (int i = 0; i < word.length(); i++) { LetterDisplay letter = factory.create(word.substring(i, i+1)); letter.addClickListener(letterDisplayListener); letters.add(letter); } } public String getWord() { StringBuilder builder = new StringBuilder(); for (LetterDisplay letterDisplay : letters) { builder.append(letterDisplay.getLetter()); } return builder.toString(); } public List<LetterDisplay> getLetters() { return Collections.unmodifiableList(letters); } public int getWidth() { int width = 0; for (LetterDisplay letter : letters) { width += letter.getWidth(); } return width; } public void setLeft(int left) { int nextLeft = left; for (LetterDisplay letter : letters) { letter.setLeft(nextLeft); nextLeft += letter.getWidth(); } centreX = left + getWidth()/2; } public void setTop(int top) { for (LetterDisplay letterDisplay : letters) { letterDisplay.setTop(top); } centreY = letters.get(0).getCentreY(); } public int getTop() { return letters.get(0).getTop(); } public float getTextSize() { return letters.get(0).getTextSize(); } public void setTextSize(float textSize) { for (LetterDisplay letterDisplay : letters) { letterDisplay.setTextSize(textSize); } } /** Set the rotation of the word in radians. */ public void setRotation(double rotation) { this.rotation = rotation; int width = getWidth(); double dx = Math.cos(rotation); double dy = Math.sin(rotation); double x = centreX - width * dx / 2; double y = centreY - width * dy / 2; for (LetterDisplay letter : letters) { int letterWidth = letter.getWidth(); double dxLetter = dx * letterWidth; double dyLetter = dy * letterWidth; letter.setCentreX((int) Math.round(x + dxLetter/2)); letter.setCentreY((int) Math.round(y + dyLetter/2)); x += dxLetter; y += dyLetter; } } public double getRotation() { return rotation; } }