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

Source Code of com.aelitis.azureus.ui.swt.skin.SWTSkinTabSet

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

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.Utils;

/**
* @author TuxPaper
* @created Jun 8, 2006
*/
public class SWTSkinTabSet
{
  private Listener tabMouseListener;

  private final SWTSkin skin;

  private final String sID;

  private SWTSkinObjectTab activeTab;

  /** List of SWTSKinObjectTab */
  private List tabs;
 
  private ArrayList listeners = new ArrayList();

  // XXX Do we need to pass in SkinProperties in case of cloning?
  public SWTSkinTabSet(SWTSkin skin, String sID) {
    this.sID = sID;
    this.skin = skin;
    tabs = new ArrayList();
  }

  public void addTab(final SWTSkinObjectTab tab) {
    tabs.add(tab);
    tab.setTabset(this);

    //System.out.println("AddTab for " + sID + ": " + tab.getSkinObjectID());
    addMouseListener(tab, tab.getControl());
   
    skin.addListener(new SWTSkinLayoutCompleteListener() {
      public void skinLayoutCompleted() {
        setTabVisible(tab, activeTab == tab, null);
      }
    });
  }

  public SWTSkinObjectTab getActiveTab() {
    return activeTab;
  }

  public SWTSkinObjectTab[] getTabs() {
    return (SWTSkinObjectTab[]) tabs.toArray(new SWTSkinObjectTab[0]);
  }

  public SWTSkinObjectTab getTabByID(String sID) {
    for (int i = 0; i < tabs.size(); i++) {
      SWTSkinObjectTab tab = (SWTSkinObjectTab) tabs.get(i);
      String sTabID = tab.getSkinObjectID();

      if (sTabID.equals(sID)) {
        return tab;
      }
    }

    return null;
  }

  public SWTSkinObjectTab getTab(String sViewID) {
    for (int i = 0; i < tabs.size(); i++) {
      SWTSkinObjectTab tab = (SWTSkinObjectTab) tabs.get(i);
      String sTabViewID = tab.getViewID();

      if (sTabViewID.equals(sViewID)) {
        return tab;
      }
    }

    return null;
  }

  /**
   *
   * @deprecated Use {@link #setActiveTab(String)}
   */
  public boolean setActiveTabByID(String sID) {
    for (int i = 0; i < tabs.size(); i++) {
      SWTSkinObject tab = (SWTSkinObject) tabs.get(i);
      if (tab instanceof SWTSkinObjectTab) {
        String sTabID = tab.getSkinObjectID();

        if (sTabID.equals(sID)) {
          setActiveTab((SWTSkinObjectTab) tab);
          return true;
        }
      }
    }

    return false;
  }

  public boolean setActiveTab(String viewID) {
    SWTSkinObject skinObject = skin.getSkinObject(viewID);

    if (skinObject == null) {
      return false;
    }
   
    return skin.activateTab(skinObject) != null;
  }

 
  public void setActiveTab(final SWTSkinObjectTab newTab) {
    setActiveTab(newTab, false);
  }

