Package org.mt4j.components.visibleComponents.widgets

Source Code of org.mt4j.components.visibleComponents.widgets.MTSceneWindow

/***********************************************************************
* mt4j Copyright (c) 2008 - 2010 Christopher Ruff, Fraunhofer-Gesellschaft All rights reserved.
*   This program is free software: you can redistribute it and/or modify
*   it under the terms of the GNU General Public License as published by
*   the Free Software Foundation, either version 3 of the License, or
*   (at your option) any later version.
*
*   This program is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*   GNU General Public License for more details.
*
*   You should have received a copy of the GNU General Public License
*   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
***********************************************************************/
package org.mt4j.components.visibleComponents.widgets;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import org.mt4j.MTApplication;
import org.mt4j.components.StateChange;
import org.mt4j.components.StateChangeEvent;
import org.mt4j.components.StateChangeListener;
import org.mt4j.components.TransformSpace;
import org.mt4j.components.visibleComponents.shapes.MTRoundRectangle;
import org.mt4j.components.visibleComponents.widgets.buttons.MTImageButton;
import org.mt4j.input.inputProcessors.componentProcessors.tapProcessor.TapEvent;
import org.mt4j.sceneManagement.Iscene;
import org.mt4j.util.MT4jSettings;
import org.mt4j.util.MTColor;
import org.mt4j.util.animation.Animation;
import org.mt4j.util.animation.AnimationEvent;
import org.mt4j.util.animation.IAnimationListener;
import org.mt4j.util.animation.MultiPurposeInterpolator;
import org.mt4j.util.math.Vector3D;

import processing.core.PImage;

/**
* The Class MTSceneWindow. Can be used to run and display a scene in a window
* from within another scene.
*
* @author Christopher Ruff
*/
public class MTSceneWindow
//extends MTRectangle {
extends MTRoundRectangle {
 
  /** The scene texture. */
  private MTSceneTexture sceneTexture;
 
  /** The maximize button image. */
  private static PImage maximizeButtonImage;
 
  /** The close button image. */
  private static PImage closeButtonImage;
 
  //Destroying the sceneTexture -> destroy SceneWindow -> destroy scene
  //Destroy this -> destroy scene -> child sceneTexture.destroy()
 
 
  /**
   * Instantiates a new mT scene window.
   *
   * @param scene the scene
   * @param borderWidth the border width
   * @param borderHeight the border height
   * @param applet the applet
   */
  public MTSceneWindow(final Iscene scene, float borderWidth, float borderHeight, MTApplication applet) {
    this(scene, borderWidth, borderHeight, applet, Math.round(MT4jSettings.getInstance().getWindowWidth() * 0.6f), Math.round(MT4jSettings.getInstance().getWindowHeight() * 0.6f));
  }
 
  /**
   * Instantiates a new mT scene window.
   *
   * @param scene the scene
   * @param borderWidth the border width
   * @param borderHeight the border height
   * @param applet the applet
   * @param fboWidth the fbo width
   * @param fboHeight the fbo height
   */
  public MTSceneWindow(final Iscene scene, float borderWidth, float borderHeight, final MTApplication applet, int fboWidth, int fboHeight) {
//    super(0-borderWidth, 0-borderHeight, applet.width+2*borderWidth, applet.height+2*borderHeight, applet);
    super(0-borderWidth, 0-borderHeight, 0, MT4jSettings.getInstance().getWindowWidth()+2*borderWidth, MT4jSettings.getInstance().getWindowHeight()+2*borderHeight, 30, 30, applet);
   
    this.setStrokeColor(new MTColor(0,0,0));
   
    sceneTexture = new MTSceneTexture(applet,0, 0, fboWidth, fboHeight, scene);
    sceneTexture.setStrokeColor(new MTColor(0,0,0));
    this.addChild(sceneTexture);
   
    //Add the scene to the scene list in the Application
    //FIXME add the scene later to the MTApplication because if we add the scene
    //before any other scene is added it becomes the active scene which we dont want
    if (applet.getSceneCount() == 0){
      applet.invokeLater(new Runnable() {
        public void run() {
          applet.addScene(sceneTexture.getScene());
        }
      });
    }else{
      applet.addScene(sceneTexture.getScene())
    }
   
   
    sceneTexture.addStateChangeListener(StateChange.COMPONENT_DESTROYED, new StateChangeListener() {
      public void stateChanged(StateChangeEvent evt) {
        destroy();
      }
    });
   
   
    if (closeButtonImage == null){
      closeButtonImage = applet.loadImage(MT4jSettings.getInstance().getDefaultImagesPath() +
//      "close_32.png")
//      "126182-simple-black-square-icon-alphanumeric-circled-x3_cr.png"
//      "124241-matte-white-square-icon-alphanumeric-circled-x3_cr.png"
//      "124241-matte-white-square-icon-alphanumeric-circled-x3128.png"
        "closeButton64.png"
      );
    }
    MTImageButton closeButton = new MTImageButton(closeButtonImage, applet);
    closeButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent r) {
        switch (r.getID()) {
        case TapEvent.BUTTON_CLICKED:
          close();
//          destroy();
          break;
        default:
          break;
        }
      }
    });
    this.addChild(closeButton);
    closeButton.setNoStroke(true);
