package com.yoghurt.crypto.transactions.client.widget; import java.util.Collection; import com.google.gwt.dom.client.Style.Unit; import com.googlecode.gwt.crypto.bouncycastle.util.encoders.Hex; import com.googlecode.gwt.crypto.util.Str; import com.yoghurt.crypto.transactions.client.util.TransactionPartColorPicker; import com.yoghurt.crypto.transactions.client.util.misc.Color; import com.yoghurt.crypto.transactions.client.util.misc.EllipsisUtil; import com.yoghurt.crypto.transactions.shared.domain.ScriptPart; import com.yoghurt.crypto.transactions.shared.domain.ScriptPartType; import com.yoghurt.crypto.transactions.shared.domain.ScriptType; import com.yoghurt.crypto.transactions.shared.util.ScriptOperationUtil; public class ScriptViewer extends ContextFieldSet<ScriptPart> { private static final int HASH_ELLIPSIS = 16; private final ScriptType type; public ScriptViewer(final ScriptType type, final boolean isCoinbase) { super(new SimpleScriptContextFactory() { @Override public String getFieldText(final ScriptPart value) { if(isCoinbase) { return "Coinbase input data including extraNonce and miner notes."; } else { return super.getFieldText(value); } } }); this.type = type; } public void setScript(final Collection<ScriptPart> instructions) { clear(); for (final ScriptPart instruction : instructions) { addField(instruction); } } @Override protected Color getFieldColor(final ScriptPart value) { if(ScriptOperationUtil.isDataPushOperation(value.getOperation())) { return TransactionPartColorPicker.getFieldColor(ScriptOperationUtil.getScriptPartType(type, ScriptPartType.PUSH_DATA)); } else { return TransactionPartColorPicker.getFieldColor(ScriptOperationUtil.getScriptPartType(type, ScriptPartType.OP_CODE)); } } @Override protected String getFieldText(final ScriptPart value) { if(ScriptOperationUtil.isDataPushOperation(value.getOperation())) { return EllipsisUtil.applyInner(Str.toString(Hex.encode(value.getBytes())).toUpperCase(), HASH_ELLIPSIS); } else { return value.getOperation().name(); } } @Override protected ContextField<ScriptPart> addField(final ContextField<ScriptPart> field) { field.getElement().getStyle().setMarginRight(10, Unit.PX); return super.addField(field); } }