From de7bebcd78cd30081b5a5a028edc6e1475d82445 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Sat, 23 Dec 2017 21:28:52 -0800 Subject: [PATCH 01/82] minor changes adding thread specific rendering --- .../fxgraph/graph/EventHandlers.java | 109 +++++++++++------- 1 file changed, 66 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 3a98585..78ed272 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -9,8 +9,6 @@ import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.EventHandler; -import javafx.geometry.BoundingBox; -import javafx.geometry.Bounds; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Button; @@ -26,18 +24,16 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import static com.application.fxgraph.graph.BoundBox.unitWidthFactor; import static com.application.fxgraph.graph.Graph.cellLayer; public class EventHandlers { private static ConvertDBtoElementTree convertDBtoElementTree; final DragContext dragContext = new DragContext(); - static Map deltaCache = new HashMap<>(); + // static Map deltaCache = new HashMap<>(); private boolean clickable = true; private boolean subtreeExpanded = true; private boolean posUpdated = true; @@ -51,14 +47,14 @@ public EventHandlers(Graph graph) { } public static void resetEventHandlers() { - deltaCache = new HashMap<>(); + // deltaCache = new HashMap<>(); } public void setCustomMouseEventHandlers(final Node node) { // ***************** // Show popup to display element details on mouse hover on an element. // node.setOnMouseEntered(onMouseHoverToShowInfoEventHandler); - // node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); + node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); // ***************** @@ -71,7 +67,7 @@ public void setCustomMouseEventHandlers(final Node node) { // ***************** // Click on an element to collapse the subtree rooted at that element. - node.setOnMousePressed(onMousePressedToCollapseTree); + // node.setOnMousePressed(onMousePressedToCollapseTree); // ***************** @@ -368,7 +364,7 @@ public void handle(MouseEvent event) { Button minMaxButton = new Button("min / max"); minMaxButton.setOnMouseClicked(event1 -> { - invokeOnMousePressedEventHandler(cell); + invokeOnMousePressedEventHandler(cell, threadId); } ); @@ -399,14 +395,8 @@ public void handle(MouseEvent event) { @SuppressWarnings("Duplicates") - private void invokeOnMousePressedEventHandler(CircleCell cell) { - - } - - - private EventHandler onMousePressedToCollapseTree = new EventHandler() { - @Override - public void handle(MouseEvent event) { + private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { + { if (!clickable) { System.out.println(">>>>>>>>>>>>>>>>>>> Clickable is false. <<<<<<<<<<<<<<<<<<<<<"); @@ -421,7 +411,7 @@ public void handle(MouseEvent event) { // System.out.println("on click: set clickable: " + clickable); CellLayer cellLayer = (CellLayer) graph.getCellLayer(); - CircleCell clickedCell = (CircleCell) event.getSource(); + CircleCell clickedCell = cell; String clickedCellID = clickedCell.getCellId(); int collapsed = 0; double clickedCellTopLeftY = 0; @@ -500,13 +490,13 @@ public void handle(MouseEvent event) { "WHERE ID = " + clickedCellID; DatabaseUtil.executeUpdate(updateClickedElement); - int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY); - + int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); + int lastCellId = getLowestCellInThread(threadId); removeChildrenFromUI(Integer.parseInt(clickedCellID), nextCellId); moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, newDelta); updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, newDelta, newDeltaX); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, 1, nextCellId); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, 1, nextCellId, threadId, lastCellId); } else if (collapsed == 2) { // MAXIMIZE SUBTREE @@ -519,8 +509,8 @@ public void handle(MouseEvent event) { // double delta = deltaCache.get(clickedCellID); - int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY); - + int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); + int lastCellId = getLowestCellInThread(threadId); double clickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor; double newClickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor + newDelta; @@ -529,25 +519,53 @@ public void handle(MouseEvent event) { updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, -newDelta, -newDeltaX); ElementDAOImpl.updateWhere("collapsed", "0", "id = " + clickedCellID); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, 0, nextCellId); - + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, 0, nextCellId, threadId, lastCellId); } } + } + + + private EventHandler onMousePressedToCollapseTree = new EventHandler() { + @Override + public void handle(MouseEvent event) { + System.out.println("Nothing happens on in EventHandler::onMousePressedToCollapseTree Event"); + } }; - private int getNextLowerSiblingOrAncestorNode(int clickedCellId, double x, double y) { + private int getLowestCellInThread(int threadId) { + String maxEleIdQuery = "SELECT MAX(E.ID) AS MAXID " + + "FROM " + TableNames.ELEMENT_TABLE + " AS E JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT " + + "ON E.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE CT.THREAD_ID = " + threadId; + + + try (ResultSet eleIdRS = DatabaseUtil.select(maxEleIdQuery)){ + if (eleIdRS.next()) { + return eleIdRS.getInt("MAXID"); + + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return Integer.MAX_VALUE; + } + + private int getNextLowerSiblingOrAncestorNode(int clickedCellId, double x, double y, int threadId) { String getNextQuery = "SELECT " + "CASE " + - "WHEN MIN(ID) IS NULL THEN " + Integer.MAX_VALUE + " " + - "ELSE MIN(ID) " + + "WHEN MIN(E.ID) IS NULL THEN " + Integer.MAX_VALUE + " " + + "ELSE MIN(E.ID) " + "END " + "AS MINID " + - "FROM " + TableNames.ELEMENT_TABLE + " " + - "WHERE BOUND_BOX_Y_TOP_LEFT > " + y + " " + - "AND BOUND_BOX_X_TOP_LEFT <= " + x + " " + - "AND ID > " + clickedCellId; + "FROM " + TableNames.ELEMENT_TABLE + " AS E JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT " + + "ON E.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE E.BOUND_BOX_Y_TOP_LEFT > " + y + " " + + "AND E.BOUND_BOX_X_TOP_LEFT <= " + x + " " + + "AND E.ID > " + clickedCellId + " " + + "AND CT.THREAD_ID = " + threadId; - // System.out.println("EventHandler::getNextLowerSiblingOrAncestorNode: query: " + getNextQuery); + System.out.println("EventHandler::getNextLowerSiblingOrAncestorNode: query: " + getNextQuery); try (ResultSet rs = DatabaseUtil.select(getNextQuery)) { @@ -767,7 +785,7 @@ private void moveLowerTreeByDelta(String clickedCellID, double clickedCellBottom // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, int min, int nextCellId) { + private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, int min, int nextCellId, int threadId, int lastCellId) { Statement statement = DatabaseUtil.createStatement(); Task task = new Task() { @@ -798,13 +816,13 @@ protected Void call() throws Exception { } updateParentChainRecursive(clickedCellId, delta, statement); - updateAllParentHighlightsInDB(clickedCellId, topY, delta, deltaX, statement); + updateAllParentHighlightsInDB(clickedCellId, topY, delta, deltaX, statement, threadId); statement.executeBatch(); if (nextCellId != Integer.MAX_VALUE) { // only if next lower sibling ancestor node is present. - updateTreeBelowYBulk(topY + BoundBox.unitHeightFactor, delta, statement, nextCellId); + updateTreeBelowYBulk(topY + BoundBox.unitHeightFactor, delta, statement, nextCellId, lastCellId, threadId); statement.executeBatch(); } @@ -1022,7 +1040,7 @@ private void updateCollapseValForEdgesSubTreeBulk(Statement statement, boolean i // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - private void updateTreeBelowYBulk(double y, double delta, Statement statement, int nextCellId) { + private void updateTreeBelowYBulk(double y, double delta, Statement statement, int nextCellId, int lastCellId, int threadId) { // System.out.println("EventHandler::updateTreeBelowYBulk: method started"); String updateCellsQuery = "UPDATE " + TableNames.ELEMENT_TABLE + " " + "SET bound_box_y_top_left = bound_box_y_top_left - " + delta + ", " + @@ -1031,24 +1049,28 @@ private void updateTreeBelowYBulk(double y, double delta, Statement statement, i "bound_box_y_bottom_right = bound_box_y_bottom_right - " + delta + ", " + "bound_box_y_coordinate = bound_box_y_coordinate - " + delta + " " + "WHERE bound_box_y_coordinate >= " + y + " " + - "AND ID >= " + nextCellId; + "AND ID >= " + nextCellId + " " + + "AND ID <= " + lastCellId; // System.out.println("updateTreeBelowYBulk: updateCellsQuery: " + updateCellsQuery); String updateEdgeStartPoingQuery = "UPDATE " + TableNames.EDGE_TABLE + " " + "SET START_Y = START_Y - " + delta + " " + "WHERE START_Y >= " + y + " " + - "AND FK_SOURCE_ELEMENT_ID >= " + nextCellId; + "AND FK_SOURCE_ELEMENT_ID >= " + nextCellId + " " + + "AND FK_SOURCE_ELEMENT_ID <= " + lastCellId; // System.out.println("updateTreeBelowYBulk: updateEdgeStartPoingQuery: " + updateEdgeStartPoingQuery); String updateEdgeEndPointQuery = "UPDATE " + TableNames.EDGE_TABLE + " " + "SET END_Y = END_Y - " + delta + " " + "WHERE END_Y >= " + y + " " + - "AND FK_TARGET_ELEMENT_ID >= " + nextCellId; + "AND FK_TARGET_ELEMENT_ID >= " + nextCellId + " " + + "AND FK_TARGET_ELEMENT_ID <= " + lastCellId; // System.out.println("updateTreeBelowYBulk: updateEdgeEndPointQuery: " + updateEdgeEndPointQuery); String updateHighlightsQuery = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " " + "SET START_Y = START_Y - " + delta + " " + - "WHERE ELEMENT_ID >= " + nextCellId; + "WHERE ELEMENT_ID >= " + nextCellId + " " + + "AND THREAD_ID = " + threadId; System.out.println("EventHandler::updateTreeBelowYBulk: updateHighlightsQuery: " + updateHighlightsQuery); @@ -1168,14 +1190,15 @@ else if (rectangleCell.getBoundsInParent().contains(finalX, finalY)) { }); } - private void updateAllParentHighlightsInDB(int clickedCellId, double y, double delta, double deltaX, Statement statement) { + private void updateAllParentHighlightsInDB(int clickedCellId, double y, double delta, double deltaX, Statement statement, int threadId) { try { String updateParentHighlights = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " " + "SET HEIGHT = HEIGHT - " + delta + " " + "WHERE START_Y <= " + y + " " + "AND START_Y + HEIGHT >= " + y + " " + "AND ELEMENT_ID < " + clickedCellId + " " + - "AND COLLAPSED = 0"; + "AND COLLAPSED = 0 " + + "AND THREAD_ID = " + threadId; statement.addBatch(updateParentHighlights); System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlights: " + updateParentHighlights); From b61f7c664ffa0b8c87bc47dc361c6ba7265d24c8 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Sun, 24 Dec 2017 22:59:12 -0800 Subject: [PATCH 02/82] more bug fixes --- src/main/java/com/application/Main.java | 28 +++++++----- .../ConvertDBtoElementTree.java | 45 ++++++++++++------- .../fxgraph/graph/EventHandlers.java | 11 ++++- .../com/application/fxgraph/graph/Graph.java | 2 +- .../com/application/fxgraph/graph/Model.java | 5 +-- .../fxgraph/graph/ZoomableScrollPane.java | 7 ++- 6 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 8445d17..8197bb3 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -883,7 +883,7 @@ private void postDatabaseLoad() { // Graph.drawPlaceHolderLines(); - updateUi("postDatabaseLoad"); + updateUi(); String firstThreadID = currentSelectedThread = threadsObsList.get(0).split(" ")[1]; showThread(firstThreadID); @@ -941,26 +941,24 @@ private void postDatabaseLoad() { // } public void showThread(String threadId) { + System.out.println("Main::showThread: clicked thread: " + threadId); currentSelectedThread = threadId; // Prevent triggering listeners from modifying circleCellsOnUI, edgesOnUI and highlightsOnUI HashMaps ZoomableScrollPane.turnOffListeners(); // graph.getModel().uiUpdateRequired = true; - // System.out.println("Main::showThread: new updates show"); convertDBtoElementTree.setCurrentThreadId(threadId); - // System.out.println("Main::showThread: before clearUI"); convertDBtoElementTree.clearUI(); - // System.out.println("Main::showThread: after clearUI"); - updateUi("showThread"); - // System.out.println("Main::showThread: END"); + updateUi(); // Prevent triggering listeners from modifying circleCellsOnUI, edgesOnUI and highlightsOnUI HashMaps ZoomableScrollPane.turnOnListeners(); - graph.getModel().stackRectangles("showThread"); + graph.getModel().stackRectangles(); + System.out.println("Main::showThread: END"); } - public void updateUi(String caller) { + public void updateUi() { if (convertDBtoElementTree != null && graph != null) { // System.out.println("Main::updateUi: called by " + caller + " thread " + Thread.currentThread().getName()); @@ -1370,10 +1368,10 @@ protected void succeeded() { super.succeeded(); // System.out.println("Main::setUpHighlightsWindow::succeeded"); graph.getModel().uiUpdateRequired = true; - updateUi("taskOnApply"); + updateUi(); // Stack highlights so that the larger ones are behind smaller ones. - graph.getModel().stackRectangles("succeeded"); + graph.getModel().stackRectangles(); } }; @@ -1512,7 +1510,13 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str "'" + colorsMap.getOrDefault(fullName, Color.AQUAMARINE) + "', " + // COLLAPSED - "0 " + + "(SELECT " + + "CASE " + + "WHEN E1.COLLAPSED = 0 THEN 0 " + + "WHEN E1.COLLAPSED = 2 THEN 0 " + + "ELSE 1 " + + "END " + + "FROM " + TableNames.ELEMENT_TABLE + " AS E1 WHERE E1.ID = " + TableNames.ELEMENT_TABLE + ".ID) " + "FROM " + TableNames.ELEMENT_TABLE + " " + @@ -1527,7 +1531,7 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str String sql = highlightType.equalsIgnoreCase("SINGLE") ? sqlSingle : sqlFull; - // System.out.println( "Main::addInsertQueryToStatement: sql : " + sql); + System.out.println( "Main::addInsertQueryToStatement: sql : " + sql); try { statement.addBatch(sql); } catch (SQLException e) { diff --git a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java index 5dfad2b..c7537ae 100644 --- a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java +++ b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java @@ -169,9 +169,9 @@ public void recursivelyInsertEdgeElementsIntoDB(Element root) { * */ public void loadUIComponentsInsideVisibleViewPort(Graph graph) { + System.out.println("ConvertDBtoElementTree:loadUIComponentsInsideVisibleViewPort: Method started"); this.graph = graph; this.model = graph.getModel(); - // System.out.println("ConvertDBtoElementTree:loadUIComponentsInsideVisibleViewPort: Method started"); // BoundingBox viewPortDims = graph.getViewPortDims(); @@ -180,7 +180,22 @@ public void loadUIComponentsInsideVisibleViewPort(Graph graph) { // return; // } - // System.out.println("ConvertDBtoElementTree:loadUIComponentsInsideVisibleViewPort: UI redrawing required."); + + System.out.println("ConvertDBtoElementTree::loadUIComponentsInsideVisibleViewPort: before drawing, existing contents of cellLayer: "); + System.out.println("mapCircleCellsOnUI: size: " + graph.getModel().getCircleCellsOnUI().size()); + graph.getModel().getCircleCellsOnUI().keySet().stream().sorted().forEach(id -> { + System.out.print(id + ", "); + }); + + // System.out.println("mapEdgesOnUI: "); + // graph.getModel().getEdgesOnUI().keySet().stream().sorted().forEach(id -> { + // System.out.print(id + ", "); + // }); + // + // System.out.println("highlightsOnUI: elementId : "); + // graph.getModel().getHighlightsOnUI().values().stream().sorted().forEach(rect -> { + // System.out.print(rect.getElementId()+ ", "); + // }); // Add circle cells addCircleCells(); @@ -194,22 +209,23 @@ public void loadUIComponentsInsideVisibleViewPort(Graph graph) { graph.updateCellLayer(); + System.out.println("ConvertDBtoElementTree::loadUIComponentsInsideVisibleViewPort: after drawing, contents of cellLayer: "); + System.out.println("mapCircleCellsOnUI: size: " + graph.getModel().getCircleCellsOnUI().size()); + graph.getModel().getCircleCellsOnUI().keySet().stream().sorted().forEach(id -> { + System.out.print(id + ", "); + }); } public void forceUiRendering(Graph graph) { // System.out.println("ConvertDBtoElementTree:forceUiRendering: method started"); + // Add circle cells addCircleCells(); - // Add edges addEdges(); - // Add highlights addHighlights(); - - // System.out.println("ConvertDBtoElementTree:forceUiRendering: invoking updateCellLayer"); graph.updateCellLayer(); - // System.out.println("ConvertDBtoElementTree:forceUiRendering: ending updateCellLayer"); // System.out.println("ConvertDBtoElementTree:forceUiRendering: method ended"); } @@ -276,12 +292,6 @@ private void addHighlights() { private void addCircleCells() { Map mapCircleCellsOnUI = model.getCircleCellsOnUI(); - // - // System.out.println("Printing mapCircleCellsOnUI: size: " + mapCircleCellsOnUI.size()); - // mapCircleCellsOnUI.forEach((id, circleCell) -> { - // System.out.println(circleCell); - // }); - // Calculate the expanded region around viewport that needs to be loaded. BoundingBox viewPortDims = graph.getViewPortDims(); @@ -303,9 +313,10 @@ private void addCircleCells() { " AND E.bound_box_y_coordinate > " + (viewPortMinY - heightOffset) + " AND E.bound_box_y_coordinate < " + (viewPortMaxY + heightOffset) + " AND E.LEVEL_COUNT > 1" + - " AND E.COLLAPSED = 0" + - " OR E.COLLAPSED = 2"; + " AND (E.COLLAPSED = 0" + + " OR E.COLLAPSED = 2)"; + System.out.println("ConvertDBtoElementTree::addCircleCells: sql: " + sql); CircleCell curCircleCell; CircleCell parentCircleCell; @@ -346,7 +357,7 @@ private void addCircleCells() { // Add circle cell to model and UI only if they are not already present on UI and if collapsed value is 0 or 2 if (!mapCircleCellsOnUI.containsKey(id) && (collapsed == 0 || collapsed == 2)) { - // System.out.println("ConvertDBtoElementTree::addCircleCells: adding new cells to UI: cell id: " + id); + System.out.println("ConvertDBtoElementTree::addCircleCells: adding new cells to UI: cell id: " + id); curCircleCell = new CircleCell(id, xCoordinate, yCoordinate); curCircleCell.setMethodName(methodName); model.addCell(curCircleCell); @@ -373,7 +384,7 @@ private void addCircleCells() { float xCoordinateTemp = rsTemp.getFloat("bound_box_x_coordinate"); float yCoordinateTemp = rsTemp.getFloat("bound_box_y_coordinate"); parentCircleCell = new CircleCell(parentId, xCoordinateTemp, yCoordinateTemp); - // System.out.println("ConvertDBtoElementTree::addCircleCells: adding new cells to UI: cell id: " + parentId); + System.out.println("ConvertDBtoElementTree::addCircleCells: adding new parent cells to UI: cell id: " + parentId); model.addCell(parentCircleCell); } } diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 78ed272..cb49c1f 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -856,7 +856,14 @@ protected void failed() { // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId) { + private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId) { + + // Collapsed value -> description + // 0 -> visible AND uncollapsed + // 2 -> visible AND collapsed + // >2 -> not visible AND collapsed + // <0 -> not visible AND collapsed + // System.out.println("EventHandler::updateCollapseValForSubTreeBulk: method started"); String updateCellQuery; String updateEdgeQuery; @@ -908,7 +915,7 @@ private void updateCollapseValForSubTreeBulk(double topY, double bottomY, doubl "WHERE FK_TARGET_ELEMENT_ID IN " + "(SELECT ELE.ID FROM " + TableNames.ELEMENT_TABLE + " AS ELE JOIN " + TableNames.EDGE_TABLE + " as EDGE " + "ON ELE.ID = EDGE.FK_TARGET_ELEMENT_ID " + - "WHERE EDGE.FK_TARGET_ELEMENT_ID > " + startCellId + " " + + "WHERE EDGE.FK_TARGET_ELEMENT_ID > " + startCellId + " " + "AND EDGE.FK_TARGET_ELEMENT_ID < " + endCellId + " " + // "AND ELE.COLLAPSED >= 0 " + // "AND ELE.COLLAPSED <= 2" + diff --git a/src/main/java/com/application/fxgraph/graph/Graph.java b/src/main/java/com/application/fxgraph/graph/Graph.java index 4ef8b3a..0d9121f 100644 --- a/src/main/java/com/application/fxgraph/graph/Graph.java +++ b/src/main/java/com/application/fxgraph/graph/Graph.java @@ -130,7 +130,7 @@ public void updateCellLayer() { } }); - model.stackRectangles(""); + model.stackRectangles(); model.uiUpdateRequired = false; // System.out.println("Graph::updateCellLayer: method ended"); diff --git a/src/main/java/com/application/fxgraph/graph/Model.java b/src/main/java/com/application/fxgraph/graph/Model.java index e0d6d0b..c1fd02a 100644 --- a/src/main/java/com/application/fxgraph/graph/Model.java +++ b/src/main/java/com/application/fxgraph/graph/Model.java @@ -1,13 +1,10 @@ package com.application.fxgraph.graph; -import com.application.Main; import com.application.fxgraph.ElementHelpers.Element; import com.application.fxgraph.cells.CircleCell; import com.application.fxgraph.cells.RectangleCell; import com.application.fxgraph.cells.TriangleCell; import javafx.scene.Node; -import javafx.scene.shape.Rectangle; -import org.w3c.dom.css.Rect; import java.util.*; @@ -50,7 +47,7 @@ public Model() { public boolean uiUpdateRequired = true; - public void stackRectangles(String from) { + public void stackRectangles() { List list = new ArrayList<>(highlightsOnUI.values()); diff --git a/src/main/java/com/application/fxgraph/graph/ZoomableScrollPane.java b/src/main/java/com/application/fxgraph/graph/ZoomableScrollPane.java index f9c091a..6d1ad89 100644 --- a/src/main/java/com/application/fxgraph/graph/ZoomableScrollPane.java +++ b/src/main/java/com/application/fxgraph/graph/ZoomableScrollPane.java @@ -3,7 +3,6 @@ import com.application.Main; import javafx.beans.property.DoubleProperty; import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Node; @@ -37,10 +36,10 @@ public ZoomableScrollPane(Node content) { zoomGroup.setOnScroll(new ZoomHandler()); hValProperty = hvalueProperty(); - hValListener = (observable, oldValue, newValue) -> main.updateUi("hvalueListener"); + hValListener = (observable, oldValue, newValue) -> main.updateUi(); vValProperty = vvalueProperty(); - vValListener = (observable, oldValue, newValue) -> main.updateUi("vValueListener"); + vValListener = (observable, oldValue, newValue) -> main.updateUi(); // // hValProperty.addListener(hValListener); // vValProperty.addListener(vValListener); @@ -50,7 +49,7 @@ public ZoomableScrollPane(Node content) { viewportBoundsProperty().addListener((observable, oldValue, newValue) -> { if (main != null) { - main.updateUi("viewportBoundsListener"); + main.updateUi(); } }); From 8923970cfbb51468664975c1cf58a55bc62d9127 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Mon, 25 Dec 2017 21:28:57 -0800 Subject: [PATCH 03/82] bug fixes related to full subtree highlights --- src/main/java/com/application/Main.java | 85 ++++++++++++++++--- .../ConvertDBtoElementTree.java | 30 +++---- .../fxgraph/graph/EventHandlers.java | 69 +++++++++++---- 3 files changed, 141 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 8197bb3..4aae508 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -105,6 +105,11 @@ public class Main extends Application { private MenuItem highlightMenuItem; private Glyph highlightItemsGlyph; + private Menu debugMenu; // Debug menu button + private MenuItem printCellsMenuItem; + private MenuItem printEdgesMenuItem; + private MenuItem printHighlightsMenuItem; + // Status bar private Group statusBar; private Label statusBarLabel = new Label(); @@ -311,7 +316,9 @@ private void setUpMenu() { goToMenu.setDisable(true); menuItems.add(clearHistoryMenuItem); - // Highlight method invocations menu. + // ***************** + // Highlights Menu + // ***************** highlight = new Menu("Highlights"); highlightItemsGlyph = new Glyph(font, FontAwesome.Glyph.FLAG); highlightItemsGlyph.setColor(ColorProp.ENABLED); @@ -321,8 +328,19 @@ private void setUpMenu() { highlight.setDisable(true); menuItems.add(highlightMenuItem); - // Main menu - menuBar.getMenus().addAll(fileMenu, runMenu, saveImgMenu, goToMenu, highlight); + // ***************** + // Debug Menu + // ***************** + debugMenu = new Menu("Debug"); + printCellsMenuItem = new MenuItem("Print circles on canvas to console"); + printEdgesMenuItem = new MenuItem("Print edges on canvas to console"); + printHighlightsMenuItem = new MenuItem("Print highlights on canvas to console"); + debugMenu.getItems().addAll(printCellsMenuItem, printEdgesMenuItem, printHighlightsMenuItem); + + // ***************** + // Main Menu + // ***************** + menuBar.getMenus().addAll(fileMenu, runMenu, saveImgMenu, goToMenu, highlight, debugMenu); glyphs.addAll(Arrays.asList(methodDefnGlyph, callTraceGlyph, resetGlyph, runAnalysisGlyph, saveImgGlyph, recentsGlyph, clearHistoryGlyph, highlightItemsGlyph)); @@ -417,8 +435,17 @@ private void setUpMenuForReloads() { highlight.getItems().add(highlightMenuItem); menuItems.add(highlightMenuItem); + // ***************** + // Debug Menu + // ***************** + debugMenu = new Menu("Debug"); + printCellsMenuItem = new MenuItem("Print circles on canvas to console"); + printEdgesMenuItem = new MenuItem("Print edges on canvas to console"); + printHighlightsMenuItem = new MenuItem("Print highlights on canvas to console"); + debugMenu.getItems().addAll(printCellsMenuItem, printEdgesMenuItem, printHighlightsMenuItem); + // Main menu - menuBar.getMenus().addAll(fileMenu, runMenu, saveImgMenu, goToMenu, highlight); + menuBar.getMenus().addAll(fileMenu, runMenu, saveImgMenu, goToMenu, highlight, debugMenu); glyphs.addAll(Arrays.asList(methodDefnGlyph, callTraceGlyph, resetGlyph, runAnalysisGlyph, saveImgGlyph, recentsGlyph, clearHistoryGlyph, highlightItemsGlyph)); @@ -541,8 +568,38 @@ public void handle(ActionEvent event) { // highlightMenuItem.setOnAction(event -> setUpMethodsWindow()); highlightMenuItem.setOnAction(event -> setUpHighlightsWindow()); + printCellsMenuItem.setOnAction(event -> { + System.out.println("-----------Cells on canvas ------------------------"); + graph.getModel().getCircleCellsOnUI().keySet().stream().sorted(Comparator.comparingInt(Integer::valueOf)).forEach(id -> { + System.out.print(id + ", "); + }); + System.out.println(); + System.out.println("---------------------------------------------------"); + }); + + printEdgesMenuItem.setOnAction(event -> { + System.out.println("-----------Edges on canvas ------------------------"); + graph.getModel().getEdgesOnUI().keySet().stream().sorted(Comparator.comparingInt(Integer::valueOf)).forEach(id -> { + System.out.print(id + ", "); + }); + System.out.println(); + System.out.println("---------------------------------------------------"); + }); + + printHighlightsMenuItem.setOnAction(event -> { + System.out.println("-----------Highlights on canvas --------------------"); + graph.getModel().getHighlightsOnUI().keySet().stream().sorted().forEach(id -> { + System.out.print(id + ", "); + }); + System.out.println(); + System.out.println("---------------------------------------------------"); + }); + // System.out.println("Main::setUpMenuActions: method ended"); + } + public String getCurrentSelectedThread() { + return currentSelectedThread; } private String currentSelectedThread; @@ -1289,8 +1346,7 @@ protected void succeeded() { colorPicker.setOnAction(event -> { anyColorChange = true; colorsMap.put(fullName, colorPicker.getValue()); - System.out.println(colorPicker.getValue()); - System.out.println(colorPicker.getValue().toString()); + // System.out.println(colorPicker.getValue()); }); colorPicker.getStyleClass().add("button"); colorPicker.setStyle( @@ -1490,11 +1546,18 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + topOffset + ", " + // WIDTH - "(SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + - "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + - "WHERE E1.BOUND_BOX_Y_COORDINATE >= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT " + - "AND E1.BOUND_BOX_Y_COORDINATE <= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + - "AND CT.THREAD_ID = " + threadId + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + rightOffset + ", " + + // "CASE " + + // "WHEN " + TableNames.ELEMENT_TABLE + ".COLLAPSED IN (0, 2) THEN " + + "((SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE E1.BOUND_BOX_Y_COORDINATE >= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT " + + "AND E1.BOUND_BOX_Y_COORDINATE < " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + + "AND CT.THREAD_ID = " + threadId + " " + + "AND E1.COLLAPSED IN (0, 2) " + + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + rightOffset + ") " + + // "ELSE " + BoundBox.unitWidthFactor + " " + + // "END " + + ", " + // TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_RIGHT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_LEFT + " + endOffset + "," + // HEIGHT diff --git a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java index c7537ae..8a3a8ae 100644 --- a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java +++ b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java @@ -169,7 +169,7 @@ public void recursivelyInsertEdgeElementsIntoDB(Element root) { * */ public void loadUIComponentsInsideVisibleViewPort(Graph graph) { - System.out.println("ConvertDBtoElementTree:loadUIComponentsInsideVisibleViewPort: Method started"); + // System.out.println("ConvertDBtoElementTree:loadUIComponentsInsideVisibleViewPort: Method started"); this.graph = graph; this.model = graph.getModel(); @@ -181,17 +181,17 @@ public void loadUIComponentsInsideVisibleViewPort(Graph graph) { // } - System.out.println("ConvertDBtoElementTree::loadUIComponentsInsideVisibleViewPort: before drawing, existing contents of cellLayer: "); - System.out.println("mapCircleCellsOnUI: size: " + graph.getModel().getCircleCellsOnUI().size()); - graph.getModel().getCircleCellsOnUI().keySet().stream().sorted().forEach(id -> { - System.out.print(id + ", "); - }); + // System.out.println("ConvertDBtoElementTree::loadUIComponentsInsideVisibleViewPort: before drawing, existing contents of cellLayer: "); + // System.out.println("mapCircleCellsOnUI: size: " + graph.getModel().getCircleCellsOnUI().size()); + // graph.getModel().getCircleCellsOnUI().keySet().stream().sorted().forEach(id -> { + // System.out.print(id + ", "); + // }); // System.out.println("mapEdgesOnUI: "); // graph.getModel().getEdgesOnUI().keySet().stream().sorted().forEach(id -> { // System.out.print(id + ", "); // }); - // + // System.out.println("highlightsOnUI: elementId : "); // graph.getModel().getHighlightsOnUI().values().stream().sorted().forEach(rect -> { // System.out.print(rect.getElementId()+ ", "); @@ -209,11 +209,11 @@ public void loadUIComponentsInsideVisibleViewPort(Graph graph) { graph.updateCellLayer(); - System.out.println("ConvertDBtoElementTree::loadUIComponentsInsideVisibleViewPort: after drawing, contents of cellLayer: "); - System.out.println("mapCircleCellsOnUI: size: " + graph.getModel().getCircleCellsOnUI().size()); - graph.getModel().getCircleCellsOnUI().keySet().stream().sorted().forEach(id -> { - System.out.print(id + ", "); - }); + // System.out.println("ConvertDBtoElementTree::loadUIComponentsInsideVisibleViewPort: after drawing, contents of cellLayer: "); + // System.out.println("mapCircleCellsOnUI: size: " + graph.getModel().getCircleCellsOnUI().size()); + // graph.getModel().getCircleCellsOnUI().keySet().stream().sorted().forEach(id -> { + // System.out.print(id + ", "); + // }); } public void forceUiRendering(Graph graph) { @@ -316,7 +316,7 @@ private void addCircleCells() { " AND (E.COLLAPSED = 0" + " OR E.COLLAPSED = 2)"; - System.out.println("ConvertDBtoElementTree::addCircleCells: sql: " + sql); + // System.out.println("ConvertDBtoElementTree::addCircleCells: sql: " + sql); CircleCell curCircleCell; CircleCell parentCircleCell; @@ -357,7 +357,7 @@ private void addCircleCells() { // Add circle cell to model and UI only if they are not already present on UI and if collapsed value is 0 or 2 if (!mapCircleCellsOnUI.containsKey(id) && (collapsed == 0 || collapsed == 2)) { - System.out.println("ConvertDBtoElementTree::addCircleCells: adding new cells to UI: cell id: " + id); + // System.out.println("ConvertDBtoElementTree::addCircleCells: adding new cells to UI: cell id: " + id); curCircleCell = new CircleCell(id, xCoordinate, yCoordinate); curCircleCell.setMethodName(methodName); model.addCell(curCircleCell); @@ -384,7 +384,7 @@ private void addCircleCells() { float xCoordinateTemp = rsTemp.getFloat("bound_box_x_coordinate"); float yCoordinateTemp = rsTemp.getFloat("bound_box_y_coordinate"); parentCircleCell = new CircleCell(parentId, xCoordinateTemp, yCoordinateTemp); - System.out.println("ConvertDBtoElementTree::addCircleCells: adding new parent cells to UI: cell id: " + parentId); + // System.out.println("ConvertDBtoElementTree::addCircleCells: adding new parent cells to UI: cell id: " + parentId); model.addCell(parentCircleCell); } } diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index cb49c1f..554910a 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -6,6 +6,7 @@ import com.application.db.DatabaseUtil; import com.application.db.TableNames; import com.application.fxgraph.cells.CircleCell; +import com.sun.xml.internal.ws.policy.spi.PolicyAssertionValidator; import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.EventHandler; @@ -18,6 +19,7 @@ import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import org.controlsfx.control.PopOver; +import org.omg.CORBA.INTERNAL; import java.sql.Connection; import java.sql.ResultSet; @@ -54,7 +56,8 @@ public void setCustomMouseEventHandlers(final Node node) { // ***************** // Show popup to display element details on mouse hover on an element. // node.setOnMouseEntered(onMouseHoverToShowInfoEventHandler); - node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); + // node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); + node.setOnMousePressed(onMousePressedToCollapseTree); // ***************** @@ -364,6 +367,9 @@ public void handle(MouseEvent event) { Button minMaxButton = new Button("min / max"); minMaxButton.setOnMouseClicked(event1 -> { + if (popOver != null) { + popOver.hide(); + } invokeOnMousePressedEventHandler(cell, threadId); } ); @@ -394,7 +400,6 @@ public void handle(MouseEvent event) { }; - @SuppressWarnings("Duplicates") private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { { @@ -467,18 +472,34 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { Statement statement = DatabaseUtil.createStatement(); + int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); + int lastCellId = getLowestCellInThread(threadId); + // delta = clickedCellBoundBottomLeftY - clickedCellTopLeftY - BoundBox.unitHeightFactor; newDelta = clickedCellBoundBottomLeftY - clickedCellTopLeftY - BoundBox.unitHeightFactor; // calculate the new value of newDeltaX - try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + clickedCellID)){ + String getDeltaXQuery = "SELECT MAX(BOUND_BOX_X_TOP_RIGHT) AS MAX_X FROM " + TableNames.ELEMENT_TABLE + " " + + "WHERE ID >= " + clickedCellID + " AND ID < " + nextCellId + " " + + "AND COLLAPSED IN (0, 2)"; + + try (ResultSet rs = DatabaseUtil.select(getDeltaXQuery)){ if (rs.next()) { - newDeltaX = rs.getFloat("WIDTH") - BoundBox.unitWidthFactor; + newDeltaX = rs.getFloat("MAX_X") - clickedCellTopRightX; System.out.println("EventHandler::onMousePressedToCollapseTree on collapse: newDeltaX: " + newDeltaX); } } catch (SQLException e) { e.printStackTrace(); } + + // try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + clickedCellID)){ + // if (rs.next()) { + // newDeltaX = rs.getFloat("WIDTH") - BoundBox.unitWidthFactor; + // System.out.println("EventHandler::onMousePressedToCollapseTree on collapse: newDeltaX: " + newDeltaX); + // } + // } catch (SQLException e) { + // e.printStackTrace(); + // } double clickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor; // deltaCache.put(clickedCellID, delta); @@ -490,8 +511,6 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { "WHERE ID = " + clickedCellID; DatabaseUtil.executeUpdate(updateClickedElement); - int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); - int lastCellId = getLowestCellInThread(threadId); removeChildrenFromUI(Integer.parseInt(clickedCellID), nextCellId); moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, newDelta); @@ -528,7 +547,8 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { private EventHandler onMousePressedToCollapseTree = new EventHandler() { @Override public void handle(MouseEvent event) { - System.out.println("Nothing happens on in EventHandler::onMousePressedToCollapseTree Event"); + // System.out.println("Nothing happens on in EventHandler::onMousePressedToCollapseTree Event"); + invokeOnMousePressedEventHandler((CircleCell) event.getSource(), Integer.valueOf(main.getCurrentSelectedThread())); } }; @@ -552,9 +572,11 @@ private int getLowestCellInThread(int threadId) { } private int getNextLowerSiblingOrAncestorNode(int clickedCellId, double x, double y, int threadId) { + int lastCellId = getLowestCellInThread(threadId) + 1; + String getNextQuery = "SELECT " + "CASE " + - "WHEN MIN(E.ID) IS NULL THEN " + Integer.MAX_VALUE + " " + + "WHEN MIN(E.ID) IS NULL THEN " + lastCellId + " " + "ELSE MIN(E.ID) " + "END " + "AS MINID " + @@ -565,7 +587,20 @@ private int getNextLowerSiblingOrAncestorNode(int clickedCellId, double x, doubl "AND E.ID > " + clickedCellId + " " + "AND CT.THREAD_ID = " + threadId; - System.out.println("EventHandler::getNextLowerSiblingOrAncestorNode: query: " + getNextQuery); + // String getNextQuery = "SELECT " + + // "CASE " + + // "WHEN MIN(E.ID) IS NULL THEN " + Integer.MAX_VALUE + " " + + // "ELSE MIN(E.ID) " + + // "END " + + // "AS MINID " + + // "FROM " + TableNames.ELEMENT_TABLE + " AS E JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT " + + // "ON E.ID_ENTER_CALL_TRACE = CT.ID " + + // "WHERE E.BOUND_BOX_Y_TOP_LEFT > " + y + " " + + // "AND E.BOUND_BOX_X_TOP_LEFT <= " + x + " " + + // "AND E.ID > " + clickedCellId + " " + + // "AND CT.THREAD_ID = " + threadId; + + // System.out.println("EventHandler::getNextLowerSiblingOrAncestorNode: query: " + getNextQuery); try (ResultSet rs = DatabaseUtil.select(getNextQuery)) { @@ -1079,7 +1114,7 @@ private void updateTreeBelowYBulk(double y, double delta, Statement statement, i "WHERE ELEMENT_ID >= " + nextCellId + " " + "AND THREAD_ID = " + threadId; - System.out.println("EventHandler::updateTreeBelowYBulk: updateHighlightsQuery: " + updateHighlightsQuery); + // System.out.println("EventHandler::updateTreeBelowYBulk: updateHighlightsQuery: " + updateHighlightsQuery); try { statement.addBatch(updateCellsQuery); @@ -1140,19 +1175,19 @@ private void updateAllParentHighlightsOnUI(String clickedCellId, double x, doubl graph.getModel().getHighlightsOnUI().forEach((id, rectangleCell) -> { // if this is the clicked cell, make highlight unit dimensions. if (rectangleCell.getElementId() == Integer.valueOf(clickedCellId)) { - System.out.println("EventHandler::updateAllParentHighlightsOnUI: decreasing height of clicked highilght id: " + id + - " eleID: " + rectangleCell.getElementId() + " by: " + delta +" and " + deltaX); + // System.out.println("EventHandler::updateAllParentHighlightsOnUI: decreasing height of clicked highilght id: " + id + + // " eleID: " + rectangleCell.getElementId() + " by: " + delta +" and " + deltaX); rectangleCell.setHeight(rectangleCell.getPrefHeight() - delta); rectangleCell.setWidth(rectangleCell.getPrefWidth() - deltaX); } // if this rectangle contains y, then shrink it by delta else if (rectangleCell.getBoundsInParent().contains(finalX, finalY)) { - System.out.println("EventHandler::updateAllParentHighlightsOnUI: decreasing height of id: " + id + " eleID: " + - rectangleCell.getElementId() + " rectangleCell.getBoundsInParent(): " + rectangleCell.getBoundsInParent()); + // System.out.println("EventHandler::updateAllParentHighlightsOnUI: decreasing height of id: " + id + " eleID: " + + // rectangleCell.getElementId() + " rectangleCell.getBoundsInParent(): " + rectangleCell.getBoundsInParent()); // System.out.println("rectangleCell.getBoundsInParent(): " + rectangleCell.getBoundsInParent()); // System.out.println("rectangleCell.getBoundsInLocal(): " + rectangleCell.getBoundsInLocal()); - System.out.println(" x, y : " + finalX + ", " + finalY); + // System.out.println(" x, y : " + finalX + ", " + finalY); // System.out.println("OLD"); // System.out.println("rectangleCell.getPrefHeight() " + rectangleCell.getPrefHeight() + " rectangleCell.getHeight(): " + rectangleCell.getHeight()); // System.out.println("rectangleCell.getBoundsInParent().getHeight() " + rectangleCell.getBoundsInParent().getHeight()); @@ -1208,7 +1243,7 @@ private void updateAllParentHighlightsInDB(int clickedCellId, double y, double d "AND THREAD_ID = " + threadId; statement.addBatch(updateParentHighlights); - System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlights: " + updateParentHighlights); + // System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlights: " + updateParentHighlights); } catch (SQLException e) { e.printStackTrace(); @@ -1223,7 +1258,7 @@ private void updateClickedCellHighlights(int clickedCellId, double y, double del "WHERE ELEMENT_ID = " + clickedCellId; statement.addBatch(updateParentHighlightsForClickedId); - System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlightsForClickedId: " + updateParentHighlightsForClickedId); + // System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlightsForClickedId: " + updateParentHighlightsForClickedId); } catch (SQLException e) { e.printStackTrace(); From 39e4600b17c568193a4cae795f6d43f853103616 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Fri, 29 Dec 2017 17:57:16 -0800 Subject: [PATCH 04/82] highlight width adjustments on collapse --- .../ConvertDBtoElementTree.java | 18 ++- .../fxgraph/graph/EventHandlers.java | 150 +++++++++--------- .../fxgraph/graph/RectangleCell.java | 6 +- 3 files changed, 98 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java index 8a3a8ae..0077634 100644 --- a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java +++ b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java @@ -230,6 +230,22 @@ public void forceUiRendering(Graph graph) { // System.out.println("ConvertDBtoElementTree:forceUiRendering: method ended"); } + public void ClearAndUpdateCellLayer() { + // remove all circles cells from UI + graph.getCellLayer().getChildren().removeAll(model.getCircleCellsOnUI().values()); + model.getCircleCellsOnUI().clear(); + + // remove all Edges from UI + graph.getCellLayer().getChildren().removeAll(model.getEdgesOnUI().values()); + model.getEdgesOnUI().clear(); + + // remove all Highlights from UI + graph.getCellLayer().getChildren().removeAll(model.getHighlightsOnUI().values()); + model.getHighlightsOnUI().clear(); + + forceUiRendering(graph); + } + private void addHighlights() { // System.out.println("ConvertDBtoElementTree::addHighlights: method started"); @@ -273,7 +289,7 @@ private void addHighlights() { // rectangle.setArcHeight(20); // rectangle.setArcWidth(20); - RectangleCell rect = new RectangleCell(elementId, startX, startY, width, height); + RectangleCell rect = new RectangleCell(id, elementId, startX, startY, width, height); rect.setColor(color); rect.setArcHeight(20); rect.setArcWidth(20); diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 554910a..6fd3f27 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -6,7 +6,6 @@ import com.application.db.DatabaseUtil; import com.application.db.TableNames; import com.application.fxgraph.cells.CircleCell; -import com.sun.xml.internal.ws.policy.spi.PolicyAssertionValidator; import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.EventHandler; @@ -19,7 +18,6 @@ import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import org.controlsfx.control.PopOver; -import org.omg.CORBA.INTERNAL; import java.sql.Connection; import java.sql.ResultSet; @@ -425,6 +423,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { double clickedCellBoundBottomLeftY = 0; double newDelta = 0; double newDeltaX = 0; + int parentId = 0; try (ResultSet cellRS = ElementDAOImpl.selectWhere("id = " + clickedCellID)) { if (cellRS.next()) { @@ -435,6 +434,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { clickedCellBoundBottomLeftY = cellRS.getDouble("bound_box_y_bottom_left"); newDelta = cellRS.getDouble("delta"); newDeltaX = cellRS.getDouble("delta_x"); + parentId = cellRS.getInt("parent_id"); } } catch (SQLException e) { e.printStackTrace(); @@ -515,7 +515,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { removeChildrenFromUI(Integer.parseInt(clickedCellID), nextCellId); moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, newDelta); updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, newDelta, newDeltaX); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, 1, nextCellId, threadId, lastCellId); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, 1, nextCellId, threadId, lastCellId, parentId); } else if (collapsed == 2) { // MAXIMIZE SUBTREE @@ -538,7 +538,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, -newDelta, -newDeltaX); ElementDAOImpl.updateWhere("collapsed", "0", "id = " + clickedCellID); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, 0, nextCellId, threadId, lastCellId); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, 0, nextCellId, threadId, lastCellId, parentId); } } } @@ -587,22 +587,6 @@ private int getNextLowerSiblingOrAncestorNode(int clickedCellId, double x, doubl "AND E.ID > " + clickedCellId + " " + "AND CT.THREAD_ID = " + threadId; - // String getNextQuery = "SELECT " + - // "CASE " + - // "WHEN MIN(E.ID) IS NULL THEN " + Integer.MAX_VALUE + " " + - // "ELSE MIN(E.ID) " + - // "END " + - // "AS MINID " + - // "FROM " + TableNames.ELEMENT_TABLE + " AS E JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT " + - // "ON E.ID_ENTER_CALL_TRACE = CT.ID " + - // "WHERE E.BOUND_BOX_Y_TOP_LEFT > " + y + " " + - // "AND E.BOUND_BOX_X_TOP_LEFT <= " + x + " " + - // "AND E.ID > " + clickedCellId + " " + - // "AND CT.THREAD_ID = " + threadId; - - // System.out.println("EventHandler::getNextLowerSiblingOrAncestorNode: query: " + getNextQuery); - - try (ResultSet rs = DatabaseUtil.select(getNextQuery)) { if (rs.next()) { // System.out.println("EventHandler::getNextLowerSiblingOrAncestorNode: we have result: " + rs.getInt("MINID")); @@ -820,33 +804,30 @@ private void moveLowerTreeByDelta(String clickedCellID, double clickedCellBottom // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, int min, int nextCellId, int threadId, int lastCellId) { + private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, int min, int nextCellId, int threadId, int lastCellId, int parentId) { Statement statement = DatabaseUtil.createStatement(); Task task = new Task() { @Override protected Void call() throws Exception { // System.out.println("==================== Starting thread updateDBInBackgroundThread. ===================="); - // int nextCellId = getNextLowerSiblingOrAncestorNode(clickedCellId, leftX, topY); - if (min == 1) { // on minimization - // int endCellId = nextCellId == 0 ? Integer.MAX_VALUE : nextCellId; updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, true, clickedCellId, nextCellId); } else { // on maximation - // int endCellId = nextCellId == 0 ? Integer.MAX_VALUE : nextCellId; updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, false, clickedCellId, nextCellId); - // expandSubtreeAndUpdateColValsRecursive(String.valueOf(clickedCellId)); } updateClickedCellHighlights(clickedCellId, topY, delta, deltaX, statement); + beta(clickedCellId, true, statement); + // No upate required for single line children if (delta == 0) { // System.out.println("Optimized for singel line children collapses."); statement.executeBatch(); - Platform.runLater(() -> convertDBtoElementTree.forceUiRendering(graph)); + Platform.runLater(() -> convertDBtoElementTree.ClearAndUpdateCellLayer()); return null; } @@ -861,7 +842,7 @@ protected Void call() throws Exception { statement.executeBatch(); } - Platform.runLater(() -> convertDBtoElementTree.forceUiRendering(graph)); + Platform.runLater(() -> convertDBtoElementTree.ClearAndUpdateCellLayer()); return null; } @@ -1175,58 +1156,13 @@ private void updateAllParentHighlightsOnUI(String clickedCellId, double x, doubl graph.getModel().getHighlightsOnUI().forEach((id, rectangleCell) -> { // if this is the clicked cell, make highlight unit dimensions. if (rectangleCell.getElementId() == Integer.valueOf(clickedCellId)) { - // System.out.println("EventHandler::updateAllParentHighlightsOnUI: decreasing height of clicked highilght id: " + id + - // " eleID: " + rectangleCell.getElementId() + " by: " + delta +" and " + deltaX); rectangleCell.setHeight(rectangleCell.getPrefHeight() - delta); rectangleCell.setWidth(rectangleCell.getPrefWidth() - deltaX); } // if this rectangle contains y, then shrink it by delta else if (rectangleCell.getBoundsInParent().contains(finalX, finalY)) { - // System.out.println("EventHandler::updateAllParentHighlightsOnUI: decreasing height of id: " + id + " eleID: " + - // rectangleCell.getElementId() + " rectangleCell.getBoundsInParent(): " + rectangleCell.getBoundsInParent()); - // System.out.println("rectangleCell.getBoundsInParent(): " + rectangleCell.getBoundsInParent()); - // System.out.println("rectangleCell.getBoundsInLocal(): " + rectangleCell.getBoundsInLocal()); - // System.out.println(" x, y : " + finalX + ", " + finalY); - // System.out.println("OLD"); - // System.out.println("rectangleCell.getPrefHeight() " + rectangleCell.getPrefHeight() + " rectangleCell.getHeight(): " + rectangleCell.getHeight()); - // System.out.println("rectangleCell.getBoundsInParent().getHeight() " + rectangleCell.getBoundsInParent().getHeight()); - // System.out.println("rectangleCell.getRectangle().getBoundsInParent().getHeight(): " + rectangleCell.getRectangle().getBoundsInParent().getHeight()); - // System.out.println("rectangleCell.getRectangle().getHeight(): " + rectangleCell.getRectangle().getHeight()); rectangleCell.setHeight(rectangleCell.getPrefHeight() - delta); - // System.out.println("NEW"); - // System.out.println("rectangleCell.getPrefHeight() " + rectangleCell.getPrefHeight() + " rectangleCell.getHeight(): " + rectangleCell.getHeight()); - // System.out.println("rectangleCell.getBoundsInParent().getHeight() " + rectangleCell.getBoundsInParent().getHeight()); - // System.out.println("rectangleCell.getRectangle().getBoundsInParent().getHeight(): " + rectangleCell.getRectangle().getBoundsInParent().getHeight()); - // System.out.println("rectangleCell.getRectangle().getHeight(): " + rectangleCell.getRectangle().getHeight()); - // } else { - // System.out.println("ELSE"); - // System.out.println("EventHandler::updateAllParentHighlightsOnUI: id: " + id + " eleID: " + rectangleCell.getElementId()); - // System.out.println("rectangleCell.getBoundsInParent(): " + rectangleCell.getBoundsInParent()); - // System.out.println("rectangleCell.getBoundsInLocal(): " + rectangleCell.getBoundsInLocal()); - // System.out.println(" x, y : " + finalX + ", " + finalY); - // System.out.println("rectangleCell.getPrefHeight() " + rectangleCell.getPrefHeight() + " rectangleCell.getHeight(): " + rectangleCell.getHeight()); - // System.out.println("rectangleCell.getBoundsInParent().getHeight() " + rectangleCell.getBoundsInParent().getHeight()); - // System.out.println("rectangleCell.getRectangle().getBoundsInParent().getHeight(): " + rectangleCell.getRectangle().getBoundsInParent().getHeight()); - // System.out.println("rectangleCell.getRectangle().getHeight(): " + rectangleCell.getRectangle().getHeight()); - // - // if (rectangleCell.getBoundsInParent().getMinY() <= finalY && rectangleCell.getBoundsInParent().getMaxY() >= finalY) { - // System.out.println("YES ME"); - // Bounds b = rectangleCell.getBoundsInParent(); - // - // System.out.println(finalX >= b.getMinX()); - // System.out.println(finalX <= b.getMaxX()); - // System.out.println((finalY >= b.getMinY()) + " " + - // (finalY <= b.getMaxY()) + " " + - // (0.0f >= b.getMinZ()) + " " + - // (0.0f <= b.getMaxZ())); - // - // if (rectangleCell.getBoundsInParent().contains(finalX, finalY)) { - // System.out.println("===yes again"); - // } else { - // System.out.println("===not again"); - // } - // } } }); @@ -1250,6 +1186,74 @@ private void updateAllParentHighlightsInDB(int clickedCellId, double y, double d } } + private void beta(int cellId, boolean isCollapsed, Statement statement){ + System.out.println("EventHandlers.beta: method started"); + + if (cellId <= 1) { + System.out.println("EventHandlers.beta return 1"); + return; + } + + int threadId = 0; + double startX = 0, startY = 0, width = 0, height = 0; + + try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { + if (rs.next()) { + startX = rs.getDouble("START_X"); + startY = rs.getDouble("START_Y"); + width = rs.getDouble("WIDTH"); + height = rs.getDouble("HEIGHT"); + threadId = rs.getInt("THREAD_ID"); + } else { + System.out.println("EventHandlers.beta"); + System.out.println(" returning"); + return; + } + } catch (SQLException e) { + e.printStackTrace(); + } + + String getAllParentIdsQuery = "SELECT ID " + + "FROM HIGHLIGHT_ELEMENT " + + "WHERE START_X <= " + startX + " " + + "AND START_X + WIDTH >= " + (startX + width) + " " + + "AND START_Y <= " + startY + " " + + "AND START_Y + HEIGHT >= " + (startY + height) + " " + + "AND ELEMENT_ID < " + cellId + " " + + "AND COLLAPSED = 0 " + + "AND THREAD_ID = " + threadId; + + System.out.println("EventHandlers.beta: getAllParentIdsQuery: " + getAllParentIdsQuery); + + try (ResultSet getAllParentIdsRS = DatabaseUtil.select(getAllParentIdsQuery)) { + while (getAllParentIdsRS.next()) { + String updateParentHighlightsQuery = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + + "SET H.WIDTH = " + + "((SELECT MAX(H1.START_X + H1.WIDTH)" + + "FROM HIGHLIGHT_ELEMENT AS H1 " + + "WHERE H1.START_Y >= (SELECT H2.START_Y " + + "FROM HIGHLIGHT_ELEMENT AS H2 " + + "WHERE H2.ID = H.ID) " + + "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + + "FROM HIGHLIGHT_ELEMENT AS H3 " + + "WHERE H3.ID = H.ID) " + + "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + + "FROM HIGHLIGHT_ELEMENT AS H4 " + + "WHERE H4.ID = H.ID) " + + "AND H1.ID != H.ID " + + "AND H1.COLLAPSED = 0) " + + "- H.START_X) " + + "WHERE H.ID = " + getAllParentIdsRS.getInt("ID"); + + statement.addBatch(updateParentHighlightsQuery); + + System.out.println("EventHandlers.beta For cellId: " + cellId + " updateParentHighlightsQuery: " + updateParentHighlightsQuery); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + private void updateClickedCellHighlights(int clickedCellId, double y, double delta, double deltaX, Statement statement) { try { String updateParentHighlightsForClickedId = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " " + diff --git a/src/main/java/com/application/fxgraph/graph/RectangleCell.java b/src/main/java/com/application/fxgraph/graph/RectangleCell.java index b7d6df0..8604e3c 100644 --- a/src/main/java/com/application/fxgraph/graph/RectangleCell.java +++ b/src/main/java/com/application/fxgraph/graph/RectangleCell.java @@ -10,7 +10,9 @@ public class RectangleCell extends Cell { private Label idLabel; private int elementId; - public RectangleCell(int elementId, float startX, float startY, float width, float height) { + private int id; + + public RectangleCell(int id, int elementId, float startX, float startY, float width, float height) { super(String.valueOf(elementId)); this.elementId = elementId; @@ -20,7 +22,7 @@ public RectangleCell(int elementId, float startX, float startY, float width, flo rectangle = new Rectangle(width, height); rectangle.setStroke(Color.BLACK); - idLabel = new Label(String.valueOf(elementId)); + idLabel = new Label(String.valueOf(elementId) + ",id:" + id); getChildren().addAll(rectangle, idLabel); this.relocate(startX, startY); From c457528c7214333c90c9adc1b3f02c1eb4b721e4 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Sun, 31 Dec 2017 22:57:22 -0800 Subject: [PATCH 05/82] bug fixes related to children highlight width resizing --- src/main/java/com/application/Main.java | 41 +++--- .../fxgraph/graph/EventHandlers.java | 136 ++++++++++++++++-- 2 files changed, 147 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 4aae508..23a7458 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1182,8 +1182,8 @@ public class LinesInserted { private boolean firstTimeSetUpHighlightsWindowCall = true; - private Map firstCBMap; - private Map secondCBMap; + public Map firstCBMap; + public Map secondCBMap; private Map colorsMap; private boolean anyColorChange = false; @@ -1440,6 +1440,7 @@ protected void succeeded() { } private void addInsertQueryToStatement(String fullName, Statement statement, String highlightType) { + System.out.println("Main.addInsertQueryToStatement: crafting query for " + fullName); double leftOffset = 30; double rightOffset = 30; double topOffset = -10; @@ -1470,7 +1471,7 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + leftOffset + ", " + // START_Y - TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + topOffset +", " + + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + topOffset + ", " + // WIDTH (BoundBox.unitWidthFactor + rightOffset) + ", " + @@ -1546,17 +1547,17 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + topOffset + ", " + // WIDTH - // "CASE " + - // "WHEN " + TableNames.ELEMENT_TABLE + ".COLLAPSED IN (0, 2) THEN " + - "((SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + - "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + - "WHERE E1.BOUND_BOX_Y_COORDINATE >= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT " + - "AND E1.BOUND_BOX_Y_COORDINATE < " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + - "AND CT.THREAD_ID = " + threadId + " " + - "AND E1.COLLAPSED IN (0, 2) " + - ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + rightOffset + ") " + - // "ELSE " + BoundBox.unitWidthFactor + " " + - // "END " + + "CASE " + + "WHEN " + TableNames.ELEMENT_TABLE + ".COLLAPSED IN (0, 2) THEN " + + "((SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE E1.BOUND_BOX_Y_COORDINATE >= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT " + + "AND E1.BOUND_BOX_Y_COORDINATE < " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + + "AND CT.THREAD_ID = " + threadId + " " + + "AND (E1.COLLAPSED IN (0, 2) OR E1.ID = ELEMENT.ID)" + + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + rightOffset + ") " + + "ELSE " + BoundBox.unitWidthFactor + " " + + "END " + ", " + // TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_RIGHT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_LEFT + " + endOffset + "," + @@ -1574,11 +1575,11 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str // COLLAPSED "(SELECT " + - "CASE " + - "WHEN E1.COLLAPSED = 0 THEN 0 " + - "WHEN E1.COLLAPSED = 2 THEN 0 " + - "ELSE 1 " + - "END " + + "CASE " + + "WHEN E1.COLLAPSED = 0 THEN 0 " + + "WHEN E1.COLLAPSED = 2 THEN 0 " + + "ELSE 1 " + + "END " + "FROM " + TableNames.ELEMENT_TABLE + " AS E1 WHERE E1.ID = " + TableNames.ELEMENT_TABLE + ".ID) " + @@ -1594,7 +1595,7 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str String sql = highlightType.equalsIgnoreCase("SINGLE") ? sqlSingle : sqlFull; - System.out.println( "Main::addInsertQueryToStatement: sql : " + sql); + System.out.println("Main::addInsertQueryToStatement: sql : " + sql); try { statement.addBatch(sql); } catch (SQLException e) { diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 6fd3f27..9bf5958 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -515,7 +515,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { removeChildrenFromUI(Integer.parseInt(clickedCellID), nextCellId); moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, newDelta); updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, newDelta, newDeltaX); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, 1, nextCellId, threadId, lastCellId, parentId); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, true, nextCellId, threadId, lastCellId, parentId); } else if (collapsed == 2) { // MAXIMIZE SUBTREE @@ -538,7 +538,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, -newDelta, -newDeltaX); ElementDAOImpl.updateWhere("collapsed", "0", "id = " + clickedCellID); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, 0, nextCellId, threadId, lastCellId, parentId); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, false, nextCellId, threadId, lastCellId, parentId); } } } @@ -804,14 +804,14 @@ private void moveLowerTreeByDelta(String clickedCellID, double clickedCellBottom // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, int min, int nextCellId, int threadId, int lastCellId, int parentId) { + private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, boolean isCollapsed, int nextCellId, int threadId, int lastCellId, int parentId) { Statement statement = DatabaseUtil.createStatement(); Task task = new Task() { @Override protected Void call() throws Exception { // System.out.println("==================== Starting thread updateDBInBackgroundThread. ===================="); - if (min == 1) { + if (isCollapsed) { // on minimization updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, true, clickedCellId, nextCellId); } else { @@ -821,7 +821,7 @@ protected Void call() throws Exception { updateClickedCellHighlights(clickedCellId, topY, delta, deltaX, statement); - beta(clickedCellId, true, statement); + beta(clickedCellId, isCollapsed, statement, delta, nextCellId); // No upate required for single line children if (delta == 0) { @@ -832,7 +832,7 @@ protected Void call() throws Exception { } updateParentChainRecursive(clickedCellId, delta, statement); - updateAllParentHighlightsInDB(clickedCellId, topY, delta, deltaX, statement, threadId); + // updateAllParentHighlightsInDB(clickedCellId, topY, delta, deltaX, statement, threadId); statement.executeBatch(); @@ -842,6 +842,9 @@ protected Void call() throws Exception { statement.executeBatch(); } + beta2(clickedCellId, isCollapsed, statement, delta, nextCellId); + statement.executeBatch(); + Platform.runLater(() -> convertDBtoElementTree.ClearAndUpdateCellLayer()); return null; } @@ -1022,6 +1025,14 @@ private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double // System.out.println("EventHandler::updateCollapseValForSubTreeBulk: method ended"); } + private void insertHighlightsInExpandedSubTree(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId) { + + main.firstCBMap.forEach((pckgFullName, ignore) -> { + + }); + + } + private void updateCollapseValForEdgesSubTreeBulk(Statement statement, boolean isMinimized, int startCellId, int endCellId) throws SQLException { String updateEdgeQuery2; @@ -1186,9 +1197,7 @@ private void updateAllParentHighlightsInDB(int clickedCellId, double y, double d } } - private void beta(int cellId, boolean isCollapsed, Statement statement){ - System.out.println("EventHandlers.beta: method started"); - + private void beta2(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId){ if (cellId <= 1) { System.out.println("EventHandlers.beta return 1"); return; @@ -1204,6 +1213,9 @@ private void beta(int cellId, boolean isCollapsed, Statement statement){ width = rs.getDouble("WIDTH"); height = rs.getDouble("HEIGHT"); threadId = rs.getInt("THREAD_ID"); + + // System.out.println("isCollapsed: " + isCollapsed); + // System.out.println(" startX: " + startX + " startY: " + startY + " width: " + width + " height: " + height); } else { System.out.println("EventHandlers.beta"); System.out.println(" returning"); @@ -1213,6 +1225,108 @@ private void beta(int cellId, boolean isCollapsed, Statement statement){ e.printStackTrace(); } + if (!isCollapsed) { + // get all highlights that are contained within the expanded subtree. + String getAllChildrenIDsQuery2 = "SELECT ID " + + "FROM HIGHLIGHT_ELEMENT " + + "WHERE START_X >= " + startX + " " + + "AND START_X + WIDTH <= " + (startX + width) + " " + + "AND START_Y >= " + startY + " " + + "AND START_Y + HEIGHT <= " + (startY + height) + " " + + "AND ELEMENT_ID >= " + cellId + " " + + "AND COLLAPSED IN (0, 2) " + + "AND THREAD_ID = " + threadId; + + String getAllChildrenIDsQuery = "SELECT * " + + "FROM HIGHLIGHT_ELEMENT " + + "WHERE ELEMENT_ID >= " + cellId + " " + + "AND ELEMENT_ID < " + nextCellId + " " + + "AND COLLAPSED IN (0, 2) " + + "AND HIGHLIGHT_TYPE = 'FULL' " + + "AND THREAD_ID = " + threadId; + + System.out.println(" getAllChildrenIDsQuery: " + getAllChildrenIDsQuery); + + try (ResultSet getAllChildrenIdsRS = DatabaseUtil.select(getAllChildrenIDsQuery)) { + while (getAllChildrenIdsRS.next()) { + + try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + getAllChildrenIdsRS.getInt("ELEMENT_ID"))) { + if (rs.next()) { + startX = rs.getDouble("START_X"); + startY = rs.getDouble("START_Y"); + width = rs.getDouble("WIDTH"); + height = rs.getDouble("HEIGHT"); + threadId = rs.getInt("THREAD_ID"); + } + } + + // For all the highlights obtained above, adjust their widht so that the highlights cover only the visible cells. + String updatChildrenHighlightsQuery = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + + "SET H.WIDTH = " + + "((SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE E1.BOUND_BOX_Y_COORDINATE >= " + startY + " " + + "AND E1.BOUND_BOX_Y_COORDINATE < " + ( startY + height) + " " + + "AND E1.BOUND_BOX_X_COORDINATE >= " + startX + " " + + "AND CT.THREAD_ID = " + threadId + " " + + "AND E1.COLLAPSED IN (0, 2)" + + ") - H.START_X) " + + "WHERE H.ID = " + getAllChildrenIdsRS.getInt("ID"); + + // "((SELECT MAX(H1.START_X + H1.WIDTH)" + + // "FROM HIGHLIGHT_ELEMENT AS H1 " + + // "WHERE H1.START_Y >= (SELECT H2.START_Y " + + // "FROM HIGHLIGHT_ELEMENT AS H2 " + + // "WHERE H2.ID = H.ID) " + + // "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + + // "FROM HIGHLIGHT_ELEMENT AS H3 " + + // "WHERE H3.ID = H.ID) " + + // "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + + // "FROM HIGHLIGHT_ELEMENT AS H4 " + + // "WHERE H4.ID = H.ID) " + + // "AND H1.ID != H.ID " + + // "AND H1.COLLAPSED = 0) " + + // "- H.START_X) " + + // "WHERE H.ID = " + getAllChildrenIdsRS.getInt("ID"); + + statement.addBatch(updatChildrenHighlightsQuery); + + System.out.println("EventHandlers.beta For cellId: " + cellId + " updatChildrenHighlightsQuery: " + updatChildrenHighlightsQuery); + + + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + private void beta(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId){ + System.out.println("EventHandlers.beta: method started"); + + if (cellId <= 1) { + System.out.println("EventHandlers.beta return 1"); + return; + } + + int threadId = 0; + double startX = 0, startY = 0, width = 0, height = 0; + + try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { + if (rs.next()) { + startX = rs.getDouble("START_X"); + startY = rs.getDouble("START_Y"); + width = rs.getDouble("WIDTH"); + height = rs.getDouble("HEIGHT"); + threadId = rs.getInt("THREAD_ID"); + } else { + System.out.println("EventHandlers.beta returning"); + return; + } + } catch (SQLException e) { + e.printStackTrace(); + } + + // get all highlights that contain the clicked cell highlight and belong to the same thread and have element id > clicked cell id. String getAllParentIdsQuery = "SELECT ID " + "FROM HIGHLIGHT_ELEMENT " + "WHERE START_X <= " + startX + " " + @@ -1227,8 +1341,10 @@ private void beta(int cellId, boolean isCollapsed, Statement statement){ try (ResultSet getAllParentIdsRS = DatabaseUtil.select(getAllParentIdsQuery)) { while (getAllParentIdsRS.next()) { + // For all the highlights obtained above, adjust their widht and height so that the highlights cover only the visible cells. String updateParentHighlightsQuery = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + - "SET H.WIDTH = " + + "SET H.HEIGHT = HEIGHT - " + delta + ", " + + "H.WIDTH = " + "((SELECT MAX(H1.START_X + H1.WIDTH)" + "FROM HIGHLIGHT_ELEMENT AS H1 " + "WHERE H1.START_Y >= (SELECT H2.START_Y " + From 4e423f74b0ba6b70c5ec583db8f77837d1576a21 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Sat, 6 Jan 2018 15:03:18 -0800 Subject: [PATCH 06/82] more bug fixes on highlights width change --- src/main/java/com/application/Main.java | 26 +- .../fxgraph/graph/EventHandlers.java | 276 ++++++++++-------- .../fileIntegrity/CheckFileIntegrity.java | 2 +- 3 files changed, 173 insertions(+), 131 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 23a7458..ec7233a 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1441,10 +1441,10 @@ protected void succeeded() { private void addInsertQueryToStatement(String fullName, Statement statement, String highlightType) { System.out.println("Main.addInsertQueryToStatement: crafting query for " + fullName); - double leftOffset = 30; - double rightOffset = 30; - double topOffset = -10; - double bottomOffset = -20; + double startXOffset = 30; + double widthOffset = 30; + double startYOffset = -10; + double heightOffset = -20; String[] arr = fullName.split("\\."); String methodName = arr[arr.length - 1]; @@ -1468,16 +1468,16 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str "'" + highlightType + "', " + // START_X - TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + leftOffset + ", " + + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + startXOffset + ", " + // START_Y - TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + topOffset + ", " + + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + startYOffset + ", " + // WIDTH - (BoundBox.unitWidthFactor + rightOffset) + ", " + + (BoundBox.unitWidthFactor + widthOffset) + ", " + // HEIGHT - (BoundBox.unitHeightFactor + bottomOffset) + ", " + + (BoundBox.unitHeightFactor + heightOffset) + ", " + // "(" + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_RIGHT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT), " + // "(" + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT), " + @@ -1541,10 +1541,10 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str "'" + highlightType + "', " + // START_X - TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + leftOffset + ", " + + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + startXOffset + ", " + // START_Y - TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + topOffset + ", " + + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + startYOffset + ", " + // WIDTH "CASE " + @@ -1555,8 +1555,8 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str "AND E1.BOUND_BOX_Y_COORDINATE < " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + "AND CT.THREAD_ID = " + threadId + " " + "AND (E1.COLLAPSED IN (0, 2) OR E1.ID = ELEMENT.ID)" + - ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + rightOffset + ") " + - "ELSE " + BoundBox.unitWidthFactor + " " + + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + widthOffset + ") " + + "ELSE " + (BoundBox.unitWidthFactor + widthOffset) + " " + "END " + ", " + // TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_RIGHT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_LEFT + " + endOffset + "," + @@ -1568,7 +1568,7 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str // "AND E1.BOUND_BOX_Y_COORDINATE <= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + // "AND E1.BOUND_BOX_X_COORDINATE >= " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT " + // "AND CT.THREAD_ID = " + threadId + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + endOffset + ", " + - TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + bottomOffset + "," + + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_TOP_LEFT + " + heightOffset + "," + // COLOR "'" + colorsMap.getOrDefault(fullName, Color.AQUAMARINE) + "', " + diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 9bf5958..b1afae4 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -819,9 +819,9 @@ protected Void call() throws Exception { updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, false, clickedCellId, nextCellId); } - updateClickedCellHighlights(clickedCellId, topY, delta, deltaX, statement); + // updateClickedCellHighlights(clickedCellId, topY, delta, deltaX, statement); - beta(clickedCellId, isCollapsed, statement, delta, nextCellId); + updateParentHighlightsInDB(clickedCellId, isCollapsed, statement, delta, nextCellId, leftX, topY, threadId); // No upate required for single line children if (delta == 0) { @@ -842,7 +842,7 @@ protected Void call() throws Exception { statement.executeBatch(); } - beta2(clickedCellId, isCollapsed, statement, delta, nextCellId); + updateChildrenHighlightsInDB(clickedCellId, isCollapsed, statement, delta, nextCellId, threadId); statement.executeBatch(); Platform.runLater(() -> convertDBtoElementTree.ClearAndUpdateCellLayer()); @@ -1197,66 +1197,68 @@ private void updateAllParentHighlightsInDB(int clickedCellId, double y, double d } } - private void beta2(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId){ + private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId, int threadId) { + System.out.println("EventHandlers.updateChildrenHighlightsInDB: method started"); + if (cellId <= 1) { - System.out.println("EventHandlers.beta return 1"); + System.out.println("EventHandlers.updateChildrenHighlightsInDB return 1"); return; } - int threadId = 0; double startX = 0, startY = 0, width = 0, height = 0; - try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { - if (rs.next()) { - startX = rs.getDouble("START_X"); - startY = rs.getDouble("START_Y"); - width = rs.getDouble("WIDTH"); - height = rs.getDouble("HEIGHT"); - threadId = rs.getInt("THREAD_ID"); - - // System.out.println("isCollapsed: " + isCollapsed); - // System.out.println(" startX: " + startX + " startY: " + startY + " width: " + width + " height: " + height); - } else { - System.out.println("EventHandlers.beta"); - System.out.println(" returning"); - return; - } - } catch (SQLException e) { - e.printStackTrace(); - } + double startXOffset = 30; + double widthOffset = 30; + double startYOffset = -10; + double heightOffset = -20; + + // try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { + // if (rs.next()) { + // startX = rs.getDouble("START_X"); + // startY = rs.getDouble("START_Y"); + // width = rs.getDouble("WIDTH"); + // height = rs.getDouble("HEIGHT"); + // threadId = rs.getInt("THREAD_ID"); + // } else { + // System.out.println("EventHandlers.updateChildrenHighlightsInDB returning"); + // return; + // } + // } catch (SQLException e) { + // e.printStackTrace(); + // } if (!isCollapsed) { // get all highlights that are contained within the expanded subtree. - String getAllChildrenIDsQuery2 = "SELECT ID " + + // String getAllChildrenIDsQuery2 = "SELECT ID " + + // "FROM HIGHLIGHT_ELEMENT " + + // "WHERE START_X >= " + startX + " " + + // "AND START_X + WIDTH <= " + (startX + width) + " " + + // "AND START_Y >= " + startY + " " + + // "AND START_Y + HEIGHT <= " + (startY + height) + " " + + // "AND ELEMENT_ID >= " + cellId + " " + + // "AND COLLAPSED IN (0, 2) " + + // "AND THREAD_ID = " + threadId; + + String getHighlightsToResize = "SELECT * " + "FROM HIGHLIGHT_ELEMENT " + - "WHERE START_X >= " + startX + " " + - "AND START_X + WIDTH <= " + (startX + width) + " " + - "AND START_Y >= " + startY + " " + - "AND START_Y + HEIGHT <= " + (startY + height) + " " + - "AND ELEMENT_ID >= " + cellId + " " + - "AND COLLAPSED IN (0, 2) " + - "AND THREAD_ID = " + threadId; - - String getAllChildrenIDsQuery = "SELECT * " + - "FROM HIGHLIGHT_ELEMENT " + - "WHERE ELEMENT_ID >= " + cellId + " " + + "WHERE ELEMENT_ID > " + cellId + " " + "AND ELEMENT_ID < " + nextCellId + " " + "AND COLLAPSED IN (0, 2) " + "AND HIGHLIGHT_TYPE = 'FULL' " + "AND THREAD_ID = " + threadId; - System.out.println(" getAllChildrenIDsQuery: " + getAllChildrenIDsQuery); + System.out.println(" getHighlightsToResize: " + getHighlightsToResize); - try (ResultSet getAllChildrenIdsRS = DatabaseUtil.select(getAllChildrenIDsQuery)) { - while (getAllChildrenIdsRS.next()) { + try (ResultSet getHighlightsRS = DatabaseUtil.select(getHighlightsToResize)) { + while (getHighlightsRS.next()) { - try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + getAllChildrenIdsRS.getInt("ELEMENT_ID"))) { - if (rs.next()) { - startX = rs.getDouble("START_X"); - startY = rs.getDouble("START_Y"); - width = rs.getDouble("WIDTH"); - height = rs.getDouble("HEIGHT"); - threadId = rs.getInt("THREAD_ID"); + try (ResultSet elementRS = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + getHighlightsRS.getInt("ELEMENT_ID"))) { + if (elementRS.next()) { + startX = elementRS.getDouble("START_X"); + startY = elementRS.getDouble("START_Y"); + width = elementRS.getDouble("WIDTH"); + height = elementRS.getDouble("HEIGHT"); + threadId = elementRS.getInt("THREAD_ID"); } } @@ -1266,32 +1268,32 @@ private void beta2(int cellId, boolean isCollapsed, Statement statement, double "((SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + "WHERE E1.BOUND_BOX_Y_COORDINATE >= " + startY + " " + - "AND E1.BOUND_BOX_Y_COORDINATE < " + ( startY + height) + " " + + "AND E1.BOUND_BOX_Y_COORDINATE <= " + ( startY + height) + " " + "AND E1.BOUND_BOX_X_COORDINATE >= " + startX + " " + "AND CT.THREAD_ID = " + threadId + " " + "AND E1.COLLAPSED IN (0, 2)" + - ") - H.START_X) " + - "WHERE H.ID = " + getAllChildrenIdsRS.getInt("ID"); - - // "((SELECT MAX(H1.START_X + H1.WIDTH)" + - // "FROM HIGHLIGHT_ELEMENT AS H1 " + - // "WHERE H1.START_Y >= (SELECT H2.START_Y " + - // "FROM HIGHLIGHT_ELEMENT AS H2 " + - // "WHERE H2.ID = H.ID) " + - // "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + - // "FROM HIGHLIGHT_ELEMENT AS H3 " + - // "WHERE H3.ID = H.ID) " + - // "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + - // "FROM HIGHLIGHT_ELEMENT AS H4 " + - // "WHERE H4.ID = H.ID) " + - // "AND H1.ID != H.ID " + - // "AND H1.COLLAPSED = 0) " + - // "- H.START_X) " + - // "WHERE H.ID = " + getAllChildrenIdsRS.getInt("ID"); + ") - H.START_X + " + widthOffset + ") " + + "WHERE H.ID = " + getHighlightsRS.getInt("ID"); + + // "((SELECT MAX(H1.START_X + H1.WIDTH)" + + // "FROM HIGHLIGHT_ELEMENT AS H1 " + + // "WHERE H1.START_Y >= (SELECT H2.START_Y " + + // "FROM HIGHLIGHT_ELEMENT AS H2 " + + // "WHERE H2.ID = H.ID) " + + // "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + + // "FROM HIGHLIGHT_ELEMENT AS H3 " + + // "WHERE H3.ID = H.ID) " + + // "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + + // "FROM HIGHLIGHT_ELEMENT AS H4 " + + // "WHERE H4.ID = H.ID) " + + // "AND H1.ID != H.ID " + + // "AND H1.COLLAPSED = 0) " + + // "- H.START_X) " + + // "WHERE H.ID = " + getHighlightsRS.getInt("ID"); statement.addBatch(updatChildrenHighlightsQuery); - System.out.println("EventHandlers.beta For cellId: " + cellId + " updatChildrenHighlightsQuery: " + updatChildrenHighlightsQuery); + System.out.println("EventHandlers.updateChildrenHighlightsInDB For cellId: " + cellId + " updatChildrenHighlightsQuery: " + updatChildrenHighlightsQuery); } @@ -1299,75 +1301,115 @@ private void beta2(int cellId, boolean isCollapsed, Statement statement, double e.printStackTrace(); } } + System.out.println("EventHandlers.updateChildrenHighlightsInDB: method ended"); } - private void beta(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId){ - System.out.println("EventHandlers.beta: method started"); + + + private void updateParentHighlightsInDB(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId, double x, double y, int threadId){ + System.out.println("EventHandlers.updateParentHighlightsInDB: method started"); if (cellId <= 1) { - System.out.println("EventHandlers.beta return 1"); + System.out.println("EventHandlers.updateParentHighlightsInDB return 1"); return; } - int threadId = 0; - double startX = 0, startY = 0, width = 0, height = 0; - - try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { - if (rs.next()) { - startX = rs.getDouble("START_X"); - startY = rs.getDouble("START_Y"); - width = rs.getDouble("WIDTH"); - height = rs.getDouble("HEIGHT"); - threadId = rs.getInt("THREAD_ID"); - } else { - System.out.println("EventHandlers.beta returning"); - return; - } - } catch (SQLException e) { - e.printStackTrace(); - } + // int threadId = 0; + // double startX = 0, startY = 0, width = 0, height = 0; + // + // try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { + // if (rs.next()) { + // startX = rs.getDouble("START_X"); + // startY = rs.getDouble("START_Y"); + // width = rs.getDouble("WIDTH"); + // height = rs.getDouble("HEIGHT"); + // threadId = rs.getInt("THREAD_ID"); + // } else { + // System.out.println("EventHandlers.updateParentHighlightsInDB returning"); + // return; + // } + // } catch (SQLException e) { + // e.printStackTrace(); + // } - // get all highlights that contain the clicked cell highlight and belong to the same thread and have element id > clicked cell id. - String getAllParentIdsQuery = "SELECT ID " + + // String getHighlightIdsToResize = "SELECT ID " + + // "FROM HIGHLIGHT_ELEMENT " + + // "WHERE START_X <= " + startX + " " + + // "AND START_X + WIDTH >= " + (startX + width) + " " + + // "AND START_Y <= " + startY + " " + + // "AND START_Y + HEIGHT >= " + (startY + height) + " " + + // "AND ELEMENT_ID < " + cellId + " " + + // "AND COLLAPSED = 0 " + + // "AND THREAD_ID = " + threadId; + + + double startXOffset = 30; + double widthOffset = 30; + double startYOffset = -10; + double heightOffset = -20; + + // get all highlights that contain the clicked cell and belong to the same thread and have element id < clicked cell id. + // i.e., get all the parent highlights. + String getHighlightIdsToResize = "SELECT ID " + "FROM HIGHLIGHT_ELEMENT " + - "WHERE START_X <= " + startX + " " + - "AND START_X + WIDTH >= " + (startX + width) + " " + - "AND START_Y <= " + startY + " " + - "AND START_Y + HEIGHT >= " + (startY + height) + " " + - "AND ELEMENT_ID < " + cellId + " " + + "WHERE START_X <= " + (x+startXOffset) + " " + + "AND START_X + WIDTH >= " + (x+startXOffset) + " " + + "AND START_Y <= " + (y+startYOffset) + " " + + "AND START_Y + HEIGHT >= " + (y+startYOffset) + " " + + "AND ELEMENT_ID <= " + cellId + " " + "AND COLLAPSED = 0 " + + "AND HIGHLIGHT_TYPE = 'FULL' " + "AND THREAD_ID = " + threadId; - System.out.println("EventHandlers.beta: getAllParentIdsQuery: " + getAllParentIdsQuery); + System.out.println("EventHandlers.updateParentHighlightsInDB: getHighlightIdsToResize: " + getHighlightIdsToResize); - try (ResultSet getAllParentIdsRS = DatabaseUtil.select(getAllParentIdsQuery)) { - while (getAllParentIdsRS.next()) { + try (ResultSet rs = DatabaseUtil.select(getHighlightIdsToResize)) { + while (rs.next()) { // For all the highlights obtained above, adjust their widht and height so that the highlights cover only the visible cells. - String updateParentHighlightsQuery = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + - "SET H.HEIGHT = HEIGHT - " + delta + ", " + + String updateHighlightHeight = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + + "SET H.HEIGHT = HEIGHT - " + delta + " " + + "WHERE H.ID = " + rs.getInt("ID"); + + String updateHighlighWidth = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + + "SET " + + // "H.HEIGHT = HEIGHT - " + delta + ", " + "H.WIDTH = " + - "((SELECT MAX(H1.START_X + H1.WIDTH)" + - "FROM HIGHLIGHT_ELEMENT AS H1 " + - "WHERE H1.START_Y >= (SELECT H2.START_Y " + - "FROM HIGHLIGHT_ELEMENT AS H2 " + - "WHERE H2.ID = H.ID) " + - "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + - "FROM HIGHLIGHT_ELEMENT AS H3 " + - "WHERE H3.ID = H.ID) " + - "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + - "FROM HIGHLIGHT_ELEMENT AS H4 " + - "WHERE H4.ID = H.ID) " + - "AND H1.ID != H.ID " + - "AND H1.COLLAPSED = 0) " + - "- H.START_X) " + - "WHERE H.ID = " + getAllParentIdsRS.getInt("ID"); - - statement.addBatch(updateParentHighlightsQuery); - - System.out.println("EventHandlers.beta For cellId: " + cellId + " updateParentHighlightsQuery: " + updateParentHighlightsQuery); + "((SELECT MAX(E1.BOUND_BOX_X_TOP_RIGHT) FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE E1.BOUND_BOX_Y_COORDINATE >= H.START_Y " + + "AND E1.BOUND_BOX_Y_COORDINATE <= (H.START_Y + H.HEIGHT) " + + // "AND E1.BOUND_BOX_X_COORDINATE >= H.START_X " + + // "AND E1.BOUND_BOX_X_COORDINATE <= (H.START_X + H.WIDTH) " + + "AND CT.THREAD_ID = " + threadId + " " + + "AND E1.COLLAPSED IN (0, 2)" + + ") - H.START_X + " + widthOffset + ") " + + + // "((SELECT MAX(H1.START_X + H1.WIDTH)" + + // "FROM HIGHLIGHT_ELEMENT AS H1 " + + // "WHERE H1.START_Y >= (SELECT H2.START_Y " + + // "FROM HIGHLIGHT_ELEMENT AS H2 " + + // "WHERE H2.ID = H.ID) " + + // "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + + // "FROM HIGHLIGHT_ELEMENT AS H3 " + + // "WHERE H3.ID = H.ID) " + + // "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + + // "FROM HIGHLIGHT_ELEMENT AS H4 " + + // "WHERE H4.ID = H.ID) " + + // "AND H1.ID != H.ID " + + // "AND H1.COLLAPSED = 0) " + + // "- H.START_X) " + + + "WHERE H.ID = " + rs.getInt("ID"); + + statement.addBatch(updateHighlightHeight); + statement.addBatch(updateHighlighWidth); + + System.out.println("EventHandlers.updateParentHighlightsInDB For cellId: " + cellId + " updateHighlightHeight " + updateHighlightHeight); + System.out.println("EventHandlers.updateParentHighlightsInDB For cellId: " + cellId + " updateHighlighWidth: " + updateHighlighWidth); } } catch (SQLException e) { e.printStackTrace(); } + System.out.println("EventHandlers.updateParentHighlightsInDB method ends"); } private void updateClickedCellHighlights(int clickedCellId, double y, double delta, double deltaX, Statement statement) { diff --git a/src/main/java/com/application/logs/fileIntegrity/CheckFileIntegrity.java b/src/main/java/com/application/logs/fileIntegrity/CheckFileIntegrity.java index aaadacc..6a1edec 100644 --- a/src/main/java/com/application/logs/fileIntegrity/CheckFileIntegrity.java +++ b/src/main/java/com/application/logs/fileIntegrity/CheckFileIntegrity.java @@ -90,7 +90,7 @@ public static void checkFile (File file, Main.BytesRead bytesRead) { // throw new NoSuchElementException("Error occurred in line due to mismatch in count of enters and exits. " + // "Error at line: " + linesRead + "; Line is: " + line); } finally { - System.out.println("File integrity check completed. If no exceptions were thrown, then file is good."); + System.out.println("Log file integrity check completed. If no exceptions were thrown, then log file format is valid."); } } From 1c4dcbc0db91b9d97eb8bd5347875088a8ebed91 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Sun, 14 Jan 2018 07:39:07 -0800 Subject: [PATCH 07/82] Fixed highlight width error on collapsing sub children --- src/main/java/com/application/Main.java | 7 +- .../fxgraph/graph/EventHandlers.java | 85 ++++--------------- 2 files changed, 21 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index ec7233a..cdcff35 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1440,7 +1440,7 @@ protected void succeeded() { } private void addInsertQueryToStatement(String fullName, Statement statement, String highlightType) { - System.out.println("Main.addInsertQueryToStatement: crafting query for " + fullName); + // System.out.println("Main.addInsertQueryToStatement: crafting query for " + fullName); double startXOffset = 30; double widthOffset = 30; double startYOffset = -10; @@ -1555,7 +1555,8 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str "AND E1.BOUND_BOX_Y_COORDINATE < " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_Y_BOTTOM_LEFT " + "AND CT.THREAD_ID = " + threadId + " " + "AND (E1.COLLAPSED IN (0, 2) OR E1.ID = ELEMENT.ID)" + - ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + widthOffset + ") " + + // ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + widthOffset + ") " + + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT) " + "ELSE " + (BoundBox.unitWidthFactor + widthOffset) + " " + "END " + ", " + @@ -1595,7 +1596,7 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str String sql = highlightType.equalsIgnoreCase("SINGLE") ? sqlSingle : sqlFull; - System.out.println("Main::addInsertQueryToStatement: sql : " + sql); + // System.out.println("Main::addInsertQueryToStatement: sql : " + sql); try { statement.addBatch(sql); } catch (SQLException e) { diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index b1afae4..52faa07 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -469,7 +469,6 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { // ElementDAOImpl.updateWhere("collapsed", "2", "id = " + clickedCellID); - Statement statement = DatabaseUtil.createStatement(); int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); @@ -514,7 +513,7 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { removeChildrenFromUI(Integer.parseInt(clickedCellID), nextCellId); moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, newDelta); - updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, newDelta, newDeltaX); + // updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, newDelta, newDeltaX); updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, true, nextCellId, threadId, lastCellId, parentId); } else if (collapsed == 2) { @@ -811,30 +810,19 @@ private void updateDBInBackgroundThread(int clickedCellId, double topY, double b @Override protected Void call() throws Exception { // System.out.println("==================== Starting thread updateDBInBackgroundThread. ===================="); - if (isCollapsed) { - // on minimization - updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, true, clickedCellId, nextCellId); - } else { - // on maximation - updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, false, clickedCellId, nextCellId); - } - - // updateClickedCellHighlights(clickedCellId, topY, delta, deltaX, statement); - - updateParentHighlightsInDB(clickedCellId, isCollapsed, statement, delta, nextCellId, leftX, topY, threadId); + updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, isCollapsed, clickedCellId, nextCellId); // No upate required for single line children if (delta == 0) { - // System.out.println("Optimized for singel line children collapses."); + System.out.println("Optimized for single line children collapses."); + updateParentHighlightsInDB(clickedCellId, isCollapsed, statement, delta, nextCellId, leftX, topY, threadId); + statement.executeBatch(); Platform.runLater(() -> convertDBtoElementTree.ClearAndUpdateCellLayer()); return null; } updateParentChainRecursive(clickedCellId, delta, statement); - // updateAllParentHighlightsInDB(clickedCellId, topY, delta, deltaX, statement, threadId); - - statement.executeBatch(); if (nextCellId != Integer.MAX_VALUE) { // only if next lower sibling ancestor node is present. @@ -842,6 +830,7 @@ protected Void call() throws Exception { statement.executeBatch(); } + updateParentHighlightsInDB(clickedCellId, isCollapsed, statement, delta, nextCellId, leftX, topY, threadId); updateChildrenHighlightsInDB(clickedCellId, isCollapsed, statement, delta, nextCellId, threadId); statement.executeBatch(); @@ -1198,7 +1187,7 @@ private void updateAllParentHighlightsInDB(int clickedCellId, double y, double d } private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId, int threadId) { - System.out.println("EventHandlers.updateChildrenHighlightsInDB: method started"); + // System.out.println("EventHandlers.updateChildrenHighlightsInDB: method started"); if (cellId <= 1) { System.out.println("EventHandlers.updateChildrenHighlightsInDB return 1"); @@ -1212,33 +1201,8 @@ private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, State double startYOffset = -10; double heightOffset = -20; - // try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + cellId)) { - // if (rs.next()) { - // startX = rs.getDouble("START_X"); - // startY = rs.getDouble("START_Y"); - // width = rs.getDouble("WIDTH"); - // height = rs.getDouble("HEIGHT"); - // threadId = rs.getInt("THREAD_ID"); - // } else { - // System.out.println("EventHandlers.updateChildrenHighlightsInDB returning"); - // return; - // } - // } catch (SQLException e) { - // e.printStackTrace(); - // } - - if (!isCollapsed) { + if (!isCollapsed) { // get all highlights that are contained within the expanded subtree. - // String getAllChildrenIDsQuery2 = "SELECT ID " + - // "FROM HIGHLIGHT_ELEMENT " + - // "WHERE START_X >= " + startX + " " + - // "AND START_X + WIDTH <= " + (startX + width) + " " + - // "AND START_Y >= " + startY + " " + - // "AND START_Y + HEIGHT <= " + (startY + height) + " " + - // "AND ELEMENT_ID >= " + cellId + " " + - // "AND COLLAPSED IN (0, 2) " + - // "AND THREAD_ID = " + threadId; - String getHighlightsToResize = "SELECT * " + "FROM HIGHLIGHT_ELEMENT " + "WHERE ELEMENT_ID > " + cellId + " " + @@ -1247,7 +1211,7 @@ private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, State "AND HIGHLIGHT_TYPE = 'FULL' " + "AND THREAD_ID = " + threadId; - System.out.println(" getHighlightsToResize: " + getHighlightsToResize); + // System.out.println(" getHighlightsToResize: " + getHighlightsToResize); try (ResultSet getHighlightsRS = DatabaseUtil.select(getHighlightsToResize)) { while (getHighlightsRS.next()) { @@ -1275,22 +1239,6 @@ private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, State ") - H.START_X + " + widthOffset + ") " + "WHERE H.ID = " + getHighlightsRS.getInt("ID"); - // "((SELECT MAX(H1.START_X + H1.WIDTH)" + - // "FROM HIGHLIGHT_ELEMENT AS H1 " + - // "WHERE H1.START_Y >= (SELECT H2.START_Y " + - // "FROM HIGHLIGHT_ELEMENT AS H2 " + - // "WHERE H2.ID = H.ID) " + - // "AND (H1.START_Y + H1.HEIGHT) <= (SELECT H3.START_Y + H3.HEIGHT " + - // "FROM HIGHLIGHT_ELEMENT AS H3 " + - // "WHERE H3.ID = H.ID) " + - // "AND H1.THREAD_ID = (SELECT H4.THREAD_ID " + - // "FROM HIGHLIGHT_ELEMENT AS H4 " + - // "WHERE H4.ID = H.ID) " + - // "AND H1.ID != H.ID " + - // "AND H1.COLLAPSED = 0) " + - // "- H.START_X) " + - // "WHERE H.ID = " + getHighlightsRS.getInt("ID"); - statement.addBatch(updatChildrenHighlightsQuery); System.out.println("EventHandlers.updateChildrenHighlightsInDB For cellId: " + cellId + " updatChildrenHighlightsQuery: " + updatChildrenHighlightsQuery); @@ -1301,12 +1249,12 @@ private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, State e.printStackTrace(); } } - System.out.println("EventHandlers.updateChildrenHighlightsInDB: method ended"); + // System.out.println("EventHandlers.updateChildrenHighlightsInDB: method ended"); } private void updateParentHighlightsInDB(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId, double x, double y, int threadId){ - System.out.println("EventHandlers.updateParentHighlightsInDB: method started"); + // System.out.println("EventHandlers.updateParentHighlightsInDB: method started"); if (cellId <= 1) { System.out.println("EventHandlers.updateParentHighlightsInDB return 1"); @@ -1360,11 +1308,11 @@ private void updateParentHighlightsInDB(int cellId, boolean isCollapsed, Stateme "AND HIGHLIGHT_TYPE = 'FULL' " + "AND THREAD_ID = " + threadId; - System.out.println("EventHandlers.updateParentHighlightsInDB: getHighlightIdsToResize: " + getHighlightIdsToResize); + // System.out.println("EventHandlers.updateParentHighlightsInDB: getHighlightIdsToResize: " + getHighlightIdsToResize); try (ResultSet rs = DatabaseUtil.select(getHighlightIdsToResize)) { while (rs.next()) { - // For all the highlights obtained above, adjust their widht and height so that the highlights cover only the visible cells. + // For all the highlights obtained above, adjust their width and height so that the highlights cover only the visible cells. String updateHighlightHeight = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " AS H " + "SET H.HEIGHT = HEIGHT - " + delta + " " + "WHERE H.ID = " + rs.getInt("ID"); @@ -1377,10 +1325,11 @@ private void updateParentHighlightsInDB(int cellId, boolean isCollapsed, Stateme "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E1.ID_ENTER_CALL_TRACE = CT.ID " + "WHERE E1.BOUND_BOX_Y_COORDINATE >= H.START_Y " + "AND E1.BOUND_BOX_Y_COORDINATE <= (H.START_Y + H.HEIGHT) " + - // "AND E1.BOUND_BOX_X_COORDINATE >= H.START_X " + + "AND E1.BOUND_BOX_X_COORDINATE >= H.START_X " + // "AND E1.BOUND_BOX_X_COORDINATE <= (H.START_X + H.WIDTH) " + "AND CT.THREAD_ID = " + threadId + " " + - "AND E1.COLLAPSED IN (0, 2)" + + // "AND E1.COLLAPSED IN (0, 2)" + + "AND (E1.COLLAPSED = 0 OR E1.COLLAPSED = 2)" + ") - H.START_X + " + widthOffset + ") " + // "((SELECT MAX(H1.START_X + H1.WIDTH)" + @@ -1409,7 +1358,7 @@ private void updateParentHighlightsInDB(int cellId, boolean isCollapsed, Stateme } catch (SQLException e) { e.printStackTrace(); } - System.out.println("EventHandlers.updateParentHighlightsInDB method ends"); + // System.out.println("EventHandlers.updateParentHighlightsInDB method ends"); } private void updateClickedCellHighlights(int clickedCellId, double y, double delta, double deltaX, Statement statement) { From 242a85b61a2d77658ee2b4fd1a7907a88942d171 Mon Sep 17 00:00:00 2001 From: Syed Omer Khureshi Date: Sun, 14 Jan 2018 21:38:16 -0800 Subject: [PATCH 08/82] added logic for jump node --- src/main/java/com/application/Main.java | 4 +- .../fxgraph/graph/EventHandlers.java | 125 ++++++++++++++---- 2 files changed, 99 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index cdcff35..c8e1e78 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1442,7 +1442,7 @@ protected void succeeded() { private void addInsertQueryToStatement(String fullName, Statement statement, String highlightType) { // System.out.println("Main.addInsertQueryToStatement: crafting query for " + fullName); double startXOffset = 30; - double widthOffset = 30; + double widthOffset = 0; double startYOffset = -10; double heightOffset = -20; @@ -1557,7 +1557,7 @@ private void addInsertQueryToStatement(String fullName, Statement statement, Str "AND (E1.COLLAPSED IN (0, 2) OR E1.ID = ELEMENT.ID)" + // ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT + " + widthOffset + ") " + ") - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_TOP_LEFT) " + - "ELSE " + (BoundBox.unitWidthFactor + widthOffset) + " " + + "ELSE " + (BoundBox.unitWidthFactor + widthOffset) + " " + "END " + ", " + // TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_RIGHT - " + TableNames.ELEMENT_TABLE + ".BOUND_BOX_X_BOTTOM_LEFT + " + endOffset + "," + diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 52faa07..6d2e637 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -23,9 +23,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.application.fxgraph.graph.Graph.cellLayer; @@ -314,16 +312,10 @@ public void handle(MouseEvent event) { double width = graph.getScrollPane().getContent().getBoundsInLocal().getWidth(); double height = graph.getScrollPane().getContent().getBoundsInLocal().getHeight(); - // go to location. Button button = new Button(); button.setOnMouseClicked(event1 -> { - ConvertDBtoElementTree.resetRegions(); - main.showThread(targetThreadId); - Main.makeSelection(targetThreadId); - graph.moveScrollPane(xCoordinate, yCoordinate); - - System.out.println("Moving scroll pane: " + xCoordinate + " " + yCoordinate); + jumpTo(elementId, targetThreadId); }); buttonList.add(button); } @@ -400,7 +392,6 @@ public void handle(MouseEvent event) { private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { { - if (!clickable) { System.out.println(">>>>>>>>>>>>>>>>>>> Clickable is false. <<<<<<<<<<<<<<<<<<<<<"); return; @@ -491,14 +482,6 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { e.printStackTrace(); } - // try (ResultSet rs = HighlightDAOImpl.selectWhere("ELEMENT_ID = " + clickedCellID)){ - // if (rs.next()) { - // newDeltaX = rs.getFloat("WIDTH") - BoundBox.unitWidthFactor; - // System.out.println("EventHandler::onMousePressedToCollapseTree on collapse: newDeltaX: " + newDeltaX); - // } - // } catch (SQLException e) { - // e.printStackTrace(); - // } double clickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor; // deltaCache.put(clickedCellID, delta); @@ -514,7 +497,9 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { removeChildrenFromUI(Integer.parseInt(clickedCellID), nextCellId); moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, newDelta); // updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, newDelta, newDeltaX); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, newDelta, newDeltaX, true, nextCellId, threadId, lastCellId, parentId); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, + clickedCellTopRightX, newDelta, newDeltaX, true, + nextCellId, threadId, lastCellId, parentId); } else if (collapsed == 2) { // MAXIMIZE SUBTREE @@ -527,22 +512,60 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { // double delta = deltaCache.get(clickedCellID); - int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); - int lastCellId = getLowestCellInThread(threadId); + expandTreeAt(clickedCellID, parentId, threadId, newDelta, newDeltaX, + clickedCellTopLeftX, clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopRightX ); + } + } + } - double clickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor; - double newClickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor + newDelta; + private void expandTreeAt(String clickedCellID, int parentId, int threadId, double newDelta, double newDeltaX, + double clickedCellTopLeftX, double clickedCellTopLeftY, double clickedCellBoundBottomLeftY, double clickedCellTopRightX) { + int nextCellId = getNextLowerSiblingOrAncestorNode(Integer.parseInt(clickedCellID), clickedCellTopLeftX, clickedCellTopLeftY, threadId); + int lastCellId = getLowestCellInThread(threadId); + + double clickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor; + double newClickedCellBottomY = clickedCellTopLeftY + BoundBox.unitHeightFactor + newDelta; - moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, -newDelta); - updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, -newDelta, -newDeltaX); + moveLowerTreeByDelta(clickedCellID, clickedCellBottomY, -newDelta); + updateAllParentHighlightsOnUI(clickedCellID, clickedCellTopLeftX, clickedCellTopLeftY, -newDelta, -newDeltaX); + + ElementDAOImpl.updateWhere("collapsed", "0", "id = " + clickedCellID); + updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, + clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, false, + nextCellId, threadId, lastCellId, parentId); + } - ElementDAOImpl.updateWhere("collapsed", "0", "id = " + clickedCellID); - updateDBInBackgroundThread(Integer.parseInt(clickedCellID), clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopLeftX, clickedCellTopRightX, -newDelta, -newDeltaX, false, nextCellId, threadId, lastCellId, parentId); + private void expandTreeAt(String cellId, int threadId) { + String clickedCellID = cellId; + int collapsed = 0; + double clickedCellTopLeftY = 0; + double clickedCellTopLeftX = 0; + double clickedCellTopRightX = 0; + double clickedCellBoundBottomLeftY = 0; + double newDelta = 0; + double newDeltaX = 0; + int parentId = 0; + + try (ResultSet cellRS = ElementDAOImpl.selectWhere("id = " + clickedCellID)) { + if (cellRS.next()) { + collapsed = cellRS.getInt("collapsed"); + clickedCellTopLeftY = cellRS.getDouble("bound_box_y_top_left"); + clickedCellTopLeftX = cellRS.getDouble("bound_box_x_top_left"); + clickedCellTopRightX = cellRS.getDouble("bound_box_x_top_right"); + clickedCellBoundBottomLeftY = cellRS.getDouble("bound_box_y_bottom_left"); + newDelta = cellRS.getDouble("delta"); + newDeltaX = cellRS.getDouble("delta_x"); + parentId = cellRS.getInt("parent_id"); } + } catch (SQLException e) { + e.printStackTrace(); } + + expandTreeAt(clickedCellID, parentId, threadId, newDelta, newDeltaX, clickedCellTopLeftX, clickedCellTopLeftY, clickedCellBoundBottomLeftY, clickedCellTopRightX); } + private EventHandler onMousePressedToCollapseTree = new EventHandler() { @Override public void handle(MouseEvent event) { @@ -551,6 +574,52 @@ public void handle(MouseEvent event) { } }; + private void expandParentTreeChain(int cellId, int threadId) { + System.out.println("EventHandlers.expandParentTreeChain: method started"); + Deque stack = new LinkedList<>(); + + String query = "SELECT MAX(ID) AS IDS " + + "FROM " + TableNames.ELEMENT_TABLE + " " + + "WHERE ID < " + cellId + " " + + "AND BOUND_BOX_X_COORDINATE < (SELECT BOUND_BOX_X_COORDINATE " + + "FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + + "WHERE E1.ID = " + cellId + ") " + + "AND PARENT_ID > 1 " + + "AND COLLAPSED <> 0 " + + "ORDER BY IDS ASC " + + "GROUP BY BOUND_BOX_X_COORDINATE"; + + try (ResultSet rs = DatabaseUtil.select(query)) { + while (rs.next()) { + System.out.println("EventHandlers.expandParentTreeChain: expandTreeAt: " + String.valueOf(rs.getInt("IDS"))); + expandTreeAt(String.valueOf(rs.getInt("IDS")), threadId); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + System.out.println("EventHandlers.expandParentTreeChain: method ended"); + } + + private void jumpTo(int cellId, String threadId) { + System.out.println("EventHandlers.jumpTo: method started"); + expandParentTreeChain(cellId, Integer.parseInt(threadId)); + + ConvertDBtoElementTree.resetRegions(); + main.showThread(threadId); + Main.makeSelection(threadId); + + try (ResultSet rs = ElementDAOImpl.selectWhere("ID = " + cellId)){ + double xCord = rs.getDouble("BOUND_BOX_X_COORDINATE"); + double yCord = rs.getDouble("BOUND_BOX_Y_COORDINATE"); + graph.moveScrollPane(xCord, yCord); + } catch (SQLException e) { + e.printStackTrace(); + } + + System.out.println("EventHandlers.jumpTo: method ended"); + } + private int getLowestCellInThread(int threadId) { String maxEleIdQuery = "SELECT MAX(E.ID) AS MAXID " + "FROM " + TableNames.ELEMENT_TABLE + " AS E JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT " + From 76bc41405e50f34909e6229c6e8ca1d06ef03633 Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sat, 20 Jan 2018 10:26:08 -0800 Subject: [PATCH 09/82] Added .iml files to .gitignore --- .gitignore | 5 ++++- CallStackVisualization.iml | 16 ---------------- .../application/fxgraph/graph/EventHandlers.java | 11 +++++++---- src/main/main.iml | 7 ------- 4 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 CallStackVisualization.iml delete mode 100644 src/main/main.iml diff --git a/.gitignore b/.gitignore index 8facea3..55cd965 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,7 @@ target/ .idea # UI Images -*.png \ No newline at end of file +*.png + +# intelliJ files +*.iml \ No newline at end of file diff --git a/CallStackVisualization.iml b/CallStackVisualization.iml deleted file mode 100644 index 9a6c139..0000000 --- a/CallStackVisualization.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 6d2e637..f07f5bc 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -52,8 +52,8 @@ public void setCustomMouseEventHandlers(final Node node) { // ***************** // Show popup to display element details on mouse hover on an element. // node.setOnMouseEntered(onMouseHoverToShowInfoEventHandler); - // node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); - node.setOnMousePressed(onMousePressedToCollapseTree); + node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); +// node.setOnMousePressed(onMousePressedToCollapseTree); // ***************** @@ -578,7 +578,7 @@ private void expandParentTreeChain(int cellId, int threadId) { System.out.println("EventHandlers.expandParentTreeChain: method started"); Deque stack = new LinkedList<>(); - String query = "SELECT MAX(ID) AS IDS " + + String getAllParentIDsQuery = "SELECT MAX(ID) AS IDS " + "FROM " + TableNames.ELEMENT_TABLE + " " + "WHERE ID < " + cellId + " " + "AND BOUND_BOX_X_COORDINATE < (SELECT BOUND_BOX_X_COORDINATE " + @@ -589,7 +589,7 @@ private void expandParentTreeChain(int cellId, int threadId) { "ORDER BY IDS ASC " + "GROUP BY BOUND_BOX_X_COORDINATE"; - try (ResultSet rs = DatabaseUtil.select(query)) { + try (ResultSet rs = DatabaseUtil.select(getAllParentIDsQuery)) { while (rs.next()) { System.out.println("EventHandlers.expandParentTreeChain: expandTreeAt: " + String.valueOf(rs.getInt("IDS"))); expandTreeAt(String.valueOf(rs.getInt("IDS")), threadId); @@ -603,8 +603,11 @@ private void expandParentTreeChain(int cellId, int threadId) { private void jumpTo(int cellId, String threadId) { System.out.println("EventHandlers.jumpTo: method started"); + + // make changes in DB if needed expandParentTreeChain(cellId, Integer.parseInt(threadId)); + // update UI ConvertDBtoElementTree.resetRegions(); main.showThread(threadId); Main.makeSelection(threadId); diff --git a/src/main/main.iml b/src/main/main.iml deleted file mode 100644 index f4cd67e..0000000 --- a/src/main/main.iml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file From 14d913e10d83a58cf9c4e7995d5cf6442412f60d Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sat, 20 Jan 2018 15:50:19 -0800 Subject: [PATCH 10/82] Smoke testing completed for jump to node feature --- .../application/fxgraph/graph/EventHandlers.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index f07f5bc..10791ce 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -52,8 +52,8 @@ public void setCustomMouseEventHandlers(final Node node) { // ***************** // Show popup to display element details on mouse hover on an element. // node.setOnMouseEntered(onMouseHoverToShowInfoEventHandler); - node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); -// node.setOnMousePressed(onMousePressedToCollapseTree); + node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); + // node.setOnMousePressed(onMousePressedToCollapseTree); // ***************** @@ -586,8 +586,8 @@ private void expandParentTreeChain(int cellId, int threadId) { "WHERE E1.ID = " + cellId + ") " + "AND PARENT_ID > 1 " + "AND COLLAPSED <> 0 " + - "ORDER BY IDS ASC " + - "GROUP BY BOUND_BOX_X_COORDINATE"; + "GROUP BY BOUND_BOX_X_COORDINATE " + + "ORDER BY IDS ASC "; try (ResultSet rs = DatabaseUtil.select(getAllParentIDsQuery)) { while (rs.next()) { @@ -613,9 +613,11 @@ private void jumpTo(int cellId, String threadId) { Main.makeSelection(threadId); try (ResultSet rs = ElementDAOImpl.selectWhere("ID = " + cellId)){ - double xCord = rs.getDouble("BOUND_BOX_X_COORDINATE"); - double yCord = rs.getDouble("BOUND_BOX_Y_COORDINATE"); - graph.moveScrollPane(xCord, yCord); + if (rs.next()) { + double xCord = rs.getDouble("BOUND_BOX_X_COORDINATE"); + double yCord = rs.getDouble("BOUND_BOX_Y_COORDINATE"); + graph.moveScrollPane(xCord, yCord); + } } catch (SQLException e) { e.printStackTrace(); } From f0c5d654d33d6ce787af7811653b6fd1840fb897 Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sat, 20 Jan 2018 17:11:33 -0800 Subject: [PATCH 11/82] fixed bugs related to nodes in other thread disappearing after collapsing node --- .../fxgraph/graph/EventHandlers.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 10791ce..4821570 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -353,8 +353,7 @@ public void handle(MouseEvent event) { gridPane.add(button, 1, rowIndex++); } - // For debugging. - + // Collapse and Expand subtree button Button minMaxButton = new Button("min / max"); minMaxButton.setOnMouseClicked(event1 -> { if (popOver != null) { @@ -884,7 +883,7 @@ private void updateDBInBackgroundThread(int clickedCellId, double topY, double b @Override protected Void call() throws Exception { // System.out.println("==================== Starting thread updateDBInBackgroundThread. ===================="); - updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, isCollapsed, clickedCellId, nextCellId); + updateCollapseValForSubTreeBulk(topY, bottomY, rightX, statement, isCollapsed, clickedCellId, nextCellId, threadId); // No upate required for single line children if (delta == 0) { @@ -938,7 +937,7 @@ protected void failed() { // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId) { + private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId, int threadId) { // Collapsed value -> description // 0 -> visible AND uncollapsed @@ -954,20 +953,25 @@ private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double if (isMinimized) { // Update the collapse value in the subtree rooted at the clicked cell. - updateCellQuery = "UPDATE " + TableNames.ELEMENT_TABLE + " " + - "SET COLLAPSED = " + + updateCellQuery = "UPDATE " + TableNames.ELEMENT_TABLE + " AS E " + + "SET E.COLLAPSED = " + "CASE " + - "WHEN COLLAPSED <= 0 THEN COLLAPSED - 1 " + - "WHEN COLLAPSED >= 2 THEN COLLAPSED + 1 " + - "ELSE COLLAPSED " + + "WHEN E.COLLAPSED <= 0 THEN E.COLLAPSED - 1 " + + "WHEN E.COLLAPSED >= 2 THEN E.COLLAPSED + 1 " + + "ELSE E.COLLAPSED " + "END " + "WHERE " + // "(bound_box_y_coordinate >= " + topY + " " + // "AND bound_box_y_coordinate < " + bottomY + " " + // "AND bound_box_x_coordinate >= " + leftX + ") " + // "AND " + - "ID > " + startCellId + " " + - "AND ID < " + endCellId; + "E.ID > " + startCellId + " " + + "AND E.ID < " + endCellId + " " + + "AND EXISTS (SELECT * FROM " + TableNames.CALL_TRACE_TABLE + " AS CT " + + "WHERE CT.ID = E.ID_ENTER_CALL_TRACE AND " + + "CT.THREAD_ID = " + threadId + ")"; + + // and exists (select * from call_trace where id=id_enter_call_trace and thread_id=something. // System.out.println("updateCollapseValForSubTreeBulk for minimize:cell query: " + updateCellQuery); @@ -995,13 +999,13 @@ private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double "ELSE COLLAPSED " + "END " + "WHERE FK_TARGET_ELEMENT_ID IN " + - "(SELECT ELE.ID FROM " + TableNames.ELEMENT_TABLE + " AS ELE JOIN " + TableNames.EDGE_TABLE + " as EDGE " + - "ON ELE.ID = EDGE.FK_TARGET_ELEMENT_ID " + - "WHERE EDGE.FK_TARGET_ELEMENT_ID > " + startCellId + " " + - "AND EDGE.FK_TARGET_ELEMENT_ID < " + endCellId + " " + - // "AND ELE.COLLAPSED >= 0 " + - // "AND ELE.COLLAPSED <= 2" + - ")"; + "(SELECT ELE.ID FROM " + TableNames.ELEMENT_TABLE + " AS ELE JOIN " + TableNames.EDGE_TABLE + " as EDGE " + + "ON ELE.ID = EDGE.FK_TARGET_ELEMENT_ID " + + "WHERE EDGE.FK_TARGET_ELEMENT_ID > " + startCellId + " " + + "AND EDGE.FK_TARGET_ELEMENT_ID < " + endCellId + " " + + "AND ELE.COLLAPSED NOT IN (0, 2) " + + // "AND ELE.COLLAPSED <= 2" + + ")"; // System.out.println("updateCollapseValForSubTreeBulk for minimize: edge query: " + updateEdgeQuery2); From c41d0271d9c86face0978ee6506ccfd0cbafa7a5 Mon Sep 17 00:00:00 2001 From: Khureshi Date: Thu, 25 Jan 2018 21:35:11 -0800 Subject: [PATCH 12/82] fixed more bugs nodes disappearing in different threads --- .../fxgraph/graph/EventHandlers.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 4821570..0d94ce9 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -578,14 +578,17 @@ private void expandParentTreeChain(int cellId, int threadId) { Deque stack = new LinkedList<>(); String getAllParentIDsQuery = "SELECT MAX(ID) AS IDS " + - "FROM " + TableNames.ELEMENT_TABLE + " " + - "WHERE ID < " + cellId + " " + - "AND BOUND_BOX_X_COORDINATE < (SELECT BOUND_BOX_X_COORDINATE " + + "FROM " + TableNames.ELEMENT_TABLE + " AS E " + + "WHERE E.ID < " + cellId + " " + + "AND E.BOUND_BOX_X_COORDINATE < (SELECT BOUND_BOX_X_COORDINATE " + "FROM " + TableNames.ELEMENT_TABLE + " AS E1 " + "WHERE E1.ID = " + cellId + ") " + - "AND PARENT_ID > 1 " + - "AND COLLAPSED <> 0 " + - "GROUP BY BOUND_BOX_X_COORDINATE " + + "AND EXISTS (SELECT * FROM " + TableNames.CALL_TRACE_TABLE + " AS CT " + + "WHERE CT.ID = E.ID_ENTER_CALL_TRACE AND " + + "CT.THREAD_ID = " + threadId + ")" + + "AND E.PARENT_ID > 1 " + + "AND E.COLLAPSED <> 0 " + + "GROUP BY E.BOUND_BOX_X_COORDINATE " + "ORDER BY IDS ASC "; try (ResultSet rs = DatabaseUtil.select(getAllParentIDsQuery)) { @@ -1019,20 +1022,23 @@ private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double } else { - updateCellQuery = "UPDATE " + TableNames.ELEMENT_TABLE + " " + - "SET COLLAPSED = " + + updateCellQuery = "UPDATE " + TableNames.ELEMENT_TABLE + " AS E " + + "SET E.COLLAPSED = " + "CASE " + - "WHEN COLLAPSED < 0 THEN COLLAPSED + 1 " + - "WHEN COLLAPSED > 2 THEN COLLAPSED - 1 " + - "ELSE COLLAPSED " + + "WHEN E.COLLAPSED < 0 THEN E.COLLAPSED + 1 " + + "WHEN E.COLLAPSED > 2 THEN E.COLLAPSED - 1 " + + "ELSE E.COLLAPSED " + "END " + "WHERE " + // "bound_box_y_coordinate >= " + topY + " " + // "AND bound_box_y_coordinate < " + bottomY + " " + // "AND bound_box_x_coordinate >= " + leftX + " " + // "AND " + - "ID > " + startCellId + " " + - "AND ID < " + endCellId + " "; + "E.ID > " + startCellId + " " + + "AND E.ID < " + endCellId + " " + + "AND EXISTS (SELECT * FROM " + TableNames.CALL_TRACE_TABLE + " AS CT " + + "WHERE CT.ID = E.ID_ENTER_CALL_TRACE AND " + + "CT.THREAD_ID = " + threadId + ")"; // System.out.println("updateCollapseValForSubTreeBulk for mazimize: cell query: " + updateCellQuery); From 3b08c7880f3c133f76389ed25dfcdf336f448c92 Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sat, 27 Jan 2018 08:22:46 -0800 Subject: [PATCH 13/82] code cleanup - removed unneeded methods --- .../fxgraph/graph/EventHandlers.java | 317 ------------------ 1 file changed, 317 deletions(-) diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 0d94ce9..078cf52 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -36,7 +36,6 @@ public class EventHandlers { private boolean subtreeExpanded = true; private boolean posUpdated = true; - Graph graph; static Main main; @@ -564,11 +563,9 @@ private void expandTreeAt(String cellId, int threadId) { } - private EventHandler onMousePressedToCollapseTree = new EventHandler() { @Override public void handle(MouseEvent event) { - // System.out.println("Nothing happens on in EventHandler::onMousePressedToCollapseTree Event"); invokeOnMousePressedEventHandler((CircleCell) event.getSource(), Integer.valueOf(main.getCurrentSelectedThread())); } }; @@ -876,9 +873,6 @@ private void moveLowerTreeByDelta(String clickedCellID, double clickedCellBottom } - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> private void updateDBInBackgroundThread(int clickedCellId, double topY, double bottomY, double leftX, double rightX, double delta, double deltaX, boolean isCollapsed, int nextCellId, int threadId, int lastCellId, int parentId) { Statement statement = DatabaseUtil.createStatement(); @@ -937,9 +931,6 @@ protected void failed() { new Thread(task).start(); } - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId, int threadId) { // Collapsed value -> description @@ -1098,55 +1089,6 @@ private void updateCollapseValForSubTreeBulk(double topY, double bottomY, double // System.out.println("EventHandler::updateCollapseValForSubTreeBulk: method ended"); } - private void insertHighlightsInExpandedSubTree(double topY, double bottomY, double leftX, Statement statement, boolean isMinimized, int startCellId, int endCellId) { - - main.firstCBMap.forEach((pckgFullName, ignore) -> { - - }); - - } - - private void updateCollapseValForEdgesSubTreeBulk(Statement statement, boolean isMinimized, int startCellId, int endCellId) throws SQLException { - String updateEdgeQuery2; - - if (isMinimized) { - updateEdgeQuery2 = "UPDATE " + TableNames.EDGE_TABLE + " " + - "SET COLLAPSED = " + - "CASE " + - "WHEN COLLAPSED = 0 THEN 1 " + - "ELSE COLLAPSED " + - "END " + - "WHERE FK_TARGET_ELEMENT_ID IN " + - "(SELECT ELE.ID FROM " + TableNames.ELEMENT_TABLE + " AS ELE JOIN " + TableNames.EDGE_TABLE + " as EDGE " + - "ON ELE.ID = EDGE.FK_TARGET_ELEMENT_ID " + - "WHERE EDGE.FK_TARGET_ELEMENT_ID > " + startCellId + " " + - "AND EDGE.FK_TARGET_ELEMENT_ID < " + endCellId + " " + - "AND (ELE.COLLAPSED <> 0 OR ELE.COLLAPSED <> 2)" + - ")"; - } else { - - updateEdgeQuery2 = "UPDATE " + TableNames.EDGE_TABLE + " " + - "SET COLLAPSED = " + - "CASE " + - "WHEN COLLAPSED = 1 THEN 0 " + - "ELSE COLLAPSED " + - "END " + - "WHERE FK_TARGET_ELEMENT_ID IN " + - "(SELECT ELE.ID FROM " + TableNames.ELEMENT_TABLE + " AS ELE JOIN " + TableNames.EDGE_TABLE + " as EDGE " + - "ON ELE.ID = EDGE.FK_TARGET_ELEMENT_ID " + - "WHERE EDGE.FK_TARGET_ELEMENT_ID > " + startCellId + " " + - "AND EDGE.FK_TARGET_ELEMENT_ID < " + endCellId + " " + - "AND ELE.COLLAPSED = 0 " + - "AND ELE.COLLAPSED = 2" + - ")"; - } - statement.addBatch(updateEdgeQuery2); - - } - - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> private void updateTreeBelowYBulk(double y, double delta, Statement statement, int nextCellId, int lastCellId, int threadId) { // System.out.println("EventHandler::updateTreeBelowYBulk: method started"); String updateCellsQuery = "UPDATE " + TableNames.ELEMENT_TABLE + " " + @@ -1192,9 +1134,6 @@ private void updateTreeBelowYBulk(double y, double delta, Statement statement, i // System.out.println("EventHandler::updateTreeBelowYBulk: method ended."); } - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> /** * This method gets cell's BOUND_BOX_Y_BOTTOM_LEFT and calculates it's new value. * Then updates cell's BOUND_BOX_Y_BOTTOM_LEFT and BOUND_BOX_Y_BOTTOM_RIGHT values. @@ -1252,24 +1191,6 @@ else if (rectangleCell.getBoundsInParent().contains(finalX, finalY)) { }); } - private void updateAllParentHighlightsInDB(int clickedCellId, double y, double delta, double deltaX, Statement statement, int threadId) { - try { - String updateParentHighlights = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " " + - "SET HEIGHT = HEIGHT - " + delta + " " + - "WHERE START_Y <= " + y + " " + - "AND START_Y + HEIGHT >= " + y + " " + - "AND ELEMENT_ID < " + clickedCellId + " " + - "AND COLLAPSED = 0 " + - "AND THREAD_ID = " + threadId; - - statement.addBatch(updateParentHighlights); - // System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlights: " + updateParentHighlights); - - } catch (SQLException e) { - e.printStackTrace(); - } - } - private void updateChildrenHighlightsInDB(int cellId, boolean isCollapsed, Statement statement, double delta, int nextCellId, int threadId) { // System.out.println("EventHandlers.updateChildrenHighlightsInDB: method started"); @@ -1445,244 +1366,6 @@ private void updateParentHighlightsInDB(int cellId, boolean isCollapsed, Stateme // System.out.println("EventHandlers.updateParentHighlightsInDB method ends"); } - private void updateClickedCellHighlights(int clickedCellId, double y, double delta, double deltaX, Statement statement) { - try { - String updateParentHighlightsForClickedId = "UPDATE " + TableNames.HIGHLIGHT_ELEMENT + " " + - "SET HEIGHT = HEIGHT - " + delta + ", " + - "WIDTH = WIDTH - " + deltaX + " " + - "WHERE ELEMENT_ID = " + clickedCellId; - - statement.addBatch(updateParentHighlightsForClickedId); - // System.out.println("EventHandler::updateAllParentHighlightsInDB: updateParentHighlightsForClickedId: " + updateParentHighlightsForClickedId); - - } catch (SQLException e) { - e.printStackTrace(); - } - } - - // This method returns the edge update query. - // It accepts target x and y coordinate and get the source x and y coordinates. - private String getEdgePosUpdateQuery(int targetId, double endX, double endY) { - // Get the element row for source cell - String getSourceElementRow = "SELECT * FROM " + TableNames.ELEMENT_TABLE + " " + - "WHERE ID = (" + - "SELECT FK_SOURCE_ELEMENT_ID FROM " + TableNames.EDGE_TABLE + " " + - "WHERE FK_TARGET_ELEMENT_ID = " + targetId + ")"; - - String edgeUpdateQuery = null; - - try (ResultSet sourceCellRS = DatabaseUtil.select(getSourceElementRow)) { - if (sourceCellRS.next()) { - // Update edge only if it exists. Edge only exists if there is a source cell for the current cell (target cell) - // get x and y coordinates of source and target cell. The current cell is target cell. - double edgeNewStartX = sourceCellRS.getDouble("bound_box_x_coordinate"); - double edgeNewStartY = sourceCellRS.getDouble("bound_box_y_coordinate"); - double edgeNewEndX = endX; - double edgeNewEndY = endY; - - // For edges, update the pos values. - edgeUpdateQuery = "UPDATE " + TableNames.EDGE_TABLE + " " + - "SET START_X = " + edgeNewStartX + ", " + - "START_Y = " + edgeNewStartY + ", " + - "END_X = " + edgeNewEndX + ", " + - "END_Y = " + edgeNewEndY + - "WHERE FK_TARGET_ELEMENT_ID = " + targetId; - - - // System.out.println("EventHandler::getEdgePosUpdateQuery: Update query for edge: " + edgeUpdateQuery); - - } - } catch (SQLException e) { - System.out.println("SQL that threw exception: " + getSourceElementRow); - e.printStackTrace(); - } - - return edgeUpdateQuery; - } - - - private static void addEdgePosUpdateQueryToStatement(int targetId, double y, Statement statement) throws SQLException { - - - // Update the startX and startY values of all edges that start at current cell. - String updateEdgeStartPosQuery = "UPDATE " + TableNames.EDGE_TABLE + " " + - "SET START_Y = " + y + " " + - "WHERE FK_SOURCE_ELEMENT_ID = " + targetId; - - // System.out.println("EventHandler::getEdgePosUpdateQuery: Update query for edge: change of start pos: " + updateEdgeStartPosQuery); - - // Update the endX and endY values of all edges that end at current cell. - String updateEdgeEndPosQuery = "UPDATE " + TableNames.EDGE_TABLE + " " + - "SET END_Y = " + y + " " + - "WHERE FK_TARGET_ELEMENT_ID = " + targetId; - - // System.out.println("EventHandler::getEdgePosUpdateQuery: Update query for edge: change of end pos: " + updateEdgeEndPosQuery); - - statement.addBatch(updateEdgeStartPosQuery); - statement.addBatch(updateEdgeEndPosQuery); - - } - - - public void expandSubtreeAndUpdateColValsOfSubtreeRootedAt(String cellId) { - Task expandSubtree = new Task() { - @Override - protected Void call() throws Exception { - expandSubtreeAndUpdateColValsRecursive(cellId); - return null; - } - - @Override - protected void succeeded() { - super.succeeded(); - subtreeExpanded = true; - System.out.println("set subtreeExpanded: " + subtreeExpanded); - Platform.runLater(() -> setClickable()); - // System.out.println("EventHandler::updatePosValForLowerTree: Updated the entire tree successfully"); - } - - @Override - protected void failed() { - super.failed(); - System.out.println("EventHandler::updatePosValForLowerTree: Failed to update tree."); - try { - throw new Exception("updatePosValForLowerTree failed"); - } catch (Exception e) { - e.printStackTrace(); - } - } - }; - - // catch the exception in the thread. - expandSubtree.setOnFailed(event -> { - expandSubtree.getException().printStackTrace(); - }); - new Thread(expandSubtree).start(); - - - } - - public void expandSubtreeAndUpdateColValsRecursive(String cellId) { - // Get element row for this cell - try (ResultSet elementRS = ElementDAOImpl.selectWhere("id = " + cellId)) { - if (elementRS.next()) { - int collapsed = elementRS.getInt("collapsed"); - if (collapsed == 0) { - throw new IllegalStateException("Collapsed cannot be 0 here at CellID: " + cellId); - } else if (collapsed == 1) { - System.out.println(" ==> collapse 1 -> 0 at cellId: " + cellId); - ElementDAOImpl.updateWhere("collapsed", "0", "id = " + cellId); - - // Create a new circle cell and add to UI - float xCoordinateTemp = elementRS.getFloat("bound_box_x_coordinate"); - float yCoordinateTemp = elementRS.getFloat("bound_box_y_coordinate"); - CircleCell cell = new CircleCell(cellId, xCoordinateTemp, yCoordinateTemp); - Platform.runLater(() -> graph.getModel().addCell(cell)); - - - // Create a new edge and add to UI. Update edge's collapsed=0 - try (ResultSet parentRS = ElementToChildDAOImpl.selectWhere("child_id = " + cellId)) { - if (parentRS.next()) { - String parentId = String.valueOf(parentRS.getInt("parent_id")); - CircleCell parentCell = graph.getModel().getCircleCellsOnUI().get(parentId); - - Edge edge = new Edge(parentCell, cell); - - EdgeDAOImpl.updateWhere("collapsed", "0", - "fk_target_element_id = " + cellId); - - Platform.runLater(() -> graph.getModel().addEdge(edge)); - } - } - - // graph.myEndUpdate(); - Platform.runLater(() -> graph.updateCellLayer()); - - - // Recurse to this cells children - try (ResultSet childrenRS = ElementToChildDAOImpl.selectWhere("parent_id = " + cellId)) { - while (childrenRS.next()) { - String childId = String.valueOf(childrenRS.getInt("child_id")); - expandSubtreeAndUpdateColValsRecursive(childId); - } - } - - } else if (collapsed == 2) { - System.out.println(" ==> collapse 2 -> 0 at cellId: " + cellId); - - // update collapsed=0 - ElementDAOImpl.updateWhere("collapsed", "0", "id = " + cellId); - // for all children with collapsed=1, show and update collapsed=0 - try (ResultSet childrenRS = ElementToChildDAOImpl.selectWhere("parent_id = " + cellId)) { - while (childrenRS.next()) { - String childId = String.valueOf(childrenRS.getInt("child_id")); - expandSubtreeAndUpdateColValsRecursive(childId); - } - } - - } else if (collapsed == 3) { - System.out.println(" ==> collapse 3 -> 2 at cellId: " + cellId); - - // update collapsed=2 - ElementDAOImpl.updateWhere("collapsed", "2", "id = " + cellId); - - // Create new circle cell and add to UI - float xCoordinateTemp = elementRS.getFloat("bound_box_x_coordinate"); - float yCoordinateTemp = elementRS.getFloat("bound_box_y_coordinate"); - CircleCell cell = new CircleCell(cellId, xCoordinateTemp, yCoordinateTemp); - Platform.runLater(() -> graph.getModel().addCell(cell)); - - // Create a new edge and add to UI. Update edge's collapsed=0 - try (ResultSet parentRS = ElementToChildDAOImpl.selectWhere("child_id = " + cellId)) { - if (parentRS.next()) { - String parentId = String.valueOf(parentRS.getInt("parent_id")); - CircleCell parentCell = graph.getModel().getCircleCellsOnUI().get(parentId); - - Edge edge = new Edge(parentCell, cell); - EdgeDAOImpl.updateWhere("collapsed", "0", - "fk_target_element_id = " + cellId); - - Platform.runLater(() -> graph.getModel().addEdge(edge)); - - } - } - // graph.myEndUpdate(); - Platform.runLater(() -> graph.updateCellLayer()); - - // Do not recurse to children. Stop at this cell. - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - - } - - - public void updateCollapseValForSubTreeRootedAtRecursive(String cellId, List removeCircleCells, List removeEdges) { - try (ResultSet childrenRS = ElementToChildDAOImpl.selectWhere("parent_id = " + cellId)) { - try { - while (childrenRS.next()) { - String childId = String.valueOf(childrenRS.getInt("child_id")); - removeCircleCells.add(childId); - removeEdges.add(childId); - - ElementDAOImpl.updateWhere("collapsed", "1", - "id = " + childId + " AND collapsed = 0"); - ElementDAOImpl.updateWhere("collapsed", "3", - "id = " + childId + " AND collapsed = 2"); - - EdgeDAOImpl.updateWhere("collapsed", "1", - "fk_target_element_id = " + childId); - - updateCollapseValForSubTreeRootedAtRecursive(childId, removeCircleCells, removeEdges); - } - } catch (SQLException e) { - e.printStackTrace(); - } - } catch (SQLException e) { - } - } @SuppressWarnings("unused") EventHandler onMousePressedEventHandler = new EventHandler() { From 8d9961be7b36e42592bdb3ffed33a62696f8df27 Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sat, 27 Jan 2018 22:41:11 -0800 Subject: [PATCH 14/82] Added features - multiple screenshots, mouse over for info and max/min buttons, save scroll positions on thread change. --- .gitignore | 5 +- src/main/java/com/application/Main.java | 40 ++++++-- .../application/fxgraph/cells/CircleCell.java | 74 ++++++++++++--- .../fxgraph/graph/EventHandlers.java | 94 +++++++++++++++++-- 4 files changed, 179 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 55cd965..1d7fbd2 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,7 @@ target/ *.png # intelliJ files -*.iml \ No newline at end of file +*.iml + +# screenshots folder +/Screenshots/ \ No newline at end of file diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index c8e1e78..19abce4 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -42,6 +42,10 @@ import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; @@ -789,16 +793,19 @@ private void setUpThreadsView() { } - - private int imgId = 0; - private void saveUIImage() { System.out.println("In saveUIImage."); ScrollPane scrollPane = graph.getScrollPane(); WritableImage image = scrollPane.snapshot(new SnapshotParameters(), null); - File file = new File("screenshot-" + imgId + ".png"); - imgId++; + // Create screenshots folder if id doesn't exist. + File dir = new File("Screenshots"); + if (!dir.exists()) { + dir.mkdir(); + } + + String imgPath = "Screenshots" + File.separator + "screenshot-" + dir.list().length + ".png"; + File file = new File(imgPath); try { ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file); } catch (IOException e) { @@ -998,7 +1005,7 @@ private void postDatabaseLoad() { // } public void showThread(String threadId) { - System.out.println("Main::showThread: clicked thread: " + threadId); + saveScrollBarPos(Integer.valueOf(currentSelectedThread)); currentSelectedThread = threadId; // Prevent triggering listeners from modifying circleCellsOnUI, edgesOnUI and highlightsOnUI HashMaps @@ -1007,16 +1014,33 @@ public void showThread(String threadId) { // graph.getModel().uiUpdateRequired = true; convertDBtoElementTree.setCurrentThreadId(threadId); convertDBtoElementTree.clearUI(); + positionScrollBarFromHistory(Integer.valueOf(threadId)); updateUi(); // Prevent triggering listeners from modifying circleCellsOnUI, edgesOnUI and highlightsOnUI HashMaps ZoomableScrollPane.turnOnListeners(); graph.getModel().stackRectangles(); - System.out.println("Main::showThread: END"); } - public void updateUi() { + Map vScrollBarPos = new HashMap<>(); + Map hScrollBarPos = new HashMap<>(); + + private void saveScrollBarPos(int threadId) { + vScrollBarPos.put(threadId, graph.getScrollPane().getVvalue()); + hScrollBarPos.put(threadId, graph.getScrollPane().getHvalue()); + } + private void positionScrollBarFromHistory(int threadId) { + graph.getScrollPane().setVvalue(vScrollBarPos.getOrDefault(threadId, 0.0)); + if (vScrollBarPos.get(threadId) != null) { + } + graph.getScrollPane().setHvalue(hScrollBarPos.getOrDefault(threadId, 0.0)); + + if (hScrollBarPos.get(threadId) != null) { + } + } + + public void updateUi() { if (convertDBtoElementTree != null && graph != null) { // System.out.println("Main::updateUi: called by " + caller + " thread " + Thread.currentThread().getName()); BoundingBox viewPortDims = graph.getViewPortDims(); diff --git a/src/main/java/com/application/fxgraph/cells/CircleCell.java b/src/main/java/com/application/fxgraph/cells/CircleCell.java index c82f5fb..ecfed70 100644 --- a/src/main/java/com/application/fxgraph/cells/CircleCell.java +++ b/src/main/java/com/application/fxgraph/cells/CircleCell.java @@ -3,28 +3,42 @@ import com.application.fxgraph.ElementHelpers.Element; import com.application.fxgraph.graph.Cell; import javafx.geometry.Pos; +import javafx.scene.Group; import javafx.scene.control.Label; import javafx.scene.paint.Color; +import javafx.scene.shape.Arc; +import javafx.scene.shape.ArcType; import javafx.scene.shape.Circle; +import javafx.scene.text.Font; import javafx.scene.text.TextAlignment; +import org.controlsfx.glyphfont.FontAwesome; +import org.controlsfx.glyphfont.Glyph; public class CircleCell extends Cell { private Label label; - private Label idLabel; private Label methodName; private Circle circle; + private Group minMaxGroup; + private Group infoGroup; + public CircleCell(String id) { super(id); - // Uncomment to see yellow background on the whole circle cell stack pane. + // Uncomment to see a colored background on the whole circle cell stack pane. // setStyle("-fx-background-color: mediumslateblue"); circle = new Circle(20); + label = new Label("This is a long string"); - idLabel = new Label("-" + id + "-"); + // id label + Label idLabel = new Label(id); + idLabel.relocate(12, 10); + idLabel.setFont(Font.font(15)); + + // method name label methodName = new Label(""); methodName.setPrefWidth(85); methodName.setWrapText(true); @@ -35,10 +49,41 @@ public CircleCell(String id) { circle.setFill(Color.web("#6699CC")); circle.relocate(0,0); - // getChildren().setAll(circle, label); - getChildren().add(circle); - getChildren().add(methodName); - getChildren().add(idLabel); + // Min-Max button + Arc minMaxArc = new Arc(); + minMaxArc.setCenterX(20); + minMaxArc.setCenterY(20); + minMaxArc.setRadiusX(20); + minMaxArc.setRadiusY(20); + minMaxArc.setStartAngle(270); + minMaxArc.setLength(180); + minMaxArc.setType(ArcType.ROUND); + minMaxArc.setFill(Color.TRANSPARENT); + + Glyph minMaxGlyph = new Glyph("FontAwesome", FontAwesome.Glyph.EXPAND); + minMaxGlyph.setColor(Color.TRANSPARENT); + minMaxGlyph.relocate(25, 13); + + minMaxGroup = new Group(minMaxArc, minMaxGlyph); + + // info button + Arc infoArc = new Arc(); + infoArc.setCenterX(20); + infoArc.setCenterY(20); + infoArc.setRadiusX(20); + infoArc.setRadiusY(20); + infoArc.setStartAngle(90); + infoArc.setLength(180); + infoArc.setType(ArcType.ROUND); + infoArc.setFill(Color.TRANSPARENT); + + Glyph infoGlyph = new Glyph("FontAwesome", FontAwesome.Glyph.INFO_CIRCLE); + infoGlyph.setColor(Color.TRANSPARENT); + infoGlyph.relocate(5, 13); + infoGroup = new Group(infoArc, infoGlyph); + + getChildren().addAll(circle, methodName, idLabel, minMaxGroup, infoGroup); + // setView(group); this.toFront(); } @@ -58,18 +103,10 @@ public CircleCell (String id, float xCoordinate, float yCoordinate) { this.toFront(); } - public String getLabel() { - return label.getText(); - } - public void setLabel(String text) { this.label.setText(text); } - public String getMethodName() { - return methodName.getText(); - } - public void setMethodName(String methodName) { this.methodName.setText(methodName); @@ -83,6 +120,13 @@ public void setColor(Color color) { circle.setFill(color); } + public Group getMinMaxGroup() { + return minMaxGroup; + } + + public Group getInfoGroup() { + return infoGroup; + } @Override public String toString() { diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 078cf52..1a3ecaa 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -6,18 +6,23 @@ import com.application.db.DatabaseUtil; import com.application.db.TableNames; import com.application.fxgraph.cells.CircleCell; +import javafx.animation.FillTransition; import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.EventHandler; import javafx.geometry.Insets; +import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; +import javafx.scene.shape.Arc; import javafx.scene.shape.Circle; +import javafx.util.Duration; import org.controlsfx.control.PopOver; +import org.controlsfx.glyphfont.Glyph; import java.sql.Connection; import java.sql.ResultSet; @@ -51,10 +56,19 @@ public void setCustomMouseEventHandlers(final Node node) { // ***************** // Show popup to display element details on mouse hover on an element. // node.setOnMouseEntered(onMouseHoverToShowInfoEventHandler); - node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); + // node.setOnMousePressed(onMouseHoverToShowInfoEventHandler); // node.setOnMousePressed(onMousePressedToCollapseTree); // ***************** + // ((CircleCell)node).getInfoArc().setOnMouseEntered(infoEnterEventHandler); + + ((CircleCell)node).getInfoGroup().setOnMouseEntered(infoEnterEventHandler); + ((CircleCell)node).getInfoGroup().setOnMouseExited(infoExitEventHandler); + ((CircleCell)node).getInfoGroup().setOnMousePressed(onMouseHoverToShowInfoEventHandler); + + ((CircleCell)node).getMinMaxGroup().setOnMouseEntered(minMaxEnterEventHandler); + ((CircleCell)node).getMinMaxGroup().setOnMouseExited(minMaxExitEventHandler); + ((CircleCell)node).getMinMaxGroup().setOnMousePressed(onMousePressedToCollapseTree); // ***************** // For debugging. Prints all mouse events. @@ -96,7 +110,8 @@ public void handle(MouseEvent event) { } Node node = (Node) event.getSource(); - CircleCell cell = (CircleCell) node; + // CircleCell cell = (CircleCell) node; + CircleCell cell = (CircleCell) node.getParent(); String timeStamp; int methodId, processId, threadId; String parameters, packageName = "", methodName = "", parameterTypes = "", eventType, lockObjectId; @@ -355,9 +370,6 @@ public void handle(MouseEvent event) { // Collapse and Expand subtree button Button minMaxButton = new Button("min / max"); minMaxButton.setOnMouseClicked(event1 -> { - if (popOver != null) { - popOver.hide(); - } invokeOnMousePressedEventHandler(cell, threadId); } ); @@ -387,9 +399,72 @@ public void handle(MouseEvent event) { } }; + EventHandler infoEnterEventHandler = new EventHandler() { + @Override + public void handle(MouseEvent event) { + Group node = (Group) event.getSource(); + Arc arc = (Arc) node.getChildren().get(0); + Glyph glyph = ((Glyph) node.getChildren().get(1)); + + // FillTransition ftArc = new FillTransition(Duration.millis(100), arc, Color.TRANSPARENT, Color.web("#DDDDDD")); + // ftArc.setCycleCount(4); + // ftArc.setAutoReverse(true); + // ftArc.play(); + + // FillTransition ftGlyph = new FillTransition(Duration.millis(500), glyph , Color.TRANSPARENT, Color.BLACK); + // ftGlyph.setCycleCount(4); + // ftGlyph.setAutoReverse(true); + // ftGlyph.play(); + + arc.setFill(Color.web("#DDDDDD")); + glyph.setColor(Color.BLACK); + } + }; + + EventHandler infoExitEventHandler = new EventHandler() { + @Override + public void handle(MouseEvent event) { + Group node = (Group) event.getSource(); + Arc arc = (Arc) node.getChildren().get(0); + Glyph glyph = ((Glyph) node.getChildren().get(1)); + + arc.setFill(Color.TRANSPARENT); + glyph.setColor(Color.TRANSPARENT); + } + }; + + + EventHandler minMaxEnterEventHandler = new EventHandler() { + @Override + public void handle(MouseEvent event) { + Group node = (Group) event.getSource(); + Arc arc = (Arc) node.getChildren().get(0); + Glyph glyph = ((Glyph) node.getChildren().get(1)); + + arc.setFill(Color.web("#DDDDDD")); + glyph.setColor(Color.BLACK); + } + }; + + EventHandler minMaxExitEventHandler = new EventHandler() { + @Override + public void handle(MouseEvent event) { + Group node = (Group) event.getSource(); + Arc arc = (Arc) node.getChildren().get(0); + Glyph glyph = ((Glyph) node.getChildren().get(1)); + + arc.setFill(Color.TRANSPARENT); + glyph.setColor(Color.TRANSPARENT); + } + }; + private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { { + if (popOver != null) { + popOver.hide(); + } + if (!clickable) { System.out.println(">>>>>>>>>>>>>>>>>>> Clickable is false. <<<<<<<<<<<<<<<<<<<<<"); return; @@ -443,14 +518,13 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { // MINIMIZE SUBTREE // System.out.println(">>>> clicked on a collapsed = 0 cell."); - ((Circle) clickedCell.getChildren().get(0)).setFill(Color.BLUE); + // ((Circle) clickedCell.getChildren().get(0)).setFill(Color.BLUE); // ((Circle) ( (Group)cell.getView() ) // .getChildren().get(0)) // .setFill(Color.BLUE); // cell.getChildren().get(0).setStyle("-fx-background-color: blue"); // cell.setStyle("-fx-background-color: blue"); - clickedCell.setLabel("+"); main.setStatus("Please wait ......"); subtreeExpanded = true; @@ -502,9 +576,8 @@ private void invokeOnMousePressedEventHandler(CircleCell cell, int threadId) { } else if (collapsed == 2) { // MAXIMIZE SUBTREE - ((Circle) clickedCell.getChildren().get(0)).setFill(Color.RED); + // ((Circle) clickedCell.getChildren().get(0)).setFill(Color.RED); // ( (Circle) ( (Group)cell.getView() ).getChildren().get(0) ).setFill(Color.RED); - clickedCell.setLabel("-"); main.setStatus("Please wait ......"); System.out.println("====== Maximize cellId: " + clickedCellID + " ++++++ "); @@ -566,7 +639,8 @@ private void expandTreeAt(String cellId, int threadId) { private EventHandler onMousePressedToCollapseTree = new EventHandler() { @Override public void handle(MouseEvent event) { - invokeOnMousePressedEventHandler((CircleCell) event.getSource(), Integer.valueOf(main.getCurrentSelectedThread())); + CircleCell cell = ((CircleCell) ((Node) event.getSource()).getParent()); + invokeOnMousePressedEventHandler(cell, Integer.valueOf(main.getCurrentSelectedThread())); } }; From c7c41719b48ef593ea38947d6cd822ada0060338 Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sun, 28 Jan 2018 13:30:06 -0800 Subject: [PATCH 15/82] Added refresh view menu and supporting functionality --- src/main/java/com/application/Main.java | 58 ++++++++++++++++--- .../fxgraph/graph/EventHandlers.java | 24 ++++---- 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 19abce4..6bfd9a1 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -42,10 +42,6 @@ import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; @@ -55,7 +51,6 @@ public class Main extends Application { - // Main UI screen private Graph graph; Model model; @@ -114,6 +109,10 @@ public class Main extends Application { private MenuItem printEdgesMenuItem; private MenuItem printHighlightsMenuItem; + private Menu viewMenu; // View menu button + private MenuItem refreshGraphWindowMenuItem; + private Glyph refreshGraphWindowGlyph; + // Status bar private Group statusBar; private Label statusBarLabel = new Label(); @@ -320,6 +319,18 @@ private void setUpMenu() { goToMenu.setDisable(true); menuItems.add(clearHistoryMenuItem); + // ***************** + // View Menu + // ***************** + viewMenu = new Menu("View"); + refreshGraphWindowGlyph = new Glyph(font, FontAwesome.Glyph.REFRESH); + refreshGraphWindowGlyph.setColor(ColorProp.ENABLED); + refreshGraphWindowMenuItem = new MenuItem("Refresh graph widow", refreshGraphWindowGlyph); + + viewMenu.getItems().addAll(refreshGraphWindowMenuItem); + menuItems.add(refreshGraphWindowMenuItem); + glyphs.add(refreshGraphWindowGlyph); + // ***************** // Highlights Menu // ***************** @@ -339,12 +350,13 @@ private void setUpMenu() { printCellsMenuItem = new MenuItem("Print circles on canvas to console"); printEdgesMenuItem = new MenuItem("Print edges on canvas to console"); printHighlightsMenuItem = new MenuItem("Print highlights on canvas to console"); + debugMenu.getItems().addAll(printCellsMenuItem, printEdgesMenuItem, printHighlightsMenuItem); // ***************** // Main Menu // ***************** - menuBar.getMenus().addAll(fileMenu, runMenu, saveImgMenu, goToMenu, highlight, debugMenu); + menuBar.getMenus().addAll(fileMenu, runMenu, viewMenu, saveImgMenu, goToMenu, highlight, debugMenu); glyphs.addAll(Arrays.asList(methodDefnGlyph, callTraceGlyph, resetGlyph, runAnalysisGlyph, saveImgGlyph, recentsGlyph, clearHistoryGlyph, highlightItemsGlyph)); @@ -430,7 +442,9 @@ private void setUpMenuForReloads() { goToMenu.getItems().addAll(recentMenu, clearHistoryMenuItem); menuItems.add(clearHistoryMenuItem); - // Highlight method invocations menu. + // ***************** + // Highlights Menu + // ***************** highlight = new Menu("Highlights"); highlightItemsGlyph = new Glyph(font, FontAwesome.Glyph.FLAG); highlightItemsGlyph.setColor(ColorProp.ENABLED_COLORFUL); @@ -439,6 +453,18 @@ private void setUpMenuForReloads() { highlight.getItems().add(highlightMenuItem); menuItems.add(highlightMenuItem); + // ***************** + // View Menu + // ***************** + viewMenu = new Menu("View"); + refreshGraphWindowGlyph = new Glyph(font, FontAwesome.Glyph.REFRESH); + refreshGraphWindowGlyph.setColor(ColorProp.ENABLED); + refreshGraphWindowMenuItem = new MenuItem("Refresh graph widow", refreshGraphWindowGlyph); + + viewMenu.getItems().addAll(refreshGraphWindowMenuItem); + menuItems.add(refreshGraphWindowMenuItem); + glyphs.add(refreshGraphWindowGlyph); + // ***************** // Debug Menu // ***************** @@ -449,7 +475,7 @@ private void setUpMenuForReloads() { debugMenu.getItems().addAll(printCellsMenuItem, printEdgesMenuItem, printHighlightsMenuItem); // Main menu - menuBar.getMenus().addAll(fileMenu, runMenu, saveImgMenu, goToMenu, highlight, debugMenu); + menuBar.getMenus().addAll(fileMenu, runMenu, viewMenu, saveImgMenu, goToMenu, highlight, debugMenu); glyphs.addAll(Arrays.asList(methodDefnGlyph, callTraceGlyph, resetGlyph, runAnalysisGlyph, saveImgGlyph, recentsGlyph, clearHistoryGlyph, highlightItemsGlyph)); @@ -599,6 +625,10 @@ public void handle(ActionEvent event) { System.out.println("---------------------------------------------------"); }); + refreshGraphWindowMenuItem.setOnAction(event -> { + refreshGraphWindow(); + }); + // System.out.println("Main::setUpMenuActions: method ended"); } @@ -1004,6 +1034,14 @@ private void postDatabaseLoad() { // return resMap; // } + + private void refreshGraphWindow() { + System.out.println("Main.refreshGraphWindow: method started. "); + graph.getModel().uiUpdateRequired = true; + showThread(currentSelectedThread); + System.out.println("Main.refreshGraphWindow: method ended. "); + } + public void showThread(String threadId) { saveScrollBarPos(Integer.valueOf(currentSelectedThread)); currentSelectedThread = threadId; @@ -1013,9 +1051,13 @@ public void showThread(String threadId) { // graph.getModel().uiUpdateRequired = true; convertDBtoElementTree.setCurrentThreadId(threadId); + System.out.println("Main.showThread: before clear UI"); convertDBtoElementTree.clearUI(); + System.out.println("Main.showThread: before after UI"); positionScrollBarFromHistory(Integer.valueOf(threadId)); + updateUi(); + System.out.println("Main.showThread: after updateUI()"); // Prevent triggering listeners from modifying circleCellsOnUI, edgesOnUI and highlightsOnUI HashMaps ZoomableScrollPane.turnOnListeners(); diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 1a3ecaa..51932ad 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -20,6 +20,7 @@ import javafx.scene.paint.Color; import javafx.scene.shape.Arc; import javafx.scene.shape.Circle; +import javafx.scene.shape.Shape; import javafx.util.Duration; import org.controlsfx.control.PopOver; import org.controlsfx.glyphfont.Glyph; @@ -405,19 +406,15 @@ public void handle(MouseEvent event) { Group node = (Group) event.getSource(); Arc arc = (Arc) node.getChildren().get(0); Glyph glyph = ((Glyph) node.getChildren().get(1)); + Node glyphNode = node.getChildren().get(1); - // FillTransition ftArc = new FillTransition(Duration.millis(100), arc, Color.TRANSPARENT, Color.web("#DDDDDD")); - // ftArc.setCycleCount(4); - // ftArc.setAutoReverse(true); - // ftArc.play(); + FillTransition ftArc = new FillTransition(Duration.millis(50), arc, Color.TRANSPARENT, Color.web("#DDDDDD")); + ftArc.setOnFinished(e -> { + glyph.setColor(Color.BLACK); + }); - // FillTransition ftGlyph = new FillTransition(Duration.millis(500), glyph , Color.TRANSPARENT, Color.BLACK); - // ftGlyph.setCycleCount(4); - // ftGlyph.setAutoReverse(true); - // ftGlyph.play(); + ftArc.play(); - arc.setFill(Color.web("#DDDDDD")); - glyph.setColor(Color.BLACK); } }; @@ -428,8 +425,11 @@ public void handle(MouseEvent event) { Arc arc = (Arc) node.getChildren().get(0); Glyph glyph = ((Glyph) node.getChildren().get(1)); - arc.setFill(Color.TRANSPARENT); - glyph.setColor(Color.TRANSPARENT); + FillTransition ftArc = new FillTransition(Duration.millis(50), arc, Color.web("#DDDDDD"), Color.TRANSPARENT); + ftArc.setOnFinished(e -> { + glyph.setColor(Color.TRANSPARENT); + }); + ftArc.play(); } }; From b690e79db7258245c0389b299ed24aa58b2fb98c Mon Sep 17 00:00:00 2001 From: Khureshi Date: Sun, 28 Jan 2018 21:17:05 -0800 Subject: [PATCH 16/82] Added foundational logic for nav bar --- .../ConvertDBtoElementTree.java | 35 ++++++++++++++++ .../ElementHelpers/SimplifiedElement.java | 40 +++++++++++++++++++ .../fxgraph/graph/EventHandlers.java | 24 ++++++++++- .../com/application/fxgraph/graph/Model.java | 17 ++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/application/fxgraph/ElementHelpers/SimplifiedElement.java diff --git a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java index 0077634..df56064 100644 --- a/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java +++ b/src/main/java/com/application/fxgraph/ElementHelpers/ConvertDBtoElementTree.java @@ -5,9 +5,11 @@ import com.application.db.TableNames; import com.application.fxgraph.cells.CircleCell; import com.application.fxgraph.graph.*; +import com.sun.xml.internal.rngom.digested.DUnaryPattern; import javafx.application.Platform; import javafx.geometry.BoundingBox; import javafx.scene.shape.Line; +import sun.java2d.pipe.SpanShapeRenderer; import java.sql.ResultSet; import java.sql.SQLException; @@ -377,6 +379,9 @@ private void addCircleCells() { curCircleCell = new CircleCell(id, xCoordinate, yCoordinate); curCircleCell.setMethodName(methodName); model.addCell(curCircleCell); + SimplifiedElement ele = new SimplifiedElement(id, methodName); + model.addSimplifiedElementToMap(ele); + String label = ""; switch (eventType.toUpperCase()) { case "WAIT-ENTER": @@ -395,6 +400,7 @@ private void addCircleCells() { // Add parent circle cell if not already added earlier. parentCircleCell = mapCircleCellsOnUI.get(parentId); if (!mapCircleCellsOnUI.containsKey(parentId)) { + System.out.println("now you know this executes ------------------ "); try (ResultSet rsTemp = ElementDAOImpl.selectWhere("id = " + parentId)) { if (rsTemp.next() && rsTemp.getInt("LEVEL_COUNT") > 1) { float xCoordinateTemp = rsTemp.getFloat("bound_box_x_coordinate"); @@ -405,6 +411,33 @@ private void addCircleCells() { } } } + + + // 1 -> 2 -> 3 + String pId = String.valueOf(rs.getInt("PARENT_ID")); + SimplifiedElement childSE = ele, parentSE; + try { + while (Integer.valueOf(pId) != -1) { + System.out.println("stuck here pId: " + pId + "------"); + String q = "SELECT * FROM " + TableNames.ELEMENT_TABLE + " AS E " + + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT " + + "ON E.ID_ENTER_CALL_TRACE = CT.ID " + + "WHERE E.ID = " + pId; + ResultSet pRS = DatabaseUtil.select(q); + if (pRS.next()) { + String mName = pRS.getString("MESSAGE"); + parentSE = new SimplifiedElement(pId, mName); + childSE.setParentElement(parentSE); + pId = String.valueOf(pRS.getInt("PARENT_ID")); + childSE = parentSE; + } else { + pId = "-1"; + } + } + System.out.println("out ------"); + } catch (SQLException e) { + e.printStackTrace(); + } } // else { // curCircleCell = mapCircleCellsOnUI.get(id); @@ -488,6 +521,8 @@ private void removeCircleCells(BoundingBox preloadBox) { CircleCell cell = entry.getValue(); if (!preloadBox.contains(cell.getLayoutX(), cell.getLayoutY())) { removeCircleCells.add(cell.getCellId()); + + model.removeSimplifiedElementFromMap(cell.getCellId()); } } diff --git a/src/main/java/com/application/fxgraph/ElementHelpers/SimplifiedElement.java b/src/main/java/com/application/fxgraph/ElementHelpers/SimplifiedElement.java new file mode 100644 index 0000000..56d72d8 --- /dev/null +++ b/src/main/java/com/application/fxgraph/ElementHelpers/SimplifiedElement.java @@ -0,0 +1,40 @@ +package com.application.fxgraph.ElementHelpers; + +import java.util.List; + +public class SimplifiedElement { + + private SimplifiedElement parentElement; + private String elementId; + private String methodName; + private List children; + + public SimplifiedElement(String elementId, String methodName) { + this.elementId = elementId; + this.methodName = methodName; + } + + public SimplifiedElement getParentElement() { + return parentElement; + } + + public void setParentElement(SimplifiedElement parentElement) { + this.parentElement = parentElement; + } + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } +} diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 51932ad..69a370b 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -5,6 +5,7 @@ import com.application.db.DAOImplementation.*; import com.application.db.DatabaseUtil; import com.application.db.TableNames; +import com.application.fxgraph.ElementHelpers.SimplifiedElement; import com.application.fxgraph.cells.CircleCell; import javafx.animation.FillTransition; import javafx.application.Platform; @@ -24,6 +25,7 @@ import javafx.util.Duration; import org.controlsfx.control.PopOver; import org.controlsfx.glyphfont.Glyph; +import sun.java2d.pipe.SpanShapeRenderer; import java.sql.Connection; import java.sql.ResultSet; @@ -61,7 +63,7 @@ public void setCustomMouseEventHandlers(final Node node) { // node.setOnMousePressed(onMousePressedToCollapseTree); // ***************** - // ((CircleCell)node).getInfoArc().setOnMouseEntered(infoEnterEventHandler); + node.setOnMouseEntered(onMouseEnterToShowNav); ((CircleCell)node).getInfoGroup().setOnMouseEntered(infoEnterEventHandler); ((CircleCell)node).getInfoGroup().setOnMouseExited(infoExitEventHandler); @@ -392,6 +394,26 @@ public void handle(MouseEvent event) { } }; + EventHandler onMouseEnterToShowNav = new EventHandler() { + @Override + public void handle(MouseEvent event) { + CircleCell cell = ((CircleCell) event.getSource()); + SimplifiedElement ele = graph.getModel().getSimplifiedElementMap().get(cell.getCellId()); + + ArrayList methodNames = new ArrayList<>(); + while (ele.getParentElement() != null) { + methodNames.add("Id: " + ele.getElementId() + " Method: " + ele.getMethodName()); + System.out.println("at id: " + ele.getElementId()); + ele = ele.getParentElement(); + } + + Collections.reverse(methodNames); + String navString = String.join(" > ", methodNames); + System.out.println("-----------------hover over: " + cell.getCellId() + "------------------------------- "); + System.out.println(navString); + } + }; + EventHandler onMouseExitToDismissPopover = new EventHandler() { @Override public void handle(MouseEvent event) { diff --git a/src/main/java/com/application/fxgraph/graph/Model.java b/src/main/java/com/application/fxgraph/graph/Model.java index c1fd02a..aed4489 100644 --- a/src/main/java/com/application/fxgraph/graph/Model.java +++ b/src/main/java/com/application/fxgraph/graph/Model.java @@ -1,6 +1,7 @@ package com.application.fxgraph.graph; import com.application.fxgraph.ElementHelpers.Element; +import com.application.fxgraph.ElementHelpers.SimplifiedElement; import com.application.fxgraph.cells.CircleCell; import com.application.fxgraph.cells.RectangleCell; import com.application.fxgraph.cells.TriangleCell; @@ -31,6 +32,7 @@ public class Model { private Map highlightsOnUI = new HashMap<>(); + private Map simplifiedElementMap = new HashMap<>(); public Model() { graphParent = new Cell("_ROOT_"); @@ -66,6 +68,20 @@ public void stackRectangles() { // System.out.println("fronting end ======================================================================"); } + public void addSimplifiedElementToMap(SimplifiedElement element) { + simplifiedElementMap.put(element.getElementId(), element); + } + + public void removeSimplifiedElementFromMap(String elementId) { + if (simplifiedElementMap.get(elementId) != null) { + simplifiedElementMap.remove(elementId); + } + } + + public Map getSimplifiedElementMap() { + return simplifiedElementMap; + } + public void addCell(CircleCell circleCell) { // circleCell.toFront(); // circleCell.setTranslateZ(10); @@ -75,6 +91,7 @@ public void addCell(CircleCell circleCell) { circleCellsOnUI.put(circleCell.getCellId(), circleCell); // System.out.println( "Model::addCell: circleCellsOnUI.size() " +circleCellsOnUI.size()); listCircleCellsOnUI.add(circleCell); + } // } } From 8957fc9df6c5cb67bb9b5fc4e90a8f0e49039a3b Mon Sep 17 00:00:00 2001 From: Khureshi Date: Mon, 29 Jan 2018 09:27:18 -0800 Subject: [PATCH 17/82] Added foundational logic for bookmarks --- src/main/java/com/application/Main.java | 74 +++++++++-- .../DAOImplementation/BookmarksDAOImpl.java | 120 ++++++++++++++++++ .../java/com/application/db/DatabaseUtil.java | 1 + .../java/com/application/db/TableNames.java | 1 + .../com/application/db/model/Bookmark.java | 78 ++++++++++++ .../fxgraph/graph/EventHandlers.java | 32 +++-- .../com/application/fxgraph/graph/Graph.java | 5 + 7 files changed, 287 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/application/db/DAOImplementation/BookmarksDAOImpl.java create mode 100644 src/main/java/com/application/db/model/Bookmark.java diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 6bfd9a1..60d222b 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -100,7 +100,7 @@ public class Main extends Application { private MenuItem clearHistoryMenuItem; private Glyph clearHistoryGlyph; - private Menu highlight; + private Menu highlightMenu; private MenuItem highlightMenuItem; private Glyph highlightItemsGlyph; @@ -113,6 +113,11 @@ public class Main extends Application { private MenuItem refreshGraphWindowMenuItem; private Glyph refreshGraphWindowGlyph; + private Menu bookmarksMenu; // Bookmarks menu button + private Menu bookmarksSubMenu; + private Glyph bookmarksGlyph; + + // Status bar private Group statusBar; private Label statusBarLabel = new Label(); @@ -334,15 +339,27 @@ private void setUpMenu() { // ***************** // Highlights Menu // ***************** - highlight = new Menu("Highlights"); + highlightMenu = new Menu("Highlights"); highlightItemsGlyph = new Glyph(font, FontAwesome.Glyph.FLAG); highlightItemsGlyph.setColor(ColorProp.ENABLED); highlightMenuItem = new MenuItem("Highlight method invocations", highlightItemsGlyph); - highlight.getItems().add(highlightMenuItem); - highlight.setDisable(true); + highlightMenu.getItems().add(highlightMenuItem); + highlightMenu.setDisable(true); menuItems.add(highlightMenuItem); + // ***************** + // Bookmarks Menu + // ***************** + bookmarksMenu = new Menu("Bookmarks"); + bookmarksGlyph = new Glyph(font, FontAwesome.Glyph.BOOKMARK); + bookmarksSubMenu = new Menu("Bookmarks", bookmarksGlyph); + + bookmarksMenu.getItems().add(bookmarksSubMenu); + bookmarksMenu.setDisable(true); + menuItems.add(bookmarksMenu); + glyphs.add(bookmarksGlyph); + // ***************** // Debug Menu // ***************** @@ -356,7 +373,7 @@ private void setUpMenu() { // ***************** // Main Menu // ***************** - menuBar.getMenus().addAll(fileMenu, runMenu, viewMenu, saveImgMenu, goToMenu, highlight, debugMenu); + menuBar.getMenus().addAll(fileMenu, runMenu, viewMenu, saveImgMenu, goToMenu, highlightMenu, debugMenu); glyphs.addAll(Arrays.asList(methodDefnGlyph, callTraceGlyph, resetGlyph, runAnalysisGlyph, saveImgGlyph, recentsGlyph, clearHistoryGlyph, highlightItemsGlyph)); @@ -445,14 +462,26 @@ private void setUpMenuForReloads() { // ***************** // Highlights Menu // ***************** - highlight = new Menu("Highlights"); + highlightMenu = new Menu("Highlights"); highlightItemsGlyph = new Glyph(font, FontAwesome.Glyph.FLAG); highlightItemsGlyph.setColor(ColorProp.ENABLED_COLORFUL); highlightMenuItem = new MenuItem("Highlight method invocations", highlightItemsGlyph); - highlight.getItems().add(highlightMenuItem); + highlightMenu.getItems().add(highlightMenuItem); menuItems.add(highlightMenuItem); + // ***************** + // Bookmarks Menu + // ***************** + bookmarksMenu = new Menu("Bookmarks"); + bookmarksGlyph = new Glyph(font, FontAwesome.Glyph.BOOKMARK); + bookmarksSubMenu = new Menu("Bookmarks", bookmarksGlyph); + + bookmarksMenu.getItems().add(bookmarksSubMenu); + bookmarksMenu.setDisable(true); + menuItems.add(bookmarksMenu); + glyphs.add(bookmarksGlyph); + // ***************** // View Menu // ***************** @@ -475,7 +504,7 @@ private void setUpMenuForReloads() { debugMenu.getItems().addAll(printCellsMenuItem, printEdgesMenuItem, printHighlightsMenuItem); // Main menu - menuBar.getMenus().addAll(fileMenu, runMenu, viewMenu, saveImgMenu, goToMenu, highlight, debugMenu); + menuBar.getMenus().addAll(fileMenu, runMenu, viewMenu, saveImgMenu, goToMenu, highlightMenu, debugMenu); glyphs.addAll(Arrays.asList(methodDefnGlyph, callTraceGlyph, resetGlyph, runAnalysisGlyph, saveImgGlyph, recentsGlyph, clearHistoryGlyph, highlightItemsGlyph)); @@ -539,7 +568,7 @@ private void setUpMenuActions() { saveImgMenu.setDisable(false); goToMenu.setDisable(false); - highlight.setDisable(false); + highlightMenu.setDisable(false); } }); @@ -598,6 +627,8 @@ public void handle(ActionEvent event) { // highlightMenuItem.setOnAction(event -> setUpMethodsWindow()); highlightMenuItem.setOnAction(event -> setUpHighlightsWindow()); + bookmarksSubMenu.setOnAction(event -> showBookmarks()); + printCellsMenuItem.setOnAction(event -> { System.out.println("-----------Cells on canvas ------------------------"); graph.getModel().getCircleCellsOnUI().keySet().stream().sorted(Comparator.comparingInt(Integer::valueOf)).forEach(id -> { @@ -632,6 +663,25 @@ public void handle(ActionEvent event) { // System.out.println("Main::setUpMenuActions: method ended"); } + private void showBookmarks() { + bookmarksSubMenu.getItems().clear(); + BookmarksDAOImpl.getBookmarks().forEach((id, bookmark) -> { + MenuItem bookmarkMenuItem = new MenuItem( + "Id:" + bookmark.getElementId() + + " method:" + bookmark.getMethodName() + + " thread:" + bookmark.getThreadId()); + + bookmarksSubMenu.getItems().add(bookmarkMenuItem); + + bookmarkMenuItem.setOnAction(event -> { + System.out.println("Main.showBookmarks: jumpTo: elementId: " + bookmark.getElementId() ); + graph.getEventHandlers().jumpTo(Integer.valueOf(bookmark.getElementId()), bookmark.getThreadId()); + }); + + }); + + } + public String getCurrentSelectedThread() { return currentSelectedThread; } @@ -728,7 +778,7 @@ public void setUpNavigationBar() { // Get its element id. Get its parent id. // Get clicked cell's parent cell coordinates. // scroll to parent. - // highlight parent. + // highlightMenu parent. // Go To First child. // When an element is clicked. Highlight it. @@ -738,7 +788,7 @@ public void setUpNavigationBar() { // Get its element id. Get its child's id. // Get clicked cell's child cell coordinates. // scroll to child - // highlight parent. + // highlightMenu parent. }); @@ -1708,7 +1758,7 @@ private void updateColors(Statement statement) { private void resetHighlights() { // firstTimeSetUpMethodsWindowCall = true; firstTimeSetUpHighlightsWindowCall = true; - highlight.setDisable(true); + highlightMenu.setDisable(true); } } \ No newline at end of file diff --git a/src/main/java/com/application/db/DAOImplementation/BookmarksDAOImpl.java b/src/main/java/com/application/db/DAOImplementation/BookmarksDAOImpl.java new file mode 100644 index 0000000..afd1d7e --- /dev/null +++ b/src/main/java/com/application/db/DAOImplementation/BookmarksDAOImpl.java @@ -0,0 +1,120 @@ +package com.application.db.DAOImplementation; + +import com.application.db.DatabaseUtil; +import com.application.db.TableNames; +import com.application.db.model.Bookmark; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; + +public class BookmarksDAOImpl { + + public static boolean isTableCreated() { + return DatabaseUtil.isTableCreated(TableNames.BOOKMARKS); + } + + public static void createTable() { + if (!isTableCreated()) { + try (Connection c = DatabaseUtil.getConnection(); Statement ps = c.createStatement()) { + String sql = "CREATE TABLE " + TableNames.BOOKMARKS + " (" + + "id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), " + + "element_id INT, " + + "color VARCHAR(10), " + + "collapsed INT" + + ")"; + ps.execute(sql); + System.out.println("** Creating table " + TableNames.HIGHLIGHT_ELEMENT); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + public static void dropTable() { + if (isTableCreated()) { + try (Connection c = DatabaseUtil.getConnection(); Statement ps = c.createStatement()) { + String sql = "DROP TABLE " + TableNames.BOOKMARKS; + System.out.println(">> Dropping table " + TableNames.HIGHLIGHT_ELEMENT); + ps.execute(sql); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + static Connection conn; + static Statement ps; + static String sql; + + public static ResultSet selectWhere(String where) { + if (!isTableCreated()) + createTable(); + + try { + conn = DatabaseUtil.getConnection(); + ps = conn.createStatement(); + sql = "SELECT * FROM " + TableNames.BOOKMARKS + " WHERE " + where; + ResultSet resultSet = ps.executeQuery(sql); + return resultSet; + } catch (SQLException e) { + System.out.println("Line that threw error: " + sql); + e.printStackTrace(); + } + throw new IllegalStateException("No results for the select query. " + sql); + } + + public static void updateWhere(String columnName, String columnValue, String where) { + if (isTableCreated()) { + try { + conn = DatabaseUtil.getConnection(); + ps = conn.createStatement(); + sql = "UPDATE " + TableNames.BOOKMARKS + + " SET " + columnName + " = " + columnValue + + " WHERE " + where; + ps.executeUpdate(sql); + return; + } catch (SQLException e) { + System.out.println("Line that threw error: " + sql); + e.printStackTrace(); + } + } + throw new IllegalStateException("Table does not exist. Hence cannot fetch any rows from it."); + + } + + public static Map getBookmarks() { + Map result = new HashMap<>(); + String query = "SELECT * FROM " + TableNames.BOOKMARKS + " AS B " + + "JOIN " + TableNames.ELEMENT_TABLE + " AS E ON B.ELEMENT_ID = E.ID " + + "JOIN " + TableNames.CALL_TRACE_TABLE + " AS CT ON E.ID_ENTER_CALL_TRACE = CT.ID "; + + try (ResultSet rs = DatabaseUtil.select(query)) { + while (rs.next()) { + result.put(rs.getString("B.ID"), + new Bookmark( + rs.getString("B.ID"), + rs.getString("E.ID"), + rs.getString("CT.THREAD_ID"), + rs.getString("CT.MESSAGE"), + rs.getString("B.COLOR"), + rs.getDouble("E.BOUND_BOX_X_COORDINATE"), + rs.getDouble("E.BOUND_BOX_Y_COORDINATE") + )); + } + } catch (SQLException e) { + System.out.println("Query that threw exception: " + query); + e.printStackTrace(); + } + return result; + } + + public static void insertBookmark(Bookmark bookmark) { + + } + + +} diff --git a/src/main/java/com/application/db/DatabaseUtil.java b/src/main/java/com/application/db/DatabaseUtil.java index b1a0a61..07771f5 100644 --- a/src/main/java/com/application/db/DatabaseUtil.java +++ b/src/main/java/com/application/db/DatabaseUtil.java @@ -372,6 +372,7 @@ public static void resetDB() { EdgeDAOImpl.dropTable(); HighlightDAOImpl.dropTable(); FilesDAOImpl.dropTable(); + BookmarksDAOImpl.dropTable(); CallTraceDAOImpl.createTable(); MethodDefnDAOImpl.createTable(); diff --git a/src/main/java/com/application/db/TableNames.java b/src/main/java/com/application/db/TableNames.java index cf828bd..8e22127 100644 --- a/src/main/java/com/application/db/TableNames.java +++ b/src/main/java/com/application/db/TableNames.java @@ -7,5 +7,6 @@ public class TableNames { public static final String ELEMENT_TO_CHILD_TABLE = "ELEMENT_TO_CHILD"; public static final String EDGE_TABLE = "EDGE_ELEMENT"; public static final String HIGHLIGHT_ELEMENT = "HIGHLIGHT_ELEMENT"; + public static final String BOOKMARKS = "BOOKMARKS"; public static final String FILES_TABLE = "FILES"; } diff --git a/src/main/java/com/application/db/model/Bookmark.java b/src/main/java/com/application/db/model/Bookmark.java new file mode 100644 index 0000000..4d4df80 --- /dev/null +++ b/src/main/java/com/application/db/model/Bookmark.java @@ -0,0 +1,78 @@ +package com.application.db.model; + +public class Bookmark { + + private String id; + private String elementId; + private String threadId; + private String methodName; + private String color; + private double xCoordinate; + private double yCoordinate; + + public Bookmark(String id, String elementId, String threadId, String methodName, String color, double xCoordinate, double yCoordinate) { + this.id = id; + this.elementId = elementId; + this.threadId = threadId; + this.methodName = methodName; + this.color = color; + this.xCoordinate = xCoordinate; + this.yCoordinate = yCoordinate; + } + + public String getThreadId() { + return threadId; + } + + public void setThreadId(String threadId) { + this.threadId = threadId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public double getxCoordinate() { + return xCoordinate; + } + + public void setxCoordinate(double xCoordinate) { + this.xCoordinate = xCoordinate; + } + + public double getyCoordinate() { + return yCoordinate; + } + + public void setyCoordinate(double yCoordinate) { + this.yCoordinate = yCoordinate; + } +} diff --git a/src/main/java/com/application/fxgraph/graph/EventHandlers.java b/src/main/java/com/application/fxgraph/graph/EventHandlers.java index 69a370b..c33f7b3 100644 --- a/src/main/java/com/application/fxgraph/graph/EventHandlers.java +++ b/src/main/java/com/application/fxgraph/graph/EventHandlers.java @@ -116,7 +116,7 @@ public void handle(MouseEvent event) { // CircleCell cell = (CircleCell) node; CircleCell cell = (CircleCell) node.getParent(); String timeStamp; - int methodId, processId, threadId; + int elementId, methodId, processId, threadId; String parameters, packageName = "", methodName = "", parameterTypes = "", eventType, lockObjectId; double xCord, yCord; @@ -138,6 +138,7 @@ public void handle(MouseEvent event) { // try (ResultSet callTraceRS = CallTraceDAOImpl.selectWhere("id = (Select id_enter_call_trace FROM " + TableNames.ELEMENT_TABLE + // " WHERE id = " + cell.getCellId() + ")")) { if (callTraceRS.next()) { + elementId = callTraceRS.getInt(TableNames.ELEMENT_TABLE + ".ID"); timeStamp = callTraceRS.getString("time_instant"); methodId = callTraceRS.getInt("method_id"); processId = callTraceRS.getInt("process_id"); @@ -235,8 +236,8 @@ public void handle(MouseEvent event) { try (ResultSet elementRS = ElementDAOImpl.selectWhere("id_enter_call_trace = " + ctId)) { // Expecting to see a single row. if (elementRS.next()) { - int elementId = elementRS.getInt("id"); - eleIdList.add(elementId); + int eId = elementRS.getInt("id"); + eleIdList.add(eId); } } } else if (eventType.equalsIgnoreCase("NOTIFY-ENTER")) { @@ -269,8 +270,8 @@ public void handle(MouseEvent event) { try (ResultSet elementRS = ElementDAOImpl.selectWhere("id_exit_call_trace = " + ctId)) { // Expecting to see a single row. if (elementRS.next()) { - int elementId = elementRS.getInt("id"); - eleIdList.add(elementId); + int eId = elementRS.getInt("id"); + eleIdList.add(eId); } } } @@ -302,8 +303,8 @@ public void handle(MouseEvent event) { try (ResultSet elementRS = ElementDAOImpl.selectWhere("id_exit_call_trace = " + id)) { // Can be more than a single row. while (elementRS.next()) { - int elementId = elementRS.getInt("id"); - eleIdList.add(elementId); + int eId = elementRS.getInt("id"); + eleIdList.add(eId); } } catch (SQLException e) { } @@ -314,13 +315,13 @@ public void handle(MouseEvent event) { List