implementation of TriggerField and TwinTriggerField
implementation of TriggerField and TwinTriggerField
This is a replacement for the Trigger and TwinTrigger fields, with a more flexible implementation, more triggers, a possibility to put the trigger before the input text and more changes.
If there will be any interest in using this, I will javadoc the methods and continue work on it. I would apreciate any kind of comments or ideeas of any kind. Besides that, you can use it freely.
public class MyManyTriggerField<Data> extends TextField<Data> {
//ATTRIBUTES
public static final int[] triggerClickEvent = {30, 31, 32, 33, 34}; //5 events for a possible of up to 10 triggers
public final static String INVALID_ARG_NUMERIC = "The numeric argument of this method has an invalid value";
public final static String INVALID_STATE = "The algorithm has entered an invalid state: Check why";
private final List<El> triggers;
private final List<String> triggerStyles;
private final List<String> triggerStylesOnMouseOver;
private El spanAfterInput, spanBeforeInput;
private El input;
private El wrap;
private EventListener triggerListener;
/**
* This field is an internal delimiter that decides which of the triggers in the <b>trigger</b> list go before the input and which go after. <br>
* This detail of the implementation is a small compromise for the sake of performance; a cleaner and more elegant design choice would
have been to define separate lists for the triggers before and the triggers after, but that would have meant three more lists and a
somewhat large performance hit
*/
private int delimiterAfterBefore = 0;
//CONSTRUCTOR(S)
public MyManyTriggerField(int numberOfTriggers){
this.triggers = new ArrayList<El>();
this.triggerStyles = new ArrayList<String>();
this.triggerStylesOnMouseOver = new ArrayList<String>();
this.addTriggers(numberOfTriggers);
}
//METHODS
//trigger
public El getTrigger( int index ){
assert( index >= 0 && this.triggers.size() > index );
return this.triggers.get(index);
}
public El getFirstTrigger(){
assert( this.triggers.size() >= 0 );
return this.triggers.get(0);
}
public El getSecondTrigger(){
assert( this.triggers.size() >= 1 );
return this.triggers.get(1);
}
public El getThirdTrigger(){
assert( this.triggers.size() >= 2 );
return this.triggers.get(2);
}
public void setTrigger( El triggerToSet, int index ){
assert( index >= 0 && this.triggers.size() > index );
this.triggers.set(index, triggerToSet);
}
public void setFirstTrigger( El triggerToSet ){
assert( this.triggers.size() >= 0 );
this.triggers.set(0, triggerToSet);
}
public void setSecondTrigger( El triggerToSet ){
assert( this.triggers.size() >= 1 );
this.triggers.set(1, triggerToSet);
}
public void setThirdTrigger( El triggerToSet ){
assert( this.triggers.size() >= 2 );
this.triggers.set(2, triggerToSet);
}
public int getNumberOfTriggers(){
return this.triggers.size();
}
public void addTrigger(El triggerToAdd){
this.triggers.add( triggerToAdd );
this.triggerStyles.add(null);
this.triggerStylesOnMouseOver.add(null);
}
public void addTrigger(){
this.addTrigger( new El(DOM.createImg()) );
}
public void addTriggers(int nrOfTriggersToAdd){
for (int i = 0; i < nrOfTriggersToAdd; i++){
this.addTrigger( new El(DOM.createImg()) );
}
}
//trigger style
public String getTriggerStyle( int index ){
assert( index >= 0 && this.triggerStyles.size() >= index );
return this.triggerStyles.get(index);
}
public String getFirstTriggerStyle(){
assert( this.triggerStyles.size() >= 0 );
return this.triggerStyles.get(0);
}
public String getSecondTriggerStyle(){
assert( this.triggerStyles.size() >= 1 );
return this.triggerStyles.get(1);
}
public String getThirdTriggerStyle(){
assert( this.triggerStyles.size() >= 2 );
return this.triggerStyles.get(2);
}
public void setTriggerStyle( String triggerStyleToSet, int index ){
assert( index >= 0 && this.triggerStyles.size() >= index );
this.triggerStyles.set(index, triggerStyleToSet);
}
public void setFirstTriggerStyle( String triggerStyleToSet ){
assert( this.triggerStyles.size() >= 0 );
this.triggerStyles.set(0, triggerStyleToSet);
}
public void setSecondTriggerStyle( String triggerStyleToSet ){
assert( this.triggerStyles.size() >= 1 );
this.triggerStyles.set(1, triggerStyleToSet);
}
public void setThirdTriggerStyle( String triggerStyleToSet ){
assert( this.triggerStyles.size() >= 2 );
this.triggerStyles.set(2, triggerStyleToSet);
}
//trigger style on mouse over
public String getTriggerStyleOnMouseOver(int index) {
return this.triggerStylesOnMouseOver.get(index);
}
public String getFirstTriggerStyleOnMouseOver(){
assert( this.triggerStylesOnMouseOver.size() >= 0 );
return this.triggerStylesOnMouseOver.get(0);
}
public String getSecondTriggerStyleOnMouseOver(){
assert( this.triggerStylesOnMouseOver.size() >= 1 );
return this.triggerStylesOnMouseOver.get(1);
}
public String getThirdTriggerStyleOnMouseOver(){
assert( this.triggerStylesOnMouseOver.size() >= 2 );
return this.triggerStylesOnMouseOver.get(2);
}
public void setTriggerStyleOnMouseOver( String triggerStyleOnMouseOverToSet, int index ){
assert( index >= 0 && this.triggerStylesOnMouseOver.size() >= index );
this.triggerStylesOnMouseOver.set(index, triggerStyleOnMouseOverToSet);
}
public void setFirstTriggerStyleOnMouseOver( String triggerStyleOnMouseOverToSet ){
assert( this.triggerStylesOnMouseOver.size() >= 0 );
this.triggerStylesOnMouseOver.set(0, triggerStyleOnMouseOverToSet);
}
public void setSecondTriggerStyleOnMouseOver( String triggerStyleOnMouseOverToSet ){
assert( this.triggerStylesOnMouseOver.size() >= 1 );
this.triggerStylesOnMouseOver.set(1, triggerStyleOnMouseOverToSet);
}
public void setThirdTriggerStyleOnMouseOver( String triggerStyleOnMouseOverToSet ){
assert( this.triggerStylesOnMouseOver.size() >= 2 );
this.triggerStylesOnMouseOver.set(2, triggerStyleOnMouseOverToSet);
}
//events
final void onTriggerEvent(final ComponentEvent ce) {
/*
0 - should be Remove
1 - should be Add
*/
final El target = ce.getTargetEl();
int counter = 0;
for( final El trigger : this.triggers ){
if (target.dom == trigger.dom) {
this.onNthTriggerEvent(ce, counter);
return;
}
counter++;
}
}
private final void onNthTriggerEvent(ComponentEvent ce, int index) {
final int type = ce.getEventType();
switch (type) {
case Event.ONMOUSEOVER:
this.getTrigger(index).addStyleName( this.getTriggerStyleOnMouseOver(index) );
return;
case Event.ONMOUSEOUT:
this.getTrigger(index).removeStyleName( this.getTriggerStyleOnMouseOver(index) );
return;
case Event.ONCLICK:
this.fireEvent( triggerClickEvent[index], ce);
return;
default:
//do not throw exception, as the following events may also occur: ONMOUSEMOVE(64), ...others
}
}