/** * Builds the display list for a given display list index. * * @param gl Instance of GL2. * @param iGLDisplayListIndex Index of the display list. */ private void buildDisplayList(final GL2 gl, int iGLDisplayListIndex) { if (pdRealRootElement != null && pdCurrentRootElement != null) { gl.glNewList(iGLDisplayListIndex, GL2.GL_COMPILE); float fXCenter = viewFrustum.getWidth() / 2; float fYCenter = viewFrustum.getHeight() / 2; gl.glLoadIdentity(); upwardNavigationSlider.draw( gl, pickingManager, textureManager, uniqueID, iUpwardNavigationSliderID, iUpwardNavigationSliderButtonID, iUpwardNavigationSliderBodyID); float fCurrentSliderWidth = upwardNavigationSlider.getScaledWidth(gl); float fCurrentSliderHeight = upwardNavigationSlider.getScaledHeight(gl); controlBox.setRectangle( 0, 0, fCurrentSliderWidth * 2, fCurrentSliderHeight + fCurrentSliderWidth); LabelManager.get().setControlBox(controlBox); drawingController.draw(fXCenter, fYCenter, gl, new GLU()); gl.glEndList(); } else { renderSymbol(gl, EIconTextures.RADIAL_SYMBOL.getFileName(), 0.5f); } }
@Override public void display(GL2 gl) { if (isDisplayListDirty && !bIsAnimationActive) { buildDisplayList(gl, displayListIndex); isDisplayListDirty = false; } if (pdRealRootElement != null && pdCurrentRootElement != null) { if (upwardNavigationSlider.handleDragging(gl, glMouseListener, pixelGLConverter)) { updateHierarchyAccordingToNavigationSlider(); } // clipToFrustum(gl); // if (bIsAnimationActive) { float fXCenter = viewFrustum.getWidth() / 2; float fYCenter = viewFrustum.getHeight() / 2; gl.glLoadIdentity(); upwardNavigationSlider.draw( gl, pickingManager, textureManager, uniqueID, iUpwardNavigationSliderID, iUpwardNavigationSliderButtonID, iUpwardNavigationSliderBodyID); float fCurrentSliderWidth = upwardNavigationSlider.getScaledWidth(gl); float fCurrentSliderHeight = upwardNavigationSlider.getScaledHeight(gl); controlBox.setRectangle( 0, 0, fCurrentSliderWidth * 2, fCurrentSliderHeight + fCurrentSliderWidth); LabelManager.get().setControlBox(controlBox); drawingController.draw(fXCenter, fYCenter, gl, new GLU()); } else gl.glCallList(displayListIndex); } else { renderSymbol(gl, EIconTextures.RADIAL_SYMBOL.getFileName(), 0.5f); } if (!lazyMode) checkForHits(gl); }
/** * Initializes a new hierarchy of partial discs according to a tree of cluster nodes and other * parameters. * * @param <E> Concrete Type of IHierarchyData * @param tree Tree of hierarchy data objects which is used to build the partial disc tree. * @param idType IDType of the hierarchy data objects. * @param dataEventManager Concrete DataEventManager that is responsible for handling and * triggering data specific events. * @param alColorModes List of drawing strategies that shall be used as color modes. */ public <E extends AHierarchyElement<E>> void initHierarchy( Tree<E> tree, E heRoot, ADataEventManager dataEventManager, ArrayList<EPDDrawingStrategyType> alColorModes) { hashPartialDiscs.clear(); selectionManager = new SelectionManager(tree.getNodeIDType()); partialDiscTree = new Tree<PartialDisc>(); navigationHistory.reset(); drawingController.setDrawingState(EDrawingStateType.DRAWING_STATE_FULL_HIERARCHY); LabelManager.get().clearLabels(); drawingStrategyManager.init(pickingManager, uniqueID, alColorModes); PartialDisc pdRoot = new PartialDisc( partialDiscTree, heRoot, drawingStrategyManager.getDefaultDrawingStrategy()); partialDiscTree.setRootNode(pdRoot); partialDiscTree.setLeafIDType(tree.getLeaveIDType()); partialDiscTree.setNodeIDType(tree.getNodeIDType()); hashPartialDiscs.put(heRoot.getID(), pdRoot); // selectionManager.initialAdd(heRoot.getID()); buildTree(tree, heRoot, pdRoot); pdRoot.calculateLargestChildren(); iMaxDisplayedHierarchyDepth = DISP_HIER_DEPTH_DEFAULT; this.dataEventManager = dataEventManager; this.dataEventManager.registerEventListeners(); pdCurrentRootElement = pdRoot; pdCurrentSelectedElement = pdRoot; pdRealRootElement = pdRoot; navigationHistory.addNewHistoryEntry( drawingController.getCurrentDrawingState(), pdCurrentRootElement, pdCurrentSelectedElement, iMaxDisplayedHierarchyDepth); selectionManager.addToType(SelectionType.SELECTION, pdCurrentRootElement.getElementID()); controlBox = new Rectangle(0, 0, 0.3f, 0.2f); upwardNavigationSlider = new OneWaySlider( new Vec2f(controlBox.getMinX() + 0.1f, controlBox.getMinY() + 0.1f), 0.2f, 1f, pdRealRootElement.getHierarchyLevel(), 1, 0, pdRealRootElement.getDepth() - 1); upwardNavigationSlider.setMinSize(80); }
/** * Updates the current root element according to the position of the upward navigation silder, * i.e. a parent of the current root element with the hierarchy level of the slider position will * be the new root element. */ private void updateHierarchyAccordingToNavigationSlider() { PartialDisc pdNewRootElement = pdCurrentRootElement.getParentWithLevel(upwardNavigationSlider.getSelectedValue()); if (pdNewRootElement != null) { pdCurrentRootElement = pdNewRootElement; bIsNewSelection = true; PartialDisc pdSelectedElement = drawingController.getCurrentDrawingState().getSelectedElement(); if (pdSelectedElement != null) { pdCurrentSelectedElement = pdSelectedElement; pdSelectedElement.setCurrentStartAngle(0); } navigationHistory.addNewHistoryEntry( drawingController.getCurrentDrawingState(), pdCurrentRootElement, pdCurrentSelectedElement, iMaxDisplayedHierarchyDepth); setDisplayListDirty(); setNewSelection(SelectionType.SELECTION, pdCurrentSelectedElement); } }
/** * Sets an element that will be displayed as root element. * * @param pdCurrentRootElement New element that will be displayed as root element. */ public void setCurrentRootElement(PartialDisc pdCurrentRootElement) { this.pdCurrentRootElement = pdCurrentRootElement; upwardNavigationSlider.setSelectedValue(pdCurrentRootElement.getHierarchyLevel()); }
@Override protected void handlePickingEvents( PickingType pickingType, PickingMode pickingMode, int externalID, Pick pick) { if (detailLevel == EDetailLevel.VERY_LOW) { return; } switch (pickingType) { case RAD_HIERARCHY_PDISC_SELECTION: PartialDisc pdPickedElement = hashPartialDiscs.get(externalID); switch (pickingMode) { case CLICKED: if (pdPickedElement != null) drawingController.handleSelection(pdPickedElement); break; case MOUSE_OVER: if (pdPickedElement != null) drawingController.handleMouseOver(pdPickedElement); break; case RIGHT_CLICKED: if (pdPickedElement != null) { // Prevent handling of non genetic data in context // menu if (!dataDomain.getDataDomainID().equals("org.caleydo.datadomain.genetic")) break; if (!pdPickedElement.hasChildren()) { AContextMenuItem menuItem = new BookmarkMenuItem( "Bookmark " + dataDomain.getRecordLabel(dataDomain.getRecordIDType(), externalID), dataDomain.getRecordIDType(), externalID); getContextMenuCreator().addContextMenuItem(menuItem); } else { AContextMenuItem menuItem = new DetailOutsideItem(externalID); getContextMenuCreator().addContextMenuItem(menuItem); } break; } drawingController.handleAlternativeSelection(pdPickedElement); break; default: return; } break; case RAD_HIERARCHY_SLIDER_SELECTION: switch (pickingMode) { case CLICKED: if (externalID == iUpwardNavigationSliderID) { if (upwardNavigationSlider.handleSliderSelection(pickingType)) { updateHierarchyAccordingToNavigationSlider(); setDisplayListDirty(); } } break; default: return; } break; case RAD_HIERARCHY_SLIDER_BUTTON_SELECTION: switch (pickingMode) { case CLICKED: if (externalID == iUpwardNavigationSliderButtonID) { if (upwardNavigationSlider.handleSliderSelection(pickingType)) { updateHierarchyAccordingToNavigationSlider(); setDisplayListDirty(); } } break; default: return; } break; case RAD_HIERARCHY_SLIDER_BODY_SELECTION: switch (pickingMode) { case CLICKED: if (externalID == iUpwardNavigationSliderBodyID) { if (upwardNavigationSlider.handleSliderSelection(pickingType)) { updateHierarchyAccordingToNavigationSlider(); setDisplayListDirty(); } } break; default: return; } break; default: break; } }