  private void setActiveTab(final SWTSkinObjectTab newTab, final boolean evenIfSame) {
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        Shell shell = skin.getShell();
        Cursor cursor = shell.getCursor();
        try {
          shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
          swtSetActiveTab(newTab, evenIfSame);
        } finally {
          shell.setCursor(cursor);
        }
      }
    });
  }

  protected void swtSetActiveTab(SWTSkinObjectTab newTab, boolean evenIfSame) {
    // Don't exit early if we are already on tab.  We want to be notified if
    // the user clicks on the tab again (for example, for page refreshing)
    if (!tabs.contains(newTab)) {
      System.err.println("Not contain in " + sID + ": " + newTab);
      return;
    }

    String sOldID = activeTab == null ? "" : activeTab.getSkinObjectID();

    if (newTab != activeTab) {
      SWTSkinObject[] objects = setTabVisible(newTab, true, null);
      if (activeTab != null) {
        setTabVisible(activeTab, false, objects);
      }

      activeTab = newTab;
    } else if (!evenIfSame) {
      return;
    }

    String sConfigID = activeTab.getConfigID();
    String sNewID = activeTab.getSkinObjectID();

    SWTSkinObject parent = skin.getSkinObject(activeTab.getProperties().getStringValue(sConfigID
        + ".activate"));
    if (parent != null) {
      parent.getControl().setFocus();
    }

    triggerChangeListener(sOldID, sNewID);
  }

  private boolean hasSkinBrowser(SWTSkinObject skinObject) {
    if (skinObject instanceof SWTSkinObjectContainer) {
      SWTSkinObject[] children = ((SWTSkinObjectContainer) skinObject).getChildren();
      for (int i = 0; i < children.length; i++) {
        SWTSkinObject object = children[i];
        if (hasSkinBrowser(object)) {
          return true;
        }
      }
    }
    return (skinObject instanceof SWTSkinObjectBrowser);
  }

  /**
   * @param oldID
   * @param newID
   */
  private void triggerChangeListener(String oldID, String newID) {
    for (Iterator iter = listeners.iterator(); iter.hasNext();) {
      try {
        SWTSkinTabSetListener l = (SWTSkinTabSetListener) iter.next();
        l.tabChanged(this, oldID, newID);
      } catch (Exception e) {
        Debug.printStackTrace(e);
      }
    }
  }

  private void addMouseListener(SWTSkinObject tab, Control control) {
    if (tabMouseListener == null) {
      tabMouseListener = new Listener() {
        boolean bDownPressed = false;

        public void handleEvent(Event event) {
          if (event.type == SWT.MouseDown) {
            bDownPressed = true;
            return;
          } else if (!bDownPressed) {
            return;
          }

          bDownPressed = false;

          Control control = (Control) event.widget;
          setActiveTab((SWTSkinObjectTab) control.getData("Tab"), true);
        }
      };
    }

    control.setData("Tab", tab);
    control.addListener(SWT.MouseUp, tabMouseListener);
    control.addListener(SWT.MouseDown, tabMouseListener);

    if (control instanceof Composite) {
      Control[] children = ((Composite) control).getChildren();
      for (int i = 0; i < children.length; i++) {
        addMouseListener(tab, children[i]);
      }
    }
  }

  private SWTSkinObject[] setTabVisible(SWTSkinObjectTab tab, boolean visible,
      SWTSkinObject[] skipObjects) {
    String sSkinID = tab.getSkinObjectID();
   
    SWTSkinObject soTabContent = skin.getSkinObjectByID(sSkinID);
    if (soTabContent == null) {
      return null;
    }

    String suffix = visible ? "-selected" : "";

    soTabContent.switchSuffix(suffix, 1, true);

    SWTSkinObject[] activeWidgets = tab.getActiveWidgets(visible);

    for (int i = 0; i < activeWidgets.length; i++) {
      SWTSkinObject skinObject = activeWidgets[i];
      boolean ok = true;
      if (skipObjects != null) {
        for (int j = 0; j < skipObjects.length; j++) {
          if (skinObject.equals(skipObjects[j])) {
            ok = false;
            break;
          }
        }
      }

      if (ok) {
        if (visible) {
          skinObject.setDefaultVisibility();
        } else {
          skinObject.setVisible(visible);
        }
        //System.out.println(((visible ? "show" : "hide") + " " + skinObject) + Debug.getCompressedStackTrace());
      }
    }
    tab.triggerListeners(SWTSkinObjectListener.EVENT_SELECT);

    return activeWidgets;
  }

  public void addListener(SWTSkinTabSetListener listener) {
    listeners.add(listener);
  }

  public String getID() {
    return sID;
  }

  protected static String[] getTemplateInfo(SWTSkin skin,
      SWTSkinObject skinObject, String sTemplateKey) {
    SWTSkinProperties skinProperties = skin.getSkinProperties();
    String sID = skinObject.getConfigID() + ".view.template." + sTemplateKey;
    return skinProperties.getStringArray(sID);
  }

  protected static String getTemplateID(SWTSkin skin, SWTSkinObject skinObject,
      String sTemplateKey) {
    String[] templateInfo = getTemplateInfo(skin, skinObject, sTemplateKey);
    if (templateInfo != null) {
      return templateInfo[0];
    }
    return null;
  }

  public static String getTabSetID(SWTSkin skin, SWTSkinObject skinObject,
      String sTemplateKey) {
    String[] templateInfo = getTemplateInfo(skin, skinObject, sTemplateKey);
    if (templateInfo != null && templateInfo.length > 1) {
      return templateInfo[1];
    }
    return null;
  }
}
TOP

Related Classes of com.aelitis.azureus.ui.swt.skin.SWTSkinTabSet

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.