/** * */ package cz.cuni.mff.peckam.java.origamist.model; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import cz.cuni.mff.peckam.java.origamist.model.jaxb.Operations; import cz.cuni.mff.peckam.java.origamist.modelstate.ModelState; import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.BooleanArgument; import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.LineArgument; import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.OperationArgument; import cz.cuni.mff.peckam.java.origamist.modelstate.arguments.OperationsArgument; /** * A repeat operation that is symmetric to some given operations. * * @author Martin Pecka */ public class SymmetryOperation extends cz.cuni.mff.peckam.java.origamist.model.jaxb.SymmetryOperation implements OperationContainer { @Override protected void init() { super.init(); type = Operations.SYMMETRY; // it doesn't help to specify the value as fixed in XSD } @Override public ModelState getModelState(ModelState previousState) { for (Operation o : operations) { o.getModelState(previousState); } return previousState; } @Override public boolean areContentsVisible() { return isDisplayed(); } @Override protected List<OperationArgument> initArguments() { List<OperationArgument> arguments = new ArrayList<OperationArgument>(2); arguments.add(new LineArgument(true, "operation.argument.symmetry.axis")); arguments.add(new OperationsArgument(true, "operation.argument.last.operations")); arguments.add(new BooleanArgument(true, "operation.argument.hidden", "operation.argument.hidden.message", "operation.argument.hidden.displayed", "operation.argument.hidden.hidden")); return arguments; } @Override public void fillFromArguments() throws IllegalStateException { this.line = ((LineArgument) arguments.get(0)).getLine2D(); this.operations.clear(); for (Operation o : ((OperationsArgument) arguments.get(1)).getOperations()) { if (o instanceof HasSymmetricOperation) { operations.add(((HasSymmetricOperation) o).getSymmetricOperation(line.toLine2d())); } else { operations.add(o); } } if (((BooleanArgument) arguments.get(2)).getValue() != null) this.displayed = ((BooleanArgument) arguments.get(2)).getValue(); } @Override public String getL7dUserTip(OperationArgument argument) { String bundleKey = null; if (argument == getArguments().get(0)) { bundleKey = "symmetry.line.user.tip"; } else if (argument == getArguments().get(1)) { bundleKey = "symmetry.steps.user.tip"; } else if (argument == getArguments().get(2)) { bundleKey = "symmetry.visible.user.tip"; } if (bundleKey != null) return messages.getString(bundleKey); else return null; } @Override public boolean isCompletelyDelayedToNextStep() { return !isDisplayed(); } @Override public String getDefaultDescription() { String prefix = type.toString(); StringBuilder text = new StringBuilder("<html><body>").append(getL7dName()); text.append(" ("); text.append(MessageFormat.format(messages.getString(prefix + ".countFormat"), new Object[] { operations.size() })); text.append(", "); if (displayed) { text.append(messages.getString(prefix + ".displayed")); } else { text.append(messages.getString(prefix + ".hidden")); } text.append(")"); text.append("</body></html>"); return text.toString(); } @Override public String toString() { return "SymmetryOperation [displayed=" + displayed + ", line=" + line + ", operations=" + operations + "]"; } }