/*
 * Copyright (c) 2009-2010 jMonkeyEngine All rights reserved. <p/>
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 *  * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer. <p/> * Redistributions
 * in binary form must reproduce the above copyright notice, this list of
 * conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution. <p/> * Neither the name of
 * 'jMonkeyEngine' nor the names of its contributors may be used to endorse or
 * promote products derived from this software without specific prior written
 * permission. <p/> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.jme3.gde.scenecomposer;

import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.controller.AbstractCameraController;
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
import com.jme3.input.KeyInput;
import com.jme3.input.event.KeyInputEvent;
import com.jme3.math.Vector2f;
import com.jme3.renderer.Camera;

/**
 *
 * @author normenhansen
 */
public class ComposerCameraController extends AbstractCameraController {

    private SceneComposerToolController toolController;
    private boolean forceCameraControls = false; // when user holds shift, this is true

    public ComposerCameraController(Camera cam, JmeNode rootNode) {
        super(cam, SceneApplication.getApplication().getInputManager());
    }

    private boolean isEditButtonEnabled() {
        return toolController.isEditToolEnabled();
    }

    public void setToolController(SceneComposerToolController toolController) {
        this.toolController = toolController;
    }

    public boolean isToolUsesCameraControls() {
        return !toolController.isOverrideCameraControl();
    }

    public Camera getCamera() {
        return cam;
    }

    @Override
    public void onKeyEvent(KeyInputEvent kie) {
        //don't forget the super call
        super.onKeyEvent(kie);
        if (kie.isPressed()) {
            if (KeyInput.KEY_LSHIFT == kie.getKeyCode()) {
                forceCameraControls = true;
            }
        } else if (kie.isReleased()) {
            if (KeyInput.KEY_LSHIFT == kie.getKeyCode()) {
                forceCameraControls = false;
            }
        }
        toolController.doKeyPressed(kie);
    }

    @Override
    public void checkClick(int button, boolean pressed) {
        if (button == 0) {
            if (isEditButtonEnabled() && !forceCameraControls) {
                toolController.doEditToolActivatedPrimary(new Vector2f(mouseX, mouseY), pressed, cam);
            }
        }
        if (button == 1) {
            if (isEditButtonEnabled() && !forceCameraControls) {
                toolController.doEditToolActivatedSecondary(new Vector2f(mouseX, mouseY), pressed, cam);
            }
        }


    }

    @Override
    protected void checkDragged(int button, boolean pressed) {
        if (button == 0) {
            toolController.doEditToolDraggedPrimary(new Vector2f(mouseX, mouseY), pressed, cam);
        } else if (button == 1) {
            toolController.doEditToolDraggedSecondary(new Vector2f(mouseX, mouseY), pressed, cam);
        }
    }

    @Override
    protected void checkMoved() {
        toolController.doEditToolMoved(new Vector2f(mouseX, mouseY), cam);
    }

    @Override
    public boolean useCameraControls() {
        return isToolUsesCameraControls() || forceCameraControls;
    }

}

@@ -3302,84 +3302,151 @@
 if (
-button == 0) %7B%0A            if (isEditButtonEnabled() && !forceCameraControls
+!forceCameraControls %7C%7C !pressed) %7B // dont call toolController while forceCam but on button release (for UndoRedo)%0A            if (button == 0
 ) %7B%0A
@@ -3558,38 +3558,32 @@
           %7D%0A    
-    %7D%0A
         if (butt
@@ -3597,73 +3597,8 @@
 ) %7B%0A
-            if (isEditButtonEnabled() && !forceCameraControls) %7B%0A
     
@@ -3722,18 +3722,16 @@
       %7D%0A
-%0A%0A
     %7D%0A%0A 
@@ -3798,32 +3798,84 @@
 lean pressed) %7B%0A
+        if (!forceCameraControls %7C%7C !pressed) %7B%0A    
         if (butt
@@ -3877,32 +3877,36 @@
 (button == 0) %7B%0A
+    
             tool
@@ -3986,32 +3986,36 @@
 , cam);%0A        
+   
+ 
 %7D else if (butto
@@ -4016,32 +4016,36 @@
 (button == 1) %7B%0A
+    
             tool
@@ -4119,32 +4119,46 @@
  pressed, cam);%0A
+            %7D%0A
         %7D%0A    %7D%0A

Fix issue #255 - scenecomposer : forcedCamera - Now you can't use scenecomposer tool while overiding the camera control - Fixed a tool modificaton not undo/redo able.