--- /dev/null
+package com.pentila.evalcomp.client.widget;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.smartgwt.client.widgets.Window;
+import com.smartgwt.client.widgets.events.DragRepositionStopEvent;
+import com.smartgwt.client.widgets.events.DragRepositionStopHandler;
+import com.smartgwt.client.widgets.events.MovedEvent;
+import com.smartgwt.client.widgets.events.MovedHandler;
+import com.smartgwt.client.widgets.events.ResizedEvent;
+import com.smartgwt.client.widgets.events.ResizedHandler;
+
+public class SmartWindow extends Window{
+
+ private SmartWindow self = this;
+ private Integer initWidth, initHeigth;
+ private Boolean ignoreMove = false;
+ private Boolean leftManipulation = false;
+ private Boolean rightManipulation = false;
+ private Boolean bottomManipulation = false;
+ private Boolean topManipulation = false;
+
+ public SmartWindow(){
+ super();
+ initialize();
+ }
+
+ public SmartWindow(JavaScriptObject jsObj){
+ super(jsObj);
+ initialize();
+ }
+
+ private Integer getRightDistance(){
+ return com.google.gwt.user.client.Window.getClientWidth() - getRight();
+ }
+
+ private void setRightDistance(Integer i){
+ setRight(com.google.gwt.user.client.Window.getClientWidth() - i);
+ }
+
+ private Integer getBottomDistance(){
+ return com.google.gwt.user.client.Window.getClientHeight() - getBottom();
+ }
+
+ private void setBottomDistance(Integer i){
+ setBottom(com.google.gwt.user.client.Window.getClientHeight() - i);
+ }
+
+ private Boolean checkLeft(MovedEvent event){
+
+ if(initWidth == null){
+ initWidth = getWidth();
+ }
+
+ if(rightManipulation){
+ return false;
+ }
+
+ if(getLeft() < 0){ // rétrécissement
+ Integer i = getWidth()+getLeft();
+ ignoreMove = true;
+ setLeft(0);
+ setWidth(i);
+ ignoreMove = false;
+ return true;
+ }
+ else if(getWidth() < initWidth){
+
+ if(getLeft()+getWidth() > initWidth){ // reprise de la taille initiale
+ ignoreMove = true;
+ setWidth(initWidth);
+ ignoreMove = false;
+ return false;
+ }
+ else{ // agrandissement
+ ignoreMove = true;
+ setWidth(getLeft()+getWidth());
+ setLeft(0);
+ ignoreMove = false;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private Boolean checkRight(MovedEvent event){
+
+ if(initWidth == null){
+ initWidth = getWidth();
+ }
+
+ if(leftManipulation){
+ return false;
+ }
+
+ if(getRightDistance() < 0){ // rétrécissement
+ //System.out.println("getRight() < 0");
+ //System.out.println("ancienne largeur = " + getWidth());
+ Integer i = getWidth()+getRightDistance();
+ //System.out.println("nouvelle largeur = " + i);
+ ignoreMove = true;
+ setWidth(i);
+ setRightDistance(0);
+ ignoreMove = false;
+ return true;
+ }
+ else if(getWidth() < initWidth){
+
+ if(getRightDistance()+getWidth() > initWidth){ // reprise de la taille initiale
+ //System.out.println("debug 3");
+ ignoreMove = true;
+ setWidth(initWidth);
+ ignoreMove = false;
+ return false;
+ }
+ else{ // agrandissement
+ //System.out.println("debug 4");
+ ignoreMove = true;
+ setWidth(getRight()+getWidth());
+ setRightDistance(0);
+ ignoreMove = false;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private Boolean checkTop(MovedEvent event){
+
+ if(initHeigth == null){
+ initHeigth = getHeight();
+ }
+
+ if(bottomManipulation){
+ return false;
+ }
+
+ if(getTop() < 0){ // rétrécissement
+ //System.out.println("getTop() < 0");
+ //System.out.println("ancienne hauteur = " + getHeight());
+ Integer i = getHeight()+getTop();
+ //System.out.println("nouvelle hauteur = " + i);
+ ignoreMove = true;
+ setHeight(i);
+ setTop(0);
+ ignoreMove = false;
+ return true;
+ }
+ else if(getHeight() < initHeigth){
+
+ if(getTop()+getHeight() > initHeigth){ // reprise de la taille initiale
+ //System.out.println("debug 5");
+ ignoreMove = true;
+ setHeight(initHeigth);
+ ignoreMove = false;
+ return false;
+ }
+ else{ // agrandissement
+ //System.out.println("debug 6");
+ ignoreMove = true;
+ setHeight(getTop()+getHeight());
+ setTop(0);
+ ignoreMove = false;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private Boolean checkBottom(MovedEvent event){
+
+ if(initHeigth == null){
+ initHeigth = getHeight();
+ }
+
+ if(topManipulation){
+ return false;
+ }
+
+ if(getBottomDistance() < 0){ // rétrécissement
+ //System.out.println("getBottomDistance() < 0");
+ //System.out.println("ancienne hauteur = " + getHeight());
+ Integer i = getHeight()+getBottomDistance();
+ //System.out.println("nouvelle hauteur = " + i);
+ ignoreMove = true;
+ setHeight(i);
+ setBottomDistance(0);
+ ignoreMove = false;
+ return true;
+ }
+ else if(getHeight() < initHeigth){
+
+ if(getBottomDistance()+getHeight() > initHeigth){ // reprise de la taille initiale
+ //System.out.println("debug 8");
+ setHeight(initHeigth);
+ return false;
+ }
+ else{ // agrandissement
+ //System.out.println("debug 9");
+ ignoreMove = true;
+ setHeight(getBottomDistance()+getHeight());
+ setBottomDistance(0);
+ ignoreMove = false;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+
+ public void initialize(){
+
+
+ initWidth = this.getWidth();
+ initHeigth = this.getHeight();
+
+ this.addMovedHandler(new MovedHandler(){
+
+ @Override
+ public void onMoved(MovedEvent event) {
+ if(! ignoreMove){
+ //System.out.println("onMoved (" + self.getLeft() + "," + self.getTop() + ")");
+
+ leftManipulation = checkLeft(event);
+ rightManipulation = checkRight(event);
+ topManipulation = checkTop(event);
+ bottomManipulation = checkBottom(event);
+ }
+ }
+
+ });
+
+
+ this.addDragRepositionStopHandler(new DragRepositionStopHandler(){
+ @Override
+ public void onDragRepositionStop(DragRepositionStopEvent event) {
+
+
+ //System.out.println("stop (" + event.getX() + "," + event.getY() + ")");
+
+ if(event.getX() < 0){
+ //System.out.println("cancel ! (" + event.getX() + "," + event.getY() + ")");
+ event.cancel();
+ }
+
+ if(event.getY() < 0){
+ //System.out.println("cancel ! (" + event.getX() + "," + event.getY() + ")");
+ event.cancel();
+ }
+
+ if(event.getX() > com.google.gwt.user.client.Window.getClientWidth()){
+ //System.out.println("cancel ! " + event.getX() + ">" + com.google.gwt.user.client.Window.getClientWidth());
+ event.cancel();
+ }
+
+ if(event.getY() > com.google.gwt.user.client.Window.getClientHeight()){
+ //System.out.println("cancel ! " + event.getY() +">"+ com.google.gwt.user.client.Window.getClientHeight());
+ event.cancel();
+ }
+
+
+ }
+ });
+
+ this.addResizedHandler(new ResizedHandler(){
+
+ @Override
+ public void onResized(ResizedEvent event) {
+
+ if(! ignoreMove){
+ self.initHeigth = self.getHeight();
+ self.initWidth = self.getWidth();
+ }
+ }
+
+ });
+
+
+ }
+
+}