Mercurial > hg > ccmieditor
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); +};