Package org.mt4j.components.visibleComponents.widgets

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

/***********************************************************************
* mt4j Copyright (c) 2008 - 2009 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 javax.media.opengl.GL;

import org.mt4j.components.clipping.Clip;
import org.mt4j.components.visibleComponents.AbstractVisibleComponent;
import org.mt4j.components.visibleComponents.shapes.AbstractShape;
import org.mt4j.components.visibleComponents.shapes.MTRectangle;
import org.mt4j.components.visibleComponents.shapes.MTRoundRectangle;
import org.mt4j.input.inputProcessors.IGestureEventListener;
import org.mt4j.input.inputProcessors.MTGestureEvent;
import org.mt4j.input.inputProcessors.componentProcessors.scaleProcessor.ScaleEvent;
import org.mt4j.input.inputProcessors.componentProcessors.scaleProcessor.ScaleProcessor;
import org.mt4j.util.MT4jSettings;
import org.mt4j.util.MTColor;
import org.mt4j.util.math.Matrix;
import org.mt4j.util.math.Vector3D;
import org.mt4j.util.math.Vertex;

import processing.core.PApplet;
import processing.core.PGraphics;
import processing.opengl.PGraphicsOpenGL;

/**
* The Class MTWindow. A round rectangle class that clips its
* children to the bounds of this window. If it is resized with the scaling
* gesture, the window content isnt scaled.
*
* @author Christopher Ruff
*/
public class MTWindow extends MTRoundRectangle {
 
  /** The clip. */
  private Clip clip;
 
  /** The draw inner border. */
  private boolean drawInnerBorder;
 
  /** The saved no stroke setting. */
  private boolean savedNoStrokeSetting;
 
 
  //TODO in abstractviscomp code von hier nehmen, clipshape bounds dr�ber zeichnen?
  //TODO add titlebar, maximize, close buttons
  //TODO scale border so its width doesent change..
 

  /**
   * Instantiates a new mT window.
   *
   * @param x the x
   * @param y the y
   * @param z the z
   * @param width the width
   * @param height the height
   * @param arcWidth the arc width
   * @param arcHeight the arc height
   * @param applet the applet
   */
  public MTWindow(float x, float y, float z, float width, float height,
      float arcWidth, float arcHeight, PApplet applet) {
    super(x, y, z, width, height, arcWidth, arcHeight, applet);

    this.setName("unnamed MTWindow");
   
    if (!MT4jSettings.getInstance().isOpenGlMode()){
      System.err.println("MTWindow isnt fully supported if not using OpenGL renderer!");
      return;
    }
   
    //Create inner children clip shape
    float border = 10;
    GL gl = ((PGraphicsOpenGL)applet.g).gl;
//    MTRoundRectangle clipRect =  new MTRoundRectangle(x+border, y+border, z, width-(2*border), height-(2*border), arcWidth, arcHeight, applet);
    MTRectangle clipRect =  new MTRectangle(x+border, y+border, z, width-(2*border), height-(2*border), applet);
    clipRect.setDrawSmooth(true);
    clipRect.setNoStroke(true);
    clipRect.setBoundsBehaviour(MTRectangle.BOUNDS_ONLY_CHECK);
    this.clip = new Clip(gl, clipRect);
    this.setChildClip(this.clip);
    this.drawInnerBorder = true;
   
    //Add window background
    final MTRectangle windowBackGround = new MTRectangle(x, y, z, 100, 200, applet);
    windowBackGround.setFillColor(new MTColor(200,200,200,255));
    windowBackGround.setNoStroke(true);
    windowBackGround.setPickable(false);
    this.addChild(windowBackGround);
   
    this.removeAllGestureEventListeners(ScaleProcessor.class);
//    cr.removeAllGestureEventListeners(RotationDetector.class);
    this.addGestureListener(ScaleProcessor.class, new IGestureEventListener(){
      //@Override
      public boolean processGestureEvent(MTGestureEvent ge) {
        ScaleEvent se = (ScaleEvent)ge;
       
        //Scale window background normally
        windowBackGround.scaleGlobal(se.getScaleFactorX(), se.getScaleFactorY(), se.getScaleFactorZ(), se.getScalingPoint());
       
        //Scale vertices of the window
        AbstractShape target = (AbstractShape)ge.getTargetComponent();
        Vertex[] verts = target.getGeometryInfo().getVertices();
        Vector3D newScalingPoint = target.globalToLocal(se.getScalingPoint());
        Matrix m = Matrix.getScalingMatrix(newScalingPoint, se.getScaleFactorX(), se.getScaleFactorY(), se.getScaleFactorZ());
        Vertex.transFormArray(m, verts);
        target.setVertices(verts);

        //Scale vertices of the clip shape
        AbstractShape clip = (AbstractShape)target.getChildClip().getClipShape();
        Vertex[] clipVerts = clip.getGeometryInfo().getVertices();
        Vertex.transFormArray(m, clipVerts);
        clip.setVertices(clipVerts);
        return false;
      }
    });
//    */
   
    //Draw this component and its children above
    //everything previously drawn and avoid z-fighting //FIXME but we cant use 3D stuff in there then..
    this.setDepthBufferDisabled(true);
  }

  /* (non-Javadoc)
   * @see org.mt4j.components.visibleComponents.AbstractVisibleComponent#preDraw(processing.core.PGraphics)
   */
  @Override
  public void preDraw(PGraphics graphics) {
    this.savedNoStrokeSetting = this.isNoStroke();
    super.preDraw(graphics);
  }
 

  /* (non-Javadoc)
   * @see org.mt4j.components.visibleComponents.AbstractVisibleComponent#postDrawChildren(processing.core.PGraphics)
   */
  @Override
  public void postDrawChildren(PGraphics g) {
    this.clip.disableClip(g);
   
    //Draw clipshape outline over all children to get an
    //antialiased border
    AbstractVisibleComponent clipShape = this.getChildClip().getClipShape();
//    if (!clipShape.isNoStroke()){
    if (this.drawInnerBorder){
      clipShape.setNoFill(true);
      clipShape.setNoStroke(false);
        clipShape.drawComponent(g);
      clipShape.setNoStroke(true);
      clipShape.setNoFill(false);
    }
   
    if (!savedNoStrokeSetting){
      boolean noFillSetting = this.isNoFill();
      this.setNoFill(true);
      this.setNoStroke(false);
      this.drawComponent(g);
      this.setNoFill(noFillSetting);
      this.setNoStroke(savedNoStrokeSetting);
    }
   
    this.setChildClip(null);
    super.postDrawChildren(g);
    this.setChildClip(clip);
  }



//  @Override
//  public void setStrokeColor(float r, float g, float b, float a) {
//    super.setStrokeColor(r, g, b, a);
//    this.clip.getClipShape().setStrokeColor(r, g, b, a);
//  }
 
  /* (non-Javadoc)
* @see org.mt4j.components.visibleComponents.shapes.AbstractShape#setStrokeColor(org.mt4j.util.MTColor)
*/
@Override
  public void setStrokeColor(MTColor strokeColor) {
    super.setStrokeColor(strokeColor);
    this.clip.getClipShape().setStrokeColor(strokeColor); //FIXME wtf? not needed!?
  }

 

}
TOP

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

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.