Skip to content

Commit a4b259f

Browse files
committed
Merge pull request #79 from ProgrammingLife3/newDetailView
Made DetailView scrollable!
2 parents b9ac14a + 3b1a111 commit a4b259f

File tree

2 files changed

+85
-66
lines changed

2 files changed

+85
-66
lines changed

src/main/java/tudelft/ti2806/pl3/controls/MouseManager.java

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.graphstream.ui.swingViewer.View;
66
import org.graphstream.ui.swingViewer.util.DefaultMouseManager;
77
import tudelft.ti2806.pl3.data.wrapper.WrapperClone;
8-
import tudelft.ti2806.pl3.detailView.DetailView;
8+
import tudelft.ti2806.pl3.detailview.DetailView;
99

1010
import java.awt.BorderLayout;
1111
import java.awt.event.MouseEvent;
@@ -18,8 +18,9 @@
1818
public class MouseManager extends DefaultMouseManager {
1919
private static final int MARGIN = 5;
2020

21-
WrapperClone node = null;
22-
DetailView detailView;
21+
private WrapperClone node = null;
22+
private DetailView detailView;
23+
private boolean clicked = false;
2324

2425
public MouseManager() {
2526
detailView = new DetailView();
@@ -31,9 +32,28 @@ public void init(GraphicGraph graph, View view) {
3132
view.setLayout(null);
3233
}
3334

35+
@Override
36+
public void mouseClicked(MouseEvent e) {
37+
super.mouseClicked(e);
38+
int x = e.getX();
39+
int y = e.getY();
40+
41+
WrapperClone clickedNode = getNodeAtPosition(x, y);
42+
if (clickedNode == null) {
43+
clicked = false;
44+
removeDetailView();
45+
} else {
46+
clicked = true;
47+
showDetailView(clickedNode, x, y);
48+
}
49+
}
50+
3451
@Override
3552
public void mouseMoved(MouseEvent e) {
3653
super.mouseMoved(e);
54+
if (clicked) {
55+
return;
56+
}
3757
int x = e.getX();
3858
int y = e.getY();
3959
mouseMoved(x, y);
@@ -47,18 +67,22 @@ public void mouseMoved(MouseEvent e) {
4767
* y location of the mouse cursor.
4868
*/
4969
public void mouseMoved(int x, int y) {
50-
ArrayList<GraphicElement> graphicElements = view.allNodesOrSpritesIn(x - MARGIN, y - MARGIN, x + MARGIN, y + MARGIN);
51-
if (graphicElements.size() == 0) {
70+
node = getNodeAtPosition(x, y);
71+
if (node == null) {
5272
removeDetailView();
73+
} else {
74+
showDetailView(node, x, y);
75+
}
76+
}
77+
78+
private WrapperClone getNodeAtPosition(int x, int y) {
79+
ArrayList<GraphicElement> graphicElements =
80+
view.allNodesOrSpritesIn(x - MARGIN, y - MARGIN, x + MARGIN, y + MARGIN);
81+
if (graphicElements.size() == 0) {
82+
return null;
5383
} else {
5484
GraphicElement element = graphicElements.get(0);
55-
WrapperClone wrapper = element.getAttribute("node", WrapperClone.class);
56-
if (node != wrapper) {
57-
node = wrapper;
58-
view.add(detailView, BorderLayout.WEST);
59-
detailView.setNode(node, x, y);
60-
view.updateUI();
61-
}
85+
return element.getAttribute("node", WrapperClone.class);
6286
}
6387
}
6488

@@ -70,4 +94,10 @@ public void removeDetailView() {
7094
view.remove(detailView);
7195
view.updateUI();
7296
}
97+
98+
private void showDetailView(WrapperClone node, int x, int y) {
99+
view.add(detailView, BorderLayout.WEST);
100+
detailView.setNode(node, x, y);
101+
view.updateUI();
102+
}
73103
}

src/main/java/tudelft/ti2806/pl3/detailView/DetailView.java renamed to src/main/java/tudelft/ti2806/pl3/detailview/DetailView.java

Lines changed: 43 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,49 @@
1-
package tudelft.ti2806.pl3.detailView;
1+
package tudelft.ti2806.pl3.detailview;
22

33
import tudelft.ti2806.pl3.data.wrapper.WrapperClone;
44

5-
import java.awt.Component;
65
import java.awt.Container;
76
import java.awt.Dimension;
7+
import java.util.Arrays;
8+
import java.util.Collection;
9+
import java.util.Comparator;
810
import java.util.HashSet;
911
import java.util.Iterator;
1012
import java.util.Set;
1113
import javax.swing.BorderFactory;
1214
import javax.swing.BoxLayout;
1315
import javax.swing.JLabel;
16+
import javax.swing.JList;
1417
import javax.swing.JPanel;
18+
import javax.swing.JScrollPane;
19+
import javax.swing.ListSelectionModel;
1520

1621
/**
1722
* This view is added when more details about a node are needed.
1823
* @author mathieu
1924
*/
2025
public class DetailView extends JPanel {
2126
private static final int BORDER = 10;
22-
private static final int MAX_ROWS = 5;
2327
private static final int POSITION_OFFSET = 30;
28+
public static final String REF_GENOME = "REF";
29+
30+
/**
31+
* Custom string comparator to prioritize the TKK_REF genome string.
32+
*/
33+
private Comparator<String> comparator = (o1, o2) -> {
34+
if (o1.contains(REF_GENOME)) {
35+
return -1;
36+
} else if (o2.contains(REF_GENOME)) {
37+
return 1;
38+
}
39+
return o1.compareTo(o2);
40+
};
2441

2542
/**
2643
* Constructs a DetailView and set a border and the preferred layout.
2744
*/
2845
public DetailView() {
29-
BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS);
46+
BoxLayout layout = new BoxLayout(this, BoxLayout.X_AXIS);
3047
setLayout(layout);
3148
setBorder(BorderFactory.createEmptyBorder(BORDER, BORDER, BORDER, BORDER));
3249
}
@@ -43,67 +60,39 @@ public DetailView() {
4360
public void setNode(WrapperClone node, int x, int y) {
4461
removeAll();
4562

46-
Set<String> genomes = new HashSet<>();
47-
node.getGenome().forEach(genome -> genomes.add(genome.getIdentifier()));
48-
addLabels("Genomes:", genomes, "TKK_REF");
49-
50-
if (node.getLabels().size() > 0) {
51-
add(" ");
52-
}
53-
54-
Set<String> labels = new HashSet<>();
55-
node.getLabels().forEach(label -> labels.add(label.getText()));
56-
addLabels("Labels:", labels);
63+
addList(node.getGenome(), "Genomes: ");
64+
addList(node.getLabels(), "Labels: ");
5765

5866
Dimension size = getPreferredSize();
5967
setBounds(x, y, size.width, size.height);
6068
}
6169

6270
/**
63-
* Same as addLabels(String, Set, String) but without a filter.
64-
*/
65-
private void addLabels(String title, Set<String> set) {
66-
addLabels(title, set, null);
67-
}
68-
69-
/**
70-
* Add JLabels for every object in the given set.
71+
* Adds a collection as a scrollable list to itself.
72+
* @param collection
73+
* the collection to be added as list.
7174
* @param title
72-
* Label to be displayed above the list of labels.
73-
* @param set
74-
* The set of objects to be displayed in the list.
75-
* @param filter
76-
* A string that will always be displayed if found in the set.
75+
* if not null, this string will be added above the list as header.
7776
*/
78-
private void addLabels(String title, Set<String> set, String filter) {
79-
if (set.size() > 0) {
80-
add(title);
77+
private void addList(Collection collection, String title) {
78+
if (collection.size() == 0) {
79+
return;
8180
}
82-
83-
Iterator<String> iterator = set.iterator();
84-
int i = 0;
85-
while (iterator.hasNext()) {
86-
String nextString = iterator.next();
87-
if (filter != null && filter.equals(nextString)) {
88-
filter = null;
89-
if (i >= MAX_ROWS) {
90-
add(nextString);
91-
i++;
92-
break;
93-
}
94-
}
95-
if (i < MAX_ROWS) {
96-
add(nextString);
97-
i++;
98-
}
81+
Set<String> stringSet = new HashSet<>(collection.size());
82+
Iterator iterator = collection.iterator();
83+
for (int i = 0; i < collection.size(); i++) {
84+
stringSet.add(iterator.next().toString());
9985
}
100-
if (i < set.size()) {
101-
add("...");
86+
String[] array = stringSet.toArray(new String[stringSet.size()]);
87+
Arrays.sort(array, comparator);
88+
JList<Object> list = new JList<>(array);
89+
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
90+
list.setLayoutOrientation(JList.VERTICAL);
91+
JScrollPane listScroller = new JScrollPane(list);
92+
if (title != null) {
93+
listScroller.setColumnHeaderView(new JLabel(title));
10294
}
103-
}
104-
105-
public Component add(String label) {
106-
return super.add(new JLabel(label));
95+
add(listScroller);
10796
}
10897

10998
@Override

0 commit comments

Comments
 (0)