SashDND.java :  » Scripting » java2script » org » eclipse » swt » internal » dnd » Java Open Source

Java Open Source » Scripting » java2script 
java2script » org » eclipse » swt » internal » dnd » SashDND.java
/*******************************************************************************
 * Copyright (c) 2007 java2script.org and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Zhou Renjian - initial API and implementation
 *******************************************************************************/

package org.eclipse.swt.internal.dnd;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.internal.browser.OS;
import org.eclipse.swt.internal.xhtml.CSSStyle;
import org.eclipse.swt.internal.xhtml.Clazz;
import org.eclipse.swt.internal.xhtml.Element;
import org.eclipse.swt.internal.xhtml.document;
import org.eclipse.swt.internal.xhtml.window;

/**
 * @author zhou renjian
 *
 * 2006-3-15
 */
public class SashDND implements DragListener {
  protected int sourceX = 0;
  protected int sourceY = 0;
  protected Element thumb;
  protected boolean isHorizontal;
  private Element overFrameHandle;
  Object hSelectStart;
  
  public boolean dragBegan(DragEvent e) {
    thumb = document.createElement ("DIV");
    String cssName = e.sourceElement.className;
    thumb.className = cssName;
    if (cssName != null && cssName.indexOf ("sash-mouse-down") == -1)  {
      thumb.className += " sash-mouse-down";
    }
    if (cssName.indexOf ("horizontal") != -1) {
      isHorizontal = true;
    } else {
      isHorizontal = false;
    }
    thumb.style.left = e.sourceElement.style.left;
    thumb.style.top = e.sourceElement.style.top;
    thumb.style.width = e.sourceElement.style.width;
    thumb.style.height = e.sourceElement.style.height;
    if (hSelectStart == null) {
      hSelectStart = DNDUtils.onselectstart;
      Clazz.addEvent(thumb, "selectstart", hSelectStart);
    }
    if (e.sourceElement.nextSibling != null) {
      e.sourceElement.parentNode.insertBefore (thumb, 
          e.sourceElement.nextSibling);
    } else {
      e.sourceElement.parentNode.appendChild (thumb);
    }
    CSSStyle style = e.sourceElement.style;
    
    this.sourceX = style.left.length() > 0 ? Integer.parseInt (style.left) : 0;
    this.sourceY = style.top.length() > 0 ? Integer.parseInt (style.top) : 0;
    /* first time, set start location to current location */
    e.startX = e.currentX;
    e.startY = e.currentY;
    Element[] frames = document.getElementsByTagName("IFRAME");
    boolean needOverIFrameLayer = false;
    for (int i = 0; i < frames.length; i++) {
      if (frames[i].style.display != "none") {
        needOverIFrameLayer = true;
        break;
      }
    }
    if (needOverIFrameLayer) {
      overFrameHandle = document.createElement ("DIV");
      overFrameHandle.className = "over-iframe-layer";
      overFrameHandle.style.zIndex = window.currentTopZIndex;
      document.body.appendChild(overFrameHandle);
    }
    return true;
  }

  public boolean dragCanceled(DragEvent e) {
    clean();
    return true;
  }

  public boolean dragEnded(DragEvent e) {
    clean();
    return true;
  }

  protected void clean() {
    thumb.style.display = "none";
    document.body.style.cursor = "auto";
    if (hSelectStart != null) {
      Clazz.removeEvent(thumb, "selectstart", hSelectStart);
      hSelectStart = null;
    }
    //thumb.parentNode.removeChild(thumb);
    OS.destroyHandle(thumb);
    if (overFrameHandle != null) {
      //document.body.removeChild(overFrameHandle);
      OS.destroyHandle(overFrameHandle);
      overFrameHandle = null;
    }
  }

  protected Point currentLocation(DragEvent e) {
    int xx = this.sourceX + e.deltaX ();
    int yy = this.sourceY + e.deltaY ();
    int gHeight = 0;
    CSSStyle parentStyle = e.sourceElement.parentNode.style;
    if(parentStyle.height.length() > 0){
      gHeight = Integer.parseInt(parentStyle.height);
    }
    int gWidth = 0;
    if(parentStyle.width.length() > 0){      
      gWidth = Integer.parseInt(parentStyle.width);
    }
    /*
     * On mozilla, the mousemove event can contain mousemove
     * outside the browser window, so make bound for the dragging.
     */
    CSSStyle style = e.sourceElement.style;
    
    int dWidth = style.width.length() > 0 ? Integer.parseInt(style.width) : 0;
    int dHeight = style.height.length() > 0 ? Integer.parseInt(style.height) : 0;
    if (xx < 0) {
      xx = 0;
    } else if (xx > gWidth - dWidth - 2) {
      xx = gWidth - dWidth - 2;
    }
    if (yy < 0) {
      yy = 0;
    } else if (yy > gHeight - dHeight - 2) {
      yy = gHeight - dHeight - 2;
    }
    return new Point(xx, yy);
  }
  
  public boolean dragging(DragEvent e) {
    if (isHorizontal) {
      document.body.style.cursor = "e-resize";
      thumb.style.cursor = "e-resize";
    } else {
      document.body.style.cursor = "s-resize";
      thumb.style.cursor = "s-resize";
    }

    if (isHorizontal) {
      thumb.style.left = currentLocation(e).x + "px";
    } else {
      thumb.style.top = currentLocation(e).y + "px";
    }
    return true;
  }

  public boolean isDraggable(HTMLEventWrapper e) {
    return true;
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.