    001package org.vishia.gral.base;
    002
    003import java.util.EventObject;
    004
    005import org.vishia.event.EventConsumer;
    006import org.vishia.event.TimeOrder;
    007
    008
    009/**This is the base class for user classes, which contains code, that should be executed in the graphic thread.
    010 * The method {@link #executeOrder()} should be overridden with the functionality which should be executed
    011 * in the graphic thread before the system's dispatching routine starts.
    012 *
    013 * @author Hartmut Schorrig.
    014 *
    015 */
    016public abstract class GralGraphicTimeOrder extends TimeOrder
    017{
    018
    019  /**Version and history.
    020   * <ul>
    021   * <li>2015-01-10 Hartmut renamed from <code>GralDispatchCallbackWorker</code>
    022   * <li>2012-02-14 Hartmut corr: {@link #addToGraphicThread(GralGraphicThread, int)}:
    023   *   For time saving: If an instance is added already and its new execution time
    024   *   is up to 5 ms later, nothing is done. It saves time for more as one call of this routine
    025   *   in a fast loop.
    026   * <li>2012-02-14 Hartmut corr: It was happen that an instance was designated with {@link #bAdded}==true
    027   *   but it wasn't added, Therefore on {@link #addToGraphicThread(GralGraphicThread, int)} it is removed
    028   *   from list and added newly. It is more save.
    029   * <li>2012-01-26 Hartmut chg: rename removeFromGraphicThread(GralGraphicThread)
    030   *   to {@link #removeFromQueue(GralGraphicThread)}. It is a better naming because it is removed from the queue
    031   *   in the graphic thread. This class is only used in that queue.
    032   * <li>2012-01-15 Hartmut new: {@link #name} to identify, proper for debugging
    033   * <li>2012-01-08 Hartmut new: {@link #addToGraphicThread(GralGraphicThread, int)} and
    034   *   {@link #removeFromQueue(GralGraphicThread)} as thread-safe functions which
    035   *   marks the instance as added (for delayed execution, for re-using).
    036   * <li>2011-02-21 Hartmut created.
    037   * </ul>
    038   *
    039   * <b>Copyright/Copyleft</b>:
    040   * For this source the LGPL Lesser General Public License,
    041   * published by the Free Software Foundation is valid.
    042   * It means:
    043   * <ol>
    044   * <li> You can use this source without any restriction for any desired purpose.
    045   * <li> You can redistribute copies of this source to everybody.
    046   * <li> Every user of this source, also the user of redistribute copies
    047   *    with or without payment, must accept this license for further using.
    048   * <li> But the LPGL is not appropriate for a whole software product,
    049   *    if this source is only a part of them. It means, the user
    050   *    must publish this part of source,
    051   *    but don't need to publish the whole source of the own product.
    052   * <li> You can study and modify (improve) this source
    053   *    for own using or for redistribution, but you have to license the
    054   *    modified sources likewise under this LGPL Lesser General Public License.
    055   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    056   * </ol>
    057   * If you are indent to use this sources without publishing its usage, you can get
    058   * a second license subscribing a special contract with the author.
    059   *
    060   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    061   *
    062   *
    063   */
    064  public final static String version = "2015-01-17";
    065
    066
    067  private static final long serialVersionUID = 1L;
    068
    069  /**To create the instance for the EventConsumer to enqueue time orders in the graphic thread queue.
    070   * NOTE: class is need, not an anonymous instance, because initialization in super(..., new Enqueu...)
    071   */
    072  private static class EnqueueInGraphicThread implements EventConsumer {
    073    @Override public int processEvent(EventObject ev)
    074    { //the manager is known application global
    075      GralMng mng = GralMng.get();  //the singleton.
    076      if(mng !=null) {
    077        mng.gralDevice().storeEvent(ev);
    078      }
    079      return mEventConsumed;
    080    }
    081
    082  };
    083
    084
    085
    086  /**Super constructor for all graphic time orders.
    087   * Usual a anonymous class is used for the instance: <pre>
    088  private final GralGraphicTimeOrder repaintRequ = new GralGraphicTimeOrder("GralWidget.repaintRequ"){
    089    QOverride public void executeOrder() {
    090      repaintGthread();
    091    }
    092    QOverride public String toString(){ return name + ":" + GralWidget.this.name; }
    093  };
    094   * </pre>
    095   * @param name The name is only used for showing in debugging.
    096   */
    097  protected GralGraphicTimeOrder(String name)
    098  { super(name, new EnqueueInGraphicThread(), GralMng.get().gralDevice.orderList);
    099  }
    100
    101
    102
    103  /**Activates the graphic order to execute immediately as next call in the graphic thread. */
    104  public void activate(){
    105    GralMng mng = GralMng.get();  //the singleton.
    106    mng.gralDevice().storeEvent(this);
    107  }
    108
    109}