//    closeButton.setSizeXYRelativeToParent(borderWidth - borderWidth/20, borderWidth - borderWidth/20);
    closeButton.setSizeXYRelativeToParent(borderWidth - borderWidth/30, borderWidth - borderWidth/30);
//    closeButton.setSizeXYRelativeToParent(borderWidth -0.5f, borderWidth-0.5f);
    closeButton.setPositionRelativeToParent(new Vector3D( (applet.width+ (borderWidth /2f)), borderHeight - 5));
   
    if (maximizeButtonImage == null){
      maximizeButtonImage = applet.loadImage(MT4jSettings.getInstance().getDefaultImagesPath() +
//      "window_app_blank_32.png")
//      "127941-simple-black-square-icon-symbols-shapes-maximize-button_cr.png"
      "maximizeButton64.png"
      );
    }
    MTImageButton maximizeButton = new MTImageButton(maximizeButtonImage, applet);
    maximizeButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent r) {
        switch (r.getID()) {
        case TapEvent.BUTTON_CLICKED:
          maximize();
          break;
        default:
          break;
        }
      }
    });
    this.addChild(maximizeButton);
    maximizeButton.setNoStroke(true);
//    maximizeButton.setSizeXYRelativeToParent(borderWidth - borderWidth/10, borderWidth - borderWidth/10);
    maximizeButton.setSizeXYRelativeToParent(borderWidth - borderWidth/30, borderWidth - borderWidth/30);
//    maximizeButton.setPositionRelativeToParent(new Vector3D( (applet.width+2*borderWidth)-maximizeButton.getWidthXY(TransformSpace.RELATIVE_TO_PARENT), closeButton.getHeightXY(TransformSpace.RELATIVE_TO_PARENT) + 40));
//    maximizeButton.setPositionRelativeToParent(new Vector3D( (applet.width+ (borderWidth /2f)), borderHeight + closeButton.getHeightXY(TransformSpace.RELATIVE_TO_PARENT) + 15));
    maximizeButton.setPositionRelativeToParent(new Vector3D( (applet.width+ (borderWidth /2f)), applet.height - closeButton.getHeightXY(TransformSpace.RELATIVE_TO_PARENT)/2f));
   
  }
 
  public void close(){
    float width = this.getWidthXY(TransformSpace.RELATIVE_TO_PARENT);
    Animation closeAnim = new Animation("Window Fade", new MultiPurposeInterpolator(width, 1, 350, 0.2f, 0.5f, 1), this);
    closeAnim.addAnimationListener(new IAnimationListener(){
      public void processAnimationEvent(AnimationEvent ae) {
//        float delta = ae.getAnimation().getInterpolator().getCurrentStepDelta();
        switch (ae.getId()) {
        case AnimationEvent.ANIMATION_STARTED:
        case AnimationEvent.ANIMATION_UPDATED:
          float currentVal = ae.getAnimation().getInterpolator().getCurrentValue();
          setWidthXYRelativeToParent(currentVal);
          break;
        case AnimationEvent.ANIMATION_ENDED:
          setVisible(false);
          destroy();
          break
        default:
          break;
        }//switch
      }//processanimation
    });
    closeAnim.start();
  }
 
  /**
   * Gets the scene texture.
   *
   * @return the scene texture
   */
  public MTSceneTexture getSceneTexture(){
    return sceneTexture;
  }
 
  /**
   * Maximize.
   */
  public void maximize(){
    sceneTexture.maximize();
  }
 
  /**
   * Restore.
   */
  public void restore(){
    sceneTexture.restore();
  }
 
  /* (non-Javadoc)
   * @see org.mt4j.components.visibleComponents.shapes.MTPolygon#destroyComponent()
   */
  @Override
  protected void destroyComponent() {
    super.destroyComponent();
   
    //FIXME gets called twice if we destroy this component (because we listen to sceneTexture destroy())
    //-> but not tragic
   
    //Destroy the scene used for the window because we dont destroy it
    //in MTSceneTexture
    sceneTexture.getScene().destroy();
  }

}
TOP

Related Classes of org.mt4j.components.visibleComponents.widgets.MTSceneWindow

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.