Package com.aelitis.azureus.ui.swt.skin

Source Code of com.aelitis.azureus.ui.swt.skin.SWTSkinObjectBasic$GradientInfo

/**
*
*/
package com.aelitis.azureus.ui.swt.skin;

import java.util.*;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.debug.ObfusticateImage;

import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
import com.aelitis.azureus.ui.swt.utils.ColorCache;
import com.aelitis.azureus.ui.swt.views.skin.SkinView;
import com.aelitis.azureus.util.StringCompareUtils;

/**
* @author TuxPaper
* @created Jun 12, 2006
*
*/
public class SWTSkinObjectBasic
  implements SWTSkinObject, PaintListener, ObfusticateImage
{
  protected static final int BORDER_ROUNDED = 1;

  protected static final int BORDER_ROUNDED_FILL = 2;

  protected static final int BORDER_GRADIENT = 3;

  protected Control control;

  protected String type;

  protected String sConfigID;

  protected SWTBGImagePainter painter;

  protected SWTSkinProperties properties;

  protected String sID;

  // XXX Might be wise to force this to SWTSkinObjectContainer
  protected SWTSkinObject parent;

  protected SWTSkin skin;

  protected String[] suffixes = null;

  protected ArrayList<SWTSkinObjectListener> listeners = new ArrayList<SWTSkinObjectListener>();

  protected AEMonitor listeners_mon = new AEMonitor(
      "SWTSkinObjectBasic::listener");

  private String sViewID;

  private int isVisible = -1;

  protected Color bgColor;

  private Color colorBorder;

  private int[] colorBorderParams = null;

  private int[] colorFillParams;

  private int colorFillType;

  boolean initialized = false;

  boolean paintListenerHooked = false;

  boolean alwaysHookPaintListener = false;
 
  private Map mapData = Collections.EMPTY_MAP;
 
  private boolean disposed = false;
 
  protected boolean debug = false;

  private List<GradientInfo> listGradients = new ArrayList<GradientInfo>();

  private Image bgImage;

  private String tooltipID;

  protected boolean customTooltipID = false;

  private Listener resizeGradientBGListener;

  private SkinView skinView;

  private Object datasource;

  private boolean firstVisibility;

  private boolean layoutComplete;

  private ObfusticateImage obfusticatedImageGenerator;

  /**
   * @param properties TODO
   *
   */
  public SWTSkinObjectBasic(SWTSkin skin, SWTSkinProperties properties,
      Control control, String sID, String sConfigID, String type,
      SWTSkinObject parent) {
    this(skin, properties, sID, sConfigID, type, parent);
    setControl(control);
   
  }

  public SWTSkinObjectBasic(SWTSkin skin, SWTSkinProperties properties,
      String sID, String sConfigID, String type, SWTSkinObject parent) {
    this.skin = skin;
    this.properties = properties;
    this.sConfigID = sConfigID;
    this.sID = sID;
    this.type = type;
    this.parent = parent;
    setViewID(properties.getStringValue(sConfigID + ".view"));
    setDebug(properties.getBooleanValue(sConfigID + ".debug", false));
  }

  public void setControl(final Control _control) {
   
    firstVisibility = properties.getBooleanValue(sConfigID + ".visible", true);
   
    if (!Utils.isThisThreadSWT()) {
      Debug.out("Warning: setControl not called in SWT thread for " + this);
      Utils.execSWTThread(new AERunnable() {
        public void runSupport() {
          setControl(control);
        }
      });
      return;
    }
   
    resizeGradientBGListener = new Listener() {
      public void handleEvent(Event event) {
        if (bgImage != null && !bgImage.isDisposed()) {
          bgImage.dispose();
        }
        Rectangle bounds = control.getBounds();
        if (bounds.height <= 0) {
          return;
        }
        bgImage = new Image(control.getDisplay(), 5, bounds.height);
        GC gc = new GC(bgImage);
        try {
          try {
            gc.setAdvanced(true);
            gc.setInterpolation(SWT.HIGH);
            gc.setAntialias(SWT.ON);
          } catch (Exception ex) {
          }
         
          GradientInfo lastGradInfo = new GradientInfo(bgColor, 0);
          for (GradientInfo gradInfo : listGradients) {
            if (gradInfo.startPoint != lastGradInfo.startPoint) {
              gc.setForeground(lastGradInfo.color);
              gc.setBackground(gradInfo.color);

              int y = (int) (bounds.height * lastGradInfo.startPoint);
              int height = (int) (bounds.height * gradInfo.startPoint) - y;
              gc.fillGradientRectangle(0, y, 5, height, true);
            }
            lastGradInfo = gradInfo;
          }

          if (lastGradInfo.startPoint < 1) {
            gc.setForeground(lastGradInfo.color);
            gc.setBackground(lastGradInfo.color);

            int y = (int) (bounds.height * lastGradInfo.startPoint);
            int height = bounds.height - y;
            gc.fillGradientRectangle(0, y, 5, height, true);
          }
        } finally {
          gc.dispose();
        }
        if (painter == null) {
          // Use TILE_BOTH because a gradient should never set the size of the control
          // Rather, the gradient image is made based on the control size.  If
          // we used TILE_X, SWTBGImagePainter would force the height to the
          // current image, thus preventing any auto-resizing
          painter = new SWTBGImagePainter(control, null, null,
              bgImage, SWTSkinUtils.TILE_BOTH);
        } else {
          painter.setImage(null, null, bgImage);
        }
      }
    };
   
    this.control = _control;
    control.setData("ConfigID", sConfigID);
    control.setData("SkinObject", this);

    SWTSkinUtils.addMouseImageChangeListeners(control);
    switchSuffix(null, 0, false);

    // setvisible is one time only
    if (!properties.getBooleanValue(sConfigID + ".visible", true)) {
      setVisible(false);
    }

    final Listener lShowHide = new Listener() {
      public void handleEvent(final Event event) {
        final boolean toBeVisible = event.type == SWT.Show;
        if (SWTSkin.DEBUG_VISIBILITIES) {
          System.out.println(">>swt.show/hide " + ((event.widget).getData("SkinObject")) + ";tobe/is=" + toBeVisible + "/" + isVisible + " via " + Debug.getCompressedStackTrace());
          //System.out.println(SWTSkinObjectBasic.this + "> swt.show/hide " + ((event.widget).getData("SkinObject")) + ";" + ((Control)event.widget).isVisible() + ";" + Debug.getCompressedStackTrace());
        }

        // wait until show or hide event is processed to guarantee
        // isVisible will be correct for listener triggers
        Utils.execSWTThreadLater(0, new AERunnable() {
          public void runSupport() {
            if (SWTSkin.DEBUG_VISIBILITIES) {
              //System.out.println(">>swt.show/hide " + ((event.widget).getData("SkinObject")) + ";" + ((Control) event.widget).isVisible());
            }
            if (control == null || control.isDisposed()) {
              setIsVisible(false, true);
              return;
            }

            if (toBeVisible == control.isVisible() && (isVisible == 1) == toBeVisible) {
              return;
            }

            if (event.widget == control) {
              setIsVisible(toBeVisible, true);
              return;
            }

            if (!toBeVisible || control.isVisible()) {
              setIsVisible(toBeVisible, true);
              return;
            }
            setIsVisible(control.isVisible(), true);
          }
        });
      }
    };

    control.addListener(SWT.Show, lShowHide);
    control.addListener(SWT.Hide, lShowHide);
    final Shell shell = control.getShell();
    shell.addListener(SWT.Show, lShowHide);
    shell.addListener(SWT.Hide, lShowHide);

    control.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent e) {
        disposed = true;
        shell.removeListener(SWT.Show, lShowHide);
        shell.removeListener(SWT.Hide, lShowHide);

        skin.removeSkinObject(SWTSkinObjectBasic.this);
      }
    });
   
    control.addListener(SWT.MouseHover, new Listener() {
      public void handleEvent(Event event) {
        String id = getTooltipID(true);
        if (id == null) {
          control.setToolTipText(null);
        } else if (id.startsWith("!") && id.endsWith("!")) {
          control.setToolTipText(id.substring(1, id.length() - 1));
        } else {
          control.setToolTipText(MessageText.getString(id, (String) null));
        }
      }
    });
   
    if (parent instanceof SWTSkinObjectContainer) {
      ((SWTSkinObjectContainer)parent).childAdded(this);
    }
  }

  /**
   * @param visible
   *
   * @since 3.0.4.3
   */
  protected boolean setIsVisible(boolean visible, boolean walkup) {
    if ((visible ? 1 : 0) == isVisible) {
      return false;
    }
    if (SWTSkin.DEBUG_VISIBILITIES) {
      System.out.println(this + " SET IS VISIBLE " + visible + " via " + Debug.getCompressedStackTrace(9));
    }
    isVisible = visible ? 1 : 0;
    switchSuffix(null, 0, false);
    triggerListeners(visible ? SWTSkinObjectListener.EVENT_SHOW
        : SWTSkinObjectListener.EVENT_HIDE);
   
    // only walkup when visible.. yes?
    if (walkup && visible) {
      SWTSkinObject p = parent;
     
      while (p instanceof SWTSkinObjectBasic) {
        ((SWTSkinObjectBasic) p).setIsVisible(visible, false);
        p = ((SWTSkinObjectBasic) p).getParent();
      }
    }
    return true;
  }

  public Control getControl() {
    return control;
  }

  public String getType() {
    return type;
  }

  public String getConfigID() {
    return sConfigID;
  }

  public String getSkinObjectID() {
    return sID;
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#getParent()
  public SWTSkinObject getParent() {
    return parent;
  }

  public void setBackground(String sConfigID, String sSuffix) {
    Image imageBG;
    Image imageBGLeft;
    Image imageBGRight;

    if (sConfigID == null) {
      return;
    }
   
    ImageLoader imageLoader = skin.getImageLoader(properties);

    String id = null;
    String idLeft = null;
    String idRight = null;
   
    String s = properties.getStringValue(sConfigID + sSuffix, (String) null);
    if (s != null && s.length() > 0) {
      Image[] images = imageLoader.getImages(sConfigID + sSuffix);
      if (images.length == 1 && ImageLoader.isRealImage(images[0])) {
        id = sConfigID + sSuffix;
        idLeft = id + "-left";
        idRight = id + "-right";
      } else if (images.length == 3 && ImageLoader.isRealImage(images[2])) {
        id = sConfigID + sSuffix;
        idLeft = id;
        idRight = id;
      } else if (images.length == 2 && ImageLoader.isRealImage(images[1])) {
        id = sConfigID + sSuffix;
        idLeft = id;
        idRight = id + "-right";
      } else {
        id = sConfigID + sSuffix;
        //if (sSuffix.length() > 0) {
        //  setBackground(sConfigID, "");
        //}
        return;
      }
    } else {
      if (s != null && painter != null) {
        painter.dispose();
        painter = null;
      }
      if (s == null) {
        //if (sSuffix.length() > 0) {
        //  setBackground(sConfigID, "");
        //}
      }
      return;
    }

    if (painter == null) {
      //control.setBackgroundImage doesn't handle transparency!
      //control.setBackgroundImage(image);

      // Workaround: create our own image with shell's background
      // for "transparent" area.  Doesn't allow control's image to show
      // through.  To do that, we'd have to walk up the tree until we
      // found a composite with an image
      //control.setBackgroundMode(SWT.INHERIT_NONE);
      //control.setBackgroundImage(imageBG);

      String sTileMode = properties.getStringValue(sConfigID + ".drawmode");
      int tileMode = SWTSkinUtils.getTileMode(sTileMode);
//      painter = new SWTBGImagePainter(control, imageBGLeft, imageBGRight,
//          imageBG, tileMode);
      painter = new SWTBGImagePainter(control, imageLoader, idLeft, idRight,
          id, tileMode);
    } else {
      //System.out.println("setImage " + sConfigID + "  " + sSuffix);
      painter.setImage(imageLoader, idLeft, idRight, id);
    }

    // XXX Is this needed?  It causes flicker and slows things down.
    //     Maybe a redraw instead (if anything at all)?
    //control.update();
  }

  // @see java.lang.Object#toString()
  public String toString() {
    String s = "SWTSkinObjectBasic {" + sID;

    if (!sID.equals(sConfigID)) {
      s += "/" + sConfigID;
    }

    if (sViewID != null) {
      s += "/v=" + sViewID;
    }

    s += ", " + type + "; parent="
        + ((parent == null) ? null : parent.getSkinObjectID() + "}");

    return s;
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#getSkin()
  public SWTSkin getSkin() {
    return skin;
  }

  // @see java.lang.Object#equals(java.lang.Object)
  public boolean equals(Object obj) {
    if (obj instanceof SWTSkinObject) {
      SWTSkinObject skinObject = (SWTSkinObject) obj;
      boolean bEquals = skinObject.getSkinObjectID().equals(sID);
      if (parent != null) {
        return bEquals && parent.equals(skinObject.getParent());
      }
      return bEquals;
    }

    return super.equals(obj);
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#setVisible(boolean)
  public void setVisible(final boolean visible) {
    if (!layoutComplete) {
      firstVisibility = visible;
      setIsVisible(visible, true);
      return;
    }
    if (SWTSkin.DEBUG_VISIBILITIES) {
      System.out.println(this + " SET VISIBLE(" + visible + ") via "
          + Debug.getCompressedStackTrace());
    }
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        if (control != null && !control.isDisposed()) {
          boolean changed = visible != control.isVisible()
              || (visible ? 1 : 0) != isVisible;

          Object ld = control.getLayoutData();
          if (ld instanceof FormData) {
            FormData fd = (FormData) ld;
            if (!visible) {
              if (fd.width > 0 && fd.height > 0) {
                control.setData("oldSize", new Point(fd.width, fd.height));
                changed = true;
              }
              fd.width = 0;
              fd.height = 0;
            } else {
              Object oldSize = control.getData("oldSize");
              Point oldSizePoint = (oldSize instanceof Point) ? (Point) oldSize
                  : new Point(SWT.DEFAULT, SWT.DEFAULT);
              if (fd.width <= 0) {
                changed = true;
                fd.width = oldSizePoint.x;
              }
              if (fd.height <= 0) {
                changed = true;
                fd.height = oldSizePoint.y;
              }
            }
            if (changed) {
              control.setLayoutData(fd);
              control.getParent().layout(true);
              Utils.relayout(control);
            }
          } else if (ld == null && !visible) {
            FormData fd = new FormData();
            fd.width = 0;
            fd.height = 0;
            control.setLayoutData(fd);
          }
          if (changed || true) { // For some reason this is required even when !changed (on Windows)
            control.setVisible(visible);
          }
          // still need to call setIsVisible to walk up/down
          setIsVisible(visible, true);
        }
      }
    });
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#setDefaultVisibility()
  public void setDefaultVisibility() {
    if (sConfigID == null) {
      return;
    }

    setVisible(getDefaultVisibility());
  }

  public boolean getDefaultVisibility() {
    return firstVisibility;
  }

  public boolean isVisible() {
    if (control == null || control.isDisposed()) {
      return false;
    }
    if (!layoutComplete) {
      return firstVisibility;
    }
    return isVisible == -1 ? firstVisibility : isVisible == 1;
  }

  /**
   * Switch the suffix using the default of <code>1</code> for level and <code>false</code> for walkUp
   */
  public String switchSuffix(String suffix) {
    return switchSuffix(suffix, 1, false);
  }

  public final String switchSuffix(String suffix, int level, boolean walkUp) {
    return switchSuffix(suffix, level, walkUp, true);
  }

  public String switchSuffix(String newSuffixEntry, int level, boolean walkUp, boolean walkDown) {
    if (walkUp) {
      SWTSkinObject parentSkinObject = parent;
      SWTSkinObject skinObject = this;

      // Move up the tree until propogation stops
      while ((parentSkinObject instanceof SWTSkinObjectContainer)
          && ((SWTSkinObjectContainer) parentSkinObject).getPropogation()) {
        skinObject = parentSkinObject;
        parentSkinObject = parentSkinObject.getParent();
      }

      if (skinObject != this) {
        //System.out.println(sConfigID + suffix + "; walkup");

        skinObject.switchSuffix(newSuffixEntry, level, false);
        return null;
      }
    }
    String old = getSuffix();

    if (level > 0) {
      //System.out.println(SystemTime.getCurrentTime() + ": " + this + suffix + "; switchy");
      if (suffixes == null) {
        old = null;
        suffixes = new String[level];
      } else if (suffixes.length < level) {
        String[] newSuffixes = new String[level];
        System.arraycopy(suffixes, 0, newSuffixes, 0, suffixes.length);
        suffixes = newSuffixes;
      }
      suffixes[level - 1] = newSuffixEntry;
    }

    String fullSuffix = getSuffix();

    if (newSuffixEntry != null) {
      if (sConfigID == null || control == null || control.isDisposed()
          || !isVisible() || (newSuffixEntry != null && fullSuffix.equals(old))) {
        return fullSuffix;
      }
    }

    final String sSuffix = fullSuffix;

    Utils.execSWTThread(new AERunnable() {

      public void runSupport() {
        if (control == null || control.isDisposed()) {
          return;
        }

        boolean needPaintHook = false;

        if (properties.hasKey(sConfigID + ".color" + sSuffix)) {
          control.removeListener(SWT.Resize, resizeGradientBGListener);

          Color color = properties.getColor(sConfigID + ".color" + sSuffix);
          bgColor = color;
          String colorStyle = properties.getStringValue(sConfigID
              + ".color.style" + sSuffix);
          if (colorStyle != null) {
            String[] split = Constants.PAT_SPLIT_COMMA.split(colorStyle);

            if (split.length > 2) {
              try {
                colorFillParams = new int[] {
                  Integer.parseInt(split[1]),
                  Integer.parseInt(split[2])
                };
              } catch (NumberFormatException e) {
                //ignore
              }
            }

            if (split[0].equals("rounded")) {
              colorFillType = BORDER_ROUNDED;
              needPaintHook = true;
            } else if (split[0].equals("rounded-fill")) {
              colorFillType = BORDER_ROUNDED_FILL;
              needPaintHook = true;
            } else if (split[0].equals("gradient")) {
              colorFillType = BORDER_GRADIENT;
             
              Device device = Display.getDefault();
              for (int i = 1; i < split.length; i += 2) {
                Color colorStop = ColorCache.getSchemedColor(device, split[i]);
                double posStop = 1;
                if (i != split.length - 1) {
                  try {
                    posStop = Double.parseDouble(split[i+1]);
                  } catch (Exception ignore) {
                  }
                }
                listGradients.add(new GradientInfo(colorStop, posStop));
              }
             
              control.addListener(SWT.Resize, resizeGradientBGListener);
              resizeGradientBGListener.handleEvent(null);
            }

            control.redraw();
            control.setBackground(null);
          } else {
            control.setBackground(bgColor);
          }
        }

        Color fg = getColor_SuffixWalkback(sConfigID + ".fgcolor");
        control.setForeground(fg);

        // Color,[width]
        String sBorderStyle = properties.getStringValue(sConfigID + ".border"
            + sSuffix);
        colorBorder = null;
        colorBorderParams = null;
        if (sBorderStyle != null) {
          String[] split = Constants.PAT_SPLIT_COMMA.split(sBorderStyle);
          colorBorder = ColorCache.getSchemedColor(control.getDisplay(), split[0]);
          needPaintHook |= colorBorder != null;

          if (split.length > 2) {
            colorBorderParams = new int[] {
              Integer.parseInt(split[1]),
              Integer.parseInt(split[2])
            };
          }
        }

        setBackground(sConfigID + ".background", sSuffix);

        String sCursor = properties.getStringValue(sConfigID + ".cursor");
        if (sCursor != null && sCursor.length() > 0) {
          if (sCursor.equalsIgnoreCase("hand")) {
            Listener handCursorListener = skin.getHandCursorListener(control.getDisplay());
            control.removeListener(SWT.MouseEnter, handCursorListener);
            control.removeListener(SWT.MouseExit, handCursorListener);
           
            control.addListener(SWT.MouseEnter, handCursorListener);
            control.addListener(SWT.MouseExit, handCursorListener);
          }
        }

        if (!customTooltipID ) {
          String newToolTipID = properties.getReferenceID(sConfigID + ".tooltip"
              + sSuffix);
          if (newToolTipID == null && sSuffix.length() > 0) {
            newToolTipID = properties.getReferenceID(sConfigID + ".tooltip");
          }
          tooltipID = newToolTipID;
        }
       
        if (!alwaysHookPaintListener && needPaintHook != paintListenerHooked) {
          if (needPaintHook) {
            control.addPaintListener(SWTSkinObjectBasic.this);
          } else {
            control.removePaintListener(SWTSkinObjectBasic.this);
          }
          paintListenerHooked = needPaintHook;
        }

      }

    });
    return fullSuffix;
  }

  public String getSuffix() {
    String suffix = "";
    if (suffixes == null) {
      return suffix;
    }
    for (int i = 0; i < suffixes.length; i++) {
      if (suffixes[i] != null) {
        suffix += suffixes[i];
      }
    }
    if (suffix.indexOf("-down-over") >= 0) {
      return suffix.replaceAll("-down-over", "-down");
    }
    return suffix;
  }

  /**
   * @return the properties
   */
  public SWTSkinProperties getProperties() {
    return properties;
  }

  public void setProperties(SWTSkinProperties skinProperties) {
    this.properties = skinProperties;
  }

  /* (non-Javadoc)
   * @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#addListener(com.aelitis.azureus.ui.swt.skin.SWTSkinObjectListener)
   */
  public void addListener(final SWTSkinObjectListener listener) {
    listeners_mon.enter();
    try {
      listeners.add(listener);
    } finally {
      listeners_mon.exit();
    }
   
    if (initialized) {
      listener.eventOccured(this, SWTSkinObjectListener.EVENT_CREATED, null);
    }

    if (datasource != null) {
      listener.eventOccured(SWTSkinObjectBasic.this,
          SWTSkinObjectListener.EVENT_DATASOURCE_CHANGED, datasource);
    }

    if (isVisible == 1 && initialized) {
      Utils.execSWTThreadLater(0, new AERunnable() {
        public void runSupport() {
          listener.eventOccured(SWTSkinObjectBasic.this,
              SWTSkinObjectListener.EVENT_SHOW, null);
        }
      });
    }
  }

  /* (non-Javadoc)
   * @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#removeListener(com.aelitis.azureus.ui.swt.skin.SWTSkinObjectListener)
   */
  public void removeListener(SWTSkinObjectListener listener) {
    listeners_mon.enter();
    try {
      listeners.remove(listener);
    } finally {
      listeners_mon.exit();
    }
  }

  public SWTSkinObjectListener[] getListeners() {
    return listeners.toArray(new SWTSkinObjectListener[0]);
  }

  public void triggerListeners(int eventType) {
    triggerListeners(eventType, null);
  }

  public void triggerListeners(final int eventType, final Object params) {
    if (SWTSkin.DEBUG_VISIBILITIES) {
      if (eventType == SWTSkinObjectListener.EVENT_SHOW) {
        System.out.println("Show " + this + " via " + Debug.getCompressedStackTrace());
      }
    }
    // delay show and hide events while not initialized
    if (eventType == SWTSkinObjectListener.EVENT_SHOW
        || eventType == SWTSkinObjectListener.EVENT_HIDE) {
      if (!initialized) {
        //System.out.println("NOT INITIALIZED! " + SWTSkinObjectBasic.this + ";;;" + Debug.getCompressedStackTrace());
        return;
      }

      if (eventType == SWTSkinObjectListener.EVENT_SHOW && !isVisible()) {
        if (SWTSkin.DEBUG_VISIBILITIES) {
          System.out.println("Warning: Show Event when not visible " + this + " via " + Debug.getCompressedStackTrace());
        }
        return;
      } else if (eventType == SWTSkinObjectListener.EVENT_HIDE && isVisible()) {
        if (SWTSkin.DEBUG_VISIBILITIES) {
          System.out.println("Warning: Hide Event when visible " + this + " via " + Debug.getCompressedStackTrace());
        }
        return;
      }
    } else if (eventType == SWTSkinObjectListener.EVENT_CREATED) {
      //System.out.println("INITIALIZED! " + SWTSkinObjectBasic.this + ";;;" + Debug.getCompressedStackTrace());
      initialized = true;
    } else if (eventType == SWTSkinObjectListener.EVENT_DATASOURCE_CHANGED) {
      datasource = params;
    }
   
    // process listeners added locally
    SWTSkinObjectListener[] listenersArray = getListeners();
    if (listenersArray.length > 0) {
      // don't use iterator as triggering code may try to remove itself
      for (SWTSkinObjectListener l : listenersArray) {
        try {
          l.eventOccured(this, eventType, params);
        } catch (Exception e) {
          Debug.out("Skin Event " + SWTSkinObjectListener.NAMES[eventType]
              + " caused an error for listener added locally", e);
        }
      }
    }

    // process listeners added to skin
    SWTSkinObjectListener[] listeners = skin.getSkinObjectListeners(sViewID);
    if (listeners.length > 0) {
      for (int i = 0; i < listeners.length; i++) {
        try {
          SWTSkinObjectListener l = listeners[i];
          l.eventOccured(this, eventType, params);
        } catch (Exception e) {
          Debug.out("Skin Event " + SWTSkinObjectListener.NAMES[eventType]
              + " caused an error for listener added to skin", e);
        }
      }
    }

    if (eventType == SWTSkinObjectListener.EVENT_CREATED && isVisible >= 0) {
      triggerListeners(isVisible() ? SWTSkinObjectListener.EVENT_SHOW
          : SWTSkinObjectListener.EVENT_HIDE);
    }

    if (eventType == SWTSkinObjectListener.EVENT_SHOW && skinView == null) {
      String initClass = properties.getStringValue(sConfigID + ".onshow.skinviewclass");
      if (initClass != null) {
        try {
          String[] initClassItems = Constants.PAT_SPLIT_COMMA.split(initClass);
          ClassLoader claLoader = this.getClass().getClassLoader();
          if (initClassItems.length > 1) {
            try {
              PluginInterface pi = PluginInitializer.getDefaultInterface().getPluginManager().getPluginInterfaceByID(initClassItems[1]);
              if (pi != null) {
                claLoader = pi.getPluginClassLoader();
              }
            } catch (Exception e) {
              Debug.out(e);
            }
          }
          Class<SkinView> cla = (Class<SkinView>) Class.forName(initClassItems[0], true, claLoader);

          skinView = cla.newInstance();
          skinView.setMainSkinObject(this);
         
          // this will fire created and show for us
          addListener(skinView);
        } catch (Throwable e) {
          Debug.out(e);
        }
      }
    }
  }

  protected void setViewID(String viewID) {
    sViewID = viewID;
  }

  public String getViewID() {
    return sViewID;
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#dispose()
  public void dispose() {
    if (disposed) {
      return;
    }
    Utils.disposeSWTObjects(new Object[] {
      control
    });

    if (skinView != null) {
      removeListener(skinView);

      if (skinView instanceof UIUpdatable) {
        UIUpdatable updateable = (UIUpdatable) skinView;
        try {
          UIFunctionsManager.getUIFunctions().getUIUpdater().removeUpdater(
              updateable);
        } catch (Exception e) {
          Debug.out(e);
        }
      }
    }
  }

  public boolean isDisposed() {
    return disposed;
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#setTooltipID(java.lang.String)
  public void setTooltipID(final String id) {
    if (isDisposed()) {
      return;
    }
    if (StringCompareUtils.equals(id, tooltipID)) {
      return;
    }

    tooltipID = id;
    customTooltipID = true;
  }
 
  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#getTooltipID(boolean)
  public String getTooltipID(boolean walkup) {
    if (tooltipID != null || !walkup) {
      return tooltipID;
    }
    if (parent != null) {
      return parent.getTooltipID(true);
    }
    return null;
  }

  public void paintControl(GC gc) {
  }

  // @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
  public final void paintControl(PaintEvent e) {
    if (bgColor != null) {
      e.gc.setBackground(bgColor);
    }

    paintControl(e.gc);

    try {
      e.gc.setAdvanced(true);
      e.gc.setAntialias(SWT.ON);
    } catch (Exception ex) {
    }

    if (colorFillType > 0) {

      Rectangle bounds = (control instanceof Composite)
          ? ((Composite) control).getClientArea() : control.getBounds();
      if (colorFillParams != null) {
        if (colorFillType == BORDER_ROUNDED_FILL) {
          e.gc.fillRoundRectangle(0, 0, bounds.width - 1, bounds.height - 1,
              colorFillParams[0], colorFillParams[1]);
          e.gc.drawRoundRectangle(0, 0, bounds.width - 1, bounds.height - 1,
              colorFillParams[0], colorFillParams[1]);
        } else if (colorFillType == BORDER_ROUNDED) {
          Color oldFG = e.gc.getForeground();
          e.gc.setForeground(bgColor);
          e.gc.drawRoundRectangle(0, 0, bounds.width - 1, bounds.height - 1, colorFillParams[0],
              colorFillParams[1]);
          e.gc.setForeground(oldFG);
        }
      }
//      if (colorFillType == BORDER_GRADIENT) {
//        Color oldFG = e.gc.getForeground();
//        e.gc.setForeground(bgColor2);
//        e.gc.fillGradientRectangle(0, 0, bounds.width - 1, bounds.height - 1, true);
//        e.gc.setForeground(oldFG);
//      }     
    }

    if (colorBorder != null) {
      e.gc.setForeground(colorBorder);
      Rectangle bounds = (control instanceof Composite)
          ? ((Composite) control).getClientArea() : control.getBounds();
      bounds.width -= 1;
      bounds.height -= 1;
      if (colorBorderParams == null) {
        e.gc.drawRectangle(bounds);
      } else {
        e.gc.drawRoundRectangle(bounds.x, bounds.y, bounds.width,
            bounds.height, colorBorderParams[0], colorBorderParams[1]);
      }
    }
  }

  public boolean isAlwaysHookPaintListener() {
    return alwaysHookPaintListener;
  }

  public void setAlwaysHookPaintListener(boolean alwaysHookPaintListener) {
    this.alwaysHookPaintListener = alwaysHookPaintListener;
    if (alwaysHookPaintListener && !paintListenerHooked) {
      control.addPaintListener(SWTSkinObjectBasic.this);
      paintListenerHooked = true;
    }
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#getData(java.lang.String)
  public Object getData(String id) {
    return mapData.get(id);
  }

  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#setData(java.lang.String, java.lang.Object)
  public void setData(String id, Object data) {
    if (mapData == Collections.EMPTY_MAP) {
      mapData = new HashMap(1);
    }
    mapData.put(id, data);
  }

  // @see org.gudy.azureus2.ui.swt.debug.ObfusticateImage#obfusticatedImage(org.eclipse.swt.graphics.Image, org.eclipse.swt.graphics.Point)
  public Image obfusticatedImage(Image image) {
    if (!isVisible()) {
      return image;
    }
    Point ourOfs = Utils.getLocationRelativeToShell(control);
    if (obfusticatedImageGenerator == null) {
      if (skinView instanceof ObfusticateImage) {
        return ((ObfusticateImage) skinView).obfusticatedImage(image);
      }
      return image;
    }
    return obfusticatedImageGenerator.obfusticatedImage(image);
  }
 
  public void setObfusticatedImageGenerator(ObfusticateImage obfusticatedImageGenerator) {
    this.obfusticatedImageGenerator = obfusticatedImageGenerator;
  }

  /**
   * @param debug the debug to set
   */
  public void setDebug(boolean debug) {
    this.debug = debug;
  }

  /**
   * @return the debug
   */
  public boolean isDebug() {
    return debug;
  }
 
  // @see com.aelitis.azureus.ui.swt.skin.SWTSkinObject#relayout()
  public void relayout() {
    if (!disposed) {
      Utils.execSWTThread(new AERunnable() {
        public void runSupport() {
          if (control.isDisposed()) {
            return;
          }
          control.getShell().layout(new Control[] {
            control
          });
        }
      });
    }
  }
 
  public void layoutComplete() {
    if (!layoutComplete) {
      layoutComplete = true;
      if (control != null && !control.isDisposed()) {
        control.setVisible(firstVisibility);
      }
    }
  }
 
  class GradientInfo {
    public Color color;
    public double startPoint;

    public GradientInfo(Color c, double d) {
      color = c;
      startPoint = d;
    }
  }
 
  private Color getColor_SuffixWalkback(String id) {
    int max = suffixes == null ? 0 : suffixes.length;
    while (max >= 0) {
      String suffix = "";
      for (int i = 0; i < max; i++) {
        if (suffixes[i] != null) {
          suffix += suffixes[i];
        }
      }
      Color color = properties.getColor(id + suffix);
      if (color != null) {
        return color;
      }
      max--;
    }
    return null;
  }

}
TOP

Related Classes of com.aelitis.azureus.ui.swt.skin.SWTSkinObjectBasic$GradientInfo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.