diff native/Falcon/CollectionsManager.h @ 5:d66dd5880081

Added support for Falcon Haptic device and Tablet/Mouse as haptic device
author Fiore Martin <fiore@eecs.qmul.ac.uk>
date Tue, 10 Jul 2012 22:39:37 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/native/Falcon/CollectionsManager.h	Tue Jul 10 22:39:37 2012 +0100
@@ -0,0 +1,156 @@
+/*  
+ CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool
+  
+ Copyright (C) 2011  Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/)
+
+ 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/>.
+*/ 
+
+#pragma once
+#include <jni.h>
+#include <new>
+#include <H3DUtil/Vec3d.h>
+
+#include "utils.h"
+
+
+/* this class uses the java haptic object lists to provide nodes *
+ * and edges to draw to the graphic and haptic managers          */
+class CollectionsManager {
+public:
+	struct NodeData {
+		jdouble x;
+		jdouble y;
+		jint hapticId;
+		jint diagramId;
+
+		NodeData(){}
+	private :
+		NodeData(const NodeData& n){/* avoid mistakenly copy construction calls */}
+	};
+
+	struct EdgeData{
+		jdouble *x;
+		jdouble *y;
+		bool **adjMatrix;
+		jint hapticId;
+		jint diagramId;
+		jint stipplePattern;
+		jsize nodeStart;
+		jdouble attractPoint[2];
+		void setSize(unsigned int s){
+			size = s;
+			if(s > previousSize){
+				/* delete the old memory */
+				delete [] x;
+				delete [] y;
+				for(unsigned int i=0; i<previousSize; i++)
+					delete[] adjMatrix[i];
+				delete [] adjMatrix;
+				/* allocates a bigger one */
+				try{
+					x = new jdouble[size];
+					y = new jdouble[size];
+					adjMatrix = new  bool* [size];
+					for(unsigned int i=0; i<size; i++){
+						adjMatrix[i] = new bool[size];
+						for(unsigned int j=0; j<size; j++)
+							adjMatrix[i][j] = false;
+					}
+				}catch(std::bad_alloc){
+					stopExecution("Could not allocate memory for the program.\nAborting...");
+				}
+				previousSize = size;
+			}
+		}
+
+		unsigned int getSize() const {
+			return size;
+		}
+
+		EdgeData(unsigned int s) : size(s), previousSize(s){
+			x = new jdouble[size];
+			y = new jdouble[size];
+			adjMatrix = new  bool* [size];
+			for(unsigned int i=0; i<size; i++){
+				adjMatrix[i] = new bool[size];
+				for(unsigned int j=0; j<size; j++)
+					adjMatrix[i][j] = false;
+			}
+		}
+		~EdgeData(){
+			delete [] x;
+			delete [] y;
+			for(unsigned int i=0; i<size; i++)
+				delete[] adjMatrix[i];
+			delete [] adjMatrix;
+		}
+	private :
+		unsigned int size;
+		unsigned int previousSize;
+		EdgeData(const EdgeData& e){ /* avoid mistakenly copy construction */}
+
+	};
+private:
+	JNIEnv *env;
+	jobject *haptics;
+
+	jclass hapticClass;
+	jclass hapticNodeClass;
+	jclass hapticEdgeClass;
+	jclass listClass;
+	jclass bitsetClass;
+	jobject nodeList;
+	jobject edgeList;
+	jmethodID getMethodId;
+	jmethodID sizeMethodId;
+	jmethodID getBitMethodId;
+	jfieldID xFieldId;
+	jfieldID yFieldId;
+	jfieldID nodeHapticIdFieldId;
+	jfieldID edgeHapticIdFieldId;
+	jfieldID nodeDiagramIdFieldId;
+	jfieldID edgeDiagramIdFieldId;
+	jfieldID nodeListfieldId;
+	jfieldID stipplePatternfieldId;
+	jfieldID edgeListfieldId;
+	jfieldID edgeSizefieldId;
+	jfieldID edgeXsFieldId;
+	jfieldID edgeYsFieldId;
+	jfieldID edgeAdjMatrixFieldId;
+	jfieldID attractPointXFieldId;
+	jfieldID attractPointYFieldId;
+	jfieldID edgeNodeStartFieldId;
+
+	
+	int screenHeight;
+	int screenWidth;
+	NodeData nd;
+	EdgeData ed;
+	
+	void fillupNodeData(struct NodeData & nd, jobject & currentNode);
+	void fillupEdgeData(struct EdgeData & ed, jobject & currentEdge);
+public:
+	CollectionsManager(JNIEnv *environment, jobject *obj) : env(environment), haptics(obj), ed(2){}
+	virtual ~CollectionsManager(void){}
+	const jint getNodesNum();
+	const jint getEdgesNum();
+	struct NodeData & getNodeData(const int i);
+	struct EdgeData & getEdgeData(const int i);
+	inline int getScreenHeight() const { return screenHeight;}
+	inline void setScreenHeight(const int sh) { screenHeight = sh; }
+	inline int getScreenWidth() const { return screenWidth;}
+	inline void setScreenWidth(const int sw) { screenWidth = sw; }
+	void init(void);
+};