/** * */ package com.aelitis.azureus.ui.swt.skin; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.core3.util.AERunnableBoolean; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.ui.swt.Utils; /** * @author TuxPaper * @created Jun 8, 2006 * */ public class SWTSkinUtils { public static final int TILE_NONE = 0; public static final int TILE_Y = 1; public static final int TILE_X = 2; public static final int TILE_CENTER_X = 4; public static final int TILE_CENTER_Y = 8; public static final int TILE_BOTH = TILE_X | TILE_Y; private static Listener imageDownListener; //private static Listener imageOverListener; static { //imageOverListener = new SWTSkinImageChanger("-over", SWT.MouseEnter, // SWT.MouseExit); imageDownListener = new SWTSkinImageChanger("-down", SWT.MouseDown, SWT.MouseUp); } public static int getAlignment(String sAlign, int def) { int align; if (sAlign == null) { align = def; } else if (sAlign.equalsIgnoreCase("center")) { align = SWT.CENTER; } else if (sAlign.equalsIgnoreCase("bottom")) { align = SWT.BOTTOM; } else if (sAlign.equalsIgnoreCase("top")) { align = SWT.TOP; } else if (sAlign.equalsIgnoreCase("left")) { align = SWT.LEFT; } else if (sAlign.equalsIgnoreCase("right")) { align = SWT.RIGHT; } else { align = def; } return align; } /** * @param tileMode * @return */ public static int getTileMode(String sTileMode) { int tileMode = TILE_NONE; if (sTileMode == null || sTileMode == "") { return tileMode; } sTileMode = sTileMode.toLowerCase(); if (sTileMode.equals("tile")) { tileMode = TILE_X | TILE_Y; } else if (sTileMode.equals("tile-x")) { tileMode = TILE_X; } else if (sTileMode.equals("tile-y")) { tileMode = TILE_Y; } else if (sTileMode.equals("center-x")) { tileMode = TILE_CENTER_X; } else if (sTileMode.equals("center-y")) { tileMode = TILE_CENTER_Y; } return tileMode; } static void addMouseImageChangeListeners(Control widget) { if (widget.getData("hasMICL") != null) { return; } //widget.addListener(SWT.MouseEnter, imageOverListener); //widget.addListener(SWT.MouseExit, imageOverListener); // new MouseEnterExitListener(widget); widget.addListener(SWT.MouseDown, imageDownListener); widget.addListener(SWT.MouseUp, imageDownListener); widget.setData("hasMICL", "1"); } public static void setVisibility(SWTSkin skin, String configID, String viewID, boolean visible) { setVisibility(skin, configID, viewID, visible, true, false); } public static void setVisibility(SWTSkin skin, String configID, String viewID, final boolean visible, boolean save, boolean fast) { SWTSkinObject skinObject = skin.getSkinObject(viewID); if (skinObject == null) { Debug.out("setVisibility on non existing skin object: " + viewID); return; } if (skinObject.isVisible() == visible && skin.getShell().isVisible()) { return; } final Control control = skinObject.getControl(); if (control != null && !control.isDisposed()) { Point size; if (visible) { final FormData fd = (FormData) control.getLayoutData(); size = (Point) control.getData("v3.oldHeight"); //System.out.println(control.getData("SkinID") + " oldHeight = " + size + ";v=" + control.getVisible() + ";s=" + control.getSize()); if (size == null) { size = control.computeSize(SWT.DEFAULT, SWT.DEFAULT); if (fd.height > 0) { size.y = fd.height; } if (fd.width > 0) { size.x = fd.width; } } } else { size = new Point(0, 0); } setVisibility(skin, configID, skinObject, size, save, fast, null); } } public static void setVisibility(SWTSkin skin, String configID, final SWTSkinObject skinObject, final Point destSize, boolean save, boolean fast, Runnable runAfterSlide) { boolean visible = destSize.x != 0 || destSize.y != 0; try { if (skinObject == null) { return; } final Control control = skinObject.getControl(); if (control != null && !control.isDisposed()) { if (visible) { FormData fd = (FormData) control.getLayoutData(); fd.width = 0; fd.height = 0; control.setData("oldSize", new Point(0, 0)); skinObject.setVisible(visible); // FormData should now be 0,0, but setVisible may have // explicitly changed it fd = (FormData) control.getLayoutData(); if (fd.width != 0 || fd.height != 0) { return; } //if (destSize != null) { if (fd.width != destSize.x || fd.height != destSize.y) { if (fast) { fd.width = destSize.x; fd.height = destSize.y; control.setLayoutData(fd); Utils.relayout(control); } else { slide(skinObject, fd, destSize, runAfterSlide); runAfterSlide = null; // prevent calling again } } /*} else { if (fd.width == 0) { fd.width = SWT.DEFAULT; } if (fd.height == 0) { fd.height = SWT.DEFAULT; } control.setLayoutData(fd); Utils.relayout(control); }*/ control.setData("v3.oldHeight", null); } else { final FormData fd = (FormData) control.getLayoutData(); if (fd != null) { Point oldSize = new Point(fd.width, fd.height); if (oldSize.y <= 0) { oldSize = null; } control.setData("v3.oldHeight", oldSize); if (fast) { skinObject.setVisible(false); } else { slide(skinObject, fd, destSize, runAfterSlide); runAfterSlide = null; // prevent calling again } } } } } finally { if (save && COConfigurationManager.getBooleanParameter(configID) != visible) { COConfigurationManager.setParameter(configID, visible); } if (runAfterSlide != null) { runAfterSlide.run(); } } } public static void slide(final SWTSkinObject skinObject, final FormData fd, final Point destSize, final Runnable runOnCompletion) { final Control control = skinObject.getControl(); //System.out.println("slide to " + size + " via "+ Debug.getCompressedStackTrace()); boolean exit = Utils.execSWTThreadWithBool("slide", new AERunnableBoolean() { public boolean runSupport() { boolean exit = control.getData("slide.active") != null; Runnable oldROC = (Runnable) control.getData("slide.runOnCompletion"); if (oldROC != null) { oldROC.run(); } control.setData("slide.destSize", destSize); control.setData("slide.runOnCompletion", runOnCompletion); if (destSize.y > 0) { skinObject.setVisible(true); } return exit; } }, 1000); if (exit) { return; } AERunnable runnable = new AERunnable() { boolean firstTime = true; float pct = 0.4f; public void runSupport() { if (control.isDisposed()) { return; } Point size = (Point) control.getData("slide.destSize"); if (size == null) { return; } if (firstTime) { firstTime = false; control.setData("slide.active", "1"); } int newWidth = (int) (fd.width + (size.x - fd.width) * pct); int h = fd.height >= 0 ? fd.height : control.getSize().y; int newHeight = (int) (h + (size.y - h) * pct); pct += 0.01; //System.out.println(control + "] newh=" + newHeight + "/" + newWidth + " to " + size.y); if (newWidth == fd.width && newHeight == h) { fd.width = size.x; fd.height = size.y; //System.out.println(control + "] side to " + size.y + " done" + size.x); control.setLayoutData(fd); Utils.relayout(control); control.getParent().layout(); control.setData("slide.active", null); control.setData("slide.destSize", null); if (newHeight == 0) { skinObject.setVisible(false); Utils.relayout(control); } Runnable oldROC = (Runnable) control.getData("slide.runOnCompletion"); if (oldROC != null) { control.setData("slide.runOnCompletion", null); oldROC.run(); } } else { fd.width = newWidth; fd.height = newHeight; control.setLayoutData(fd); //Utils.relayout(control, false); control.getParent().layout(); Utils.execSWTThreadLater(20, this); } } }; control.getDisplay().asyncExec(runnable); } public static class MouseEnterExitListener implements Listener { boolean bOver = false; public MouseEnterExitListener(Widget widget) { widget.addListener(SWT.MouseMove, this); widget.addListener(SWT.MouseExit, this); } public void handleEvent(Event event) { Control control = (Control) event.widget; SWTSkinObject skinObject = (SWTSkinObject) control.getData("SkinObject"); if (event.type == SWT.MouseMove) { if (bOver) { return; } System.out.println(System.currentTimeMillis() + ": " + skinObject + "-- OVER"); bOver = true; skinObject.switchSuffix("-over", 2, true); } else { bOver = false; System.out.println(System.currentTimeMillis() + ": " + skinObject + "-- NOOVER"); skinObject.switchSuffix("", 2, true); } } } public static SWTSkinObjectBrowser findBrowserSO(SWTSkinObject so) { if (so instanceof SWTSkinObjectBrowser) { return (SWTSkinObjectBrowser) so; } if (so instanceof SWTSkinObjectContainer) { SWTSkinObjectContainer soContainer = (SWTSkinObjectContainer) so; SWTSkinObject[] children = soContainer.getChildren(); for (int i = 0; i < children.length; i++) { SWTSkinObject child = children[i]; SWTSkinObjectBrowser found = findBrowserSO(child); if (found != null) { return found; } } } return null; } }