Skip to content

Commit 3e2bb76

Browse files
committed
most of the way through implementing hiding changes of unattached links... what a headache! (Every time I touch ModeVersions it's a headache though so I should have known...)
1 parent 1254541 commit 3e2bb76

File tree

6 files changed

+282
-124
lines changed

6 files changed

+282
-124
lines changed

src/org/argmap/client/ModeVersions.java

Lines changed: 101 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.argmap.client.ArgMapService.NodeChangesMaps;
1212
import org.argmap.client.ArgMapService.NodeChangesMapsAndRootChanges;
1313
import org.argmap.client.ArgMapService.NodeWithChanges;
14+
import org.argmap.client.Change.ChangeType;
1415

1516
import com.google.gwt.dom.client.Style;
1617
import com.google.gwt.dom.client.Style.Unit;
@@ -372,7 +373,8 @@ private SortedMultiMap<Date, ViewChange> prepTreeWithDeletedNodesAndChangesAndBu
372373
for (int i = 0; i < treeClone.getItemCount(); i++) {
373374
ViewPropVer viewPropVer = (ViewPropVer) treeClone.getItem(i);
374375
recursivePrepAndBuild(viewPropVer, timeMachineMap, changesMaps, log);
375-
recursiveHideLinkedSubtreesDuringUnlinkedPeriods(viewPropVer);
376+
recursiveHideLinkedSubtreesDuringUnlinkedPeriods(viewPropVer,
377+
new TimePeriods());
376378
}
377379
log.finish();
378380
return timeMachineMap;
@@ -499,20 +501,109 @@ private void loadChangesIntoNodeAndMap(ViewNodeVer viewNode,
499501
}
500502
}
501503

502-
public void recursiveHideLinkedSubtreesDuringUnlinkedPeriods(
503-
ViewNodeVer viewPNodeVer, List list) {
504+
/*
505+
* TODO still need to make alwaysHidden Changes actually hidden when
506+
* building the change list.
507+
*
508+
* TODO this just does the initial hide... need to redo this every time the
509+
* user opens and loads unloaded children for the first time... right?
510+
*
511+
* TODO explain what this function does in a comment here
512+
*/
513+
private void recursiveHideLinkedSubtreesDuringUnlinkedPeriods(
514+
ViewNodeVer viewNodeVer, TimePeriods hidePeriods) {
515+
if (viewNodeVer instanceof ViewDummyVer) {
516+
return;
517+
}
518+
519+
List<ViewChange> viewChangeList = viewNodeVer.getViewChangeList();
520+
504521
// hide all changes of this node that occur within a period in list
522+
for (ViewChange viewChange : viewChangeList) {
523+
if (hidePeriods.covers(viewChange.change.date)) {
524+
viewChange.alwaysHidden = true;
525+
}
526+
}
505527

506-
// * for each child node
528+
if (viewNodeVer instanceof ViewArgVer) {
529+
// sort the node's viewChangeList
530+
Collections.sort(viewChangeList, ViewChange.DATE_COMPARATOR);
507531

508-
// * * if this is an argument and the child is a linked node
509-
// * * * build a list of periods that the node is unlinked
510-
// * * * build a newList of periods that the node is unlinked including
511-
// * * * * those from the argument and those from the list just build
532+
/*
533+
* start building more restrictive hidePeriods for the children that
534+
* need them
535+
*/
536+
Map<Long, TimePeriods> newPeriods = new HashMap<Long, TimePeriods>();
537+
Map<Long, ViewChange> lastChanges = new HashMap<Long, ViewChange>();
538+
for (ViewChange viewChange : viewChangeList) {
539+
Long propID = viewChange.change.propID;
540+
if (viewChange.change.changeType == ChangeType.PROP_LINK) {
541+
542+
TimePeriods newPeriod = newPeriods.get(propID);
543+
if (newPeriod == null) {
544+
newPeriod = hidePeriods.copy();
545+
newPeriods.put(propID, newPeriod);
546+
}
512547

513-
// * * recursiveHideLinkedSubtreesDuringUnlinkedPeriods( either list or
514-
// * * * newList)
548+
ViewChange lastViewChange = lastChanges.get(propID);
549+
if (lastViewChange != null
550+
&& lastViewChange.change.changeType == ChangeType.PROP_UNLINK) {
551+
newPeriod.addPeriod(lastViewChange.change.date,
552+
viewChange.change.date);
553+
} else {
554+
newPeriod.addPeriod(TimePeriods.THIRTY_YEARS_AGO,
555+
viewChange.change.date);
556+
}
515557

558+
lastChanges.put(propID, viewChange);
559+
} else if (viewChange.change.changeType == ChangeType.PROP_UNLINK) {
560+
lastChanges.put(propID, viewChange);
561+
}
562+
}
563+
564+
// for each child node
565+
for (ViewNodeVer child : new ViewNodeVer.CombinedViewIterator(
566+
viewNodeVer)) {
567+
Long propID = child.getNodeID();
568+
569+
/*
570+
* finish building a more restrictive hide period if this child
571+
* needs it
572+
*/
573+
ViewChange lastViewChange = lastChanges.get(propID);
574+
if (lastViewChange != null
575+
&& lastViewChange.change.changeType == ChangeType.PROP_UNLINK) {
576+
TimePeriods newPeriod = newPeriods.get(propID);
577+
if (newPeriod == null) {
578+
newPeriod = hidePeriods.copy();
579+
newPeriods.put(propID, newPeriod);
580+
}
581+
/*
582+
* we got here because lastChanges for propID was never set
583+
* to a Change of type PROP_LINK, which means we had a
584+
* PROP_UNLINK with no following link, which means that all
585+
* subsequent changes should be hidden. So we add a hide
586+
* period from the last change to 100 years from now.
587+
*/
588+
newPeriod.addPeriod(lastViewChange.change.date,
589+
TimePeriods.ONE_HUNDRED_YEARS_FROM_NOW);
590+
}
591+
592+
if (newPeriods.containsKey(propID)) {
593+
recursiveHideLinkedSubtreesDuringUnlinkedPeriods(child,
594+
newPeriods.get(propID));
595+
} else {
596+
recursiveHideLinkedSubtreesDuringUnlinkedPeriods(child,
597+
hidePeriods);
598+
}
599+
}
600+
} else {
601+
for (ViewNodeVer child : new ViewNodeVer.CombinedViewIterator(
602+
viewNodeVer)) {
603+
recursiveHideLinkedSubtreesDuringUnlinkedPeriods(child,
604+
hidePeriods);
605+
}
606+
}
516607
}
517608

518609
private void loadVersionListFromTimeMachine() {

src/org/argmap/client/TimePeriods.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public void addPeriod(Date start, Date end) {
156156
* because it comes after the previous start and before the marked end,
157157
* therefore return true.
158158
*/
159-
public boolean inPeriod(Date date) {
159+
public boolean covers(Date date) {
160160
for (Marker marker : periods) {
161161
if (date.before(marker.date)) {
162162
if (marker.start) {
@@ -179,6 +179,14 @@ public TimePeriods copy() {
179179
return new TimePeriods(new ArrayList<Marker>(periods));
180180
}
181181

182+
private static long YEAR_IN_MILLIS = 365 * 24 * 60 * 60 * 1000;
183+
184+
public static Date THIRTY_YEARS_AGO = new Date(System.currentTimeMillis()
185+
- 30 * YEAR_IN_MILLIS);
186+
187+
public static Date ONE_HUNDRED_YEARS_FROM_NOW = new Date(
188+
System.currentTimeMillis() + 100 * YEAR_IN_MILLIS);
189+
182190
/******************************************************
183191
* TEST METHODS (COMMENT THESE OUT WHEN NOT TESTING ) *
184192
******************************************************/

src/org/argmap/client/ViewArgVer.java

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,20 @@
99

1010
import org.argmap.client.ArgMapService.NodeChangesMaps;
1111

12-
1312
public class ViewArgVer extends ViewArg implements ViewNodeVer {
1413
public List<ViewChange> viewChanges = new ArrayList<ViewChange>();
1514
public Map<Long, ViewNodeVer> deletedViews = new HashMap<Long, ViewNodeVer>();
1615
public Date closedDate;
17-
18-
public Date getClosedDate(){
16+
17+
public Date getClosedDate() {
1918
return closedDate;
2019
}
21-
22-
public void setClosedDate( Date closedDate ){
20+
21+
public void setClosedDate(Date closedDate) {
2322
this.closedDate = closedDate;
2423
}
25-
26-
public ViewArgVer(){
24+
25+
public ViewArgVer() {
2726
super();
2827
textBox.setReadOnly(true);
2928
}
@@ -45,59 +44,56 @@ public void removeAndSaveChildView(Long id) {
4544

4645
public void reviveDeletedView(Long id, int index) {
4746
ViewNode viewNode = (ViewNode) deletedViews.remove(id);
48-
assert viewNode != null ;
47+
assert viewNode != null;
4948
insertItem(index, viewNode);
5049
}
5150

52-
// public ViewPropVer createDeletedView(Long id) {
53-
// /*
54-
// * this view is just empty; can set to false, because real value will be
55-
// * set before it is used when the time machine goes back in time...
56-
// */
57-
// ViewPropVer deletedView = new ViewPropVer(id);
58-
// deletedView.setState(true);
59-
// deletedViews.put(id, deletedView);
60-
// return deletedView;
61-
// }
62-
51+
// public ViewPropVer createDeletedView(Long id) {
52+
// /*
53+
// * this view is just empty; can set to false, because real value will be
54+
// * set before it is used when the time machine goes back in time...
55+
// */
56+
// ViewPropVer deletedView = new ViewPropVer(id);
57+
// deletedView.setState(true);
58+
// deletedViews.put(id, deletedView);
59+
// return deletedView;
60+
// }
61+
6362
@Override
64-
public ViewNode createChild(){
63+
public ViewNode createChild() {
6564
return new ViewPropVer();
6665
}
67-
66+
6867
@Override
6968
public ViewNodeVer createChild(Node node) {
70-
return new ViewPropVer( (Proposition) node );
69+
return new ViewPropVer((Proposition) node);
7170
}
72-
71+
7372
@Override
7473
public ViewNodeVer createChild(Long nodeID) {
75-
return new ViewPropVer( nodeID );
74+
return new ViewPropVer(nodeID);
7675
}
77-
78-
public void addDeletedItem( ViewNodeVer viewNodeVer ){
76+
77+
public void addDeletedItem(ViewNodeVer viewNodeVer) {
7978
assert viewNodeVer.getNodeID() != null;
80-
deletedViews.put( viewNodeVer.getNodeID(), viewNodeVer );
81-
79+
deletedViews.put(viewNodeVer.getNodeID(), viewNodeVer);
80+
8281
}
83-
82+
8483
/*
85-
@Override
86-
public ViewNodeVer createDeletedDummyView(Long id) {
87-
ViewDummyVer deletedView = new ViewDummyVer(id);
88-
deletedViews.put(id, deletedView );
89-
return deletedView;
90-
}
91-
*/
84+
* @Override public ViewNodeVer createDeletedDummyView(Long id) {
85+
* ViewDummyVer deletedView = new ViewDummyVer(id); deletedViews.put(id,
86+
* deletedView ); return deletedView; }
87+
*/
9288

9389
public List<ViewChange> getViewChangeList() {
9490
return viewChanges;
9591
}
96-
97-
public List<ViewChange> getViewChangeHideList(){
92+
93+
public List<ViewChange> getViewChangeHideList() {
9894
List<ViewChange> list = new ArrayList<ViewChange>();
99-
for( ViewChange viewChange : viewChanges ){
100-
switch( viewChange.change.changeType ){
95+
for (ViewChange viewChange : viewChanges) {
96+
switch (viewChange.change.changeType) {
10197
case PROP_ADDITION:
10298
case PROP_DELETION:
10399
case PROP_LINK:
@@ -110,7 +106,7 @@ public List<ViewChange> getViewChangeHideList(){
110106
assert false;
111107
break;
112108
case ARG_MODIFICATION:
113-
//do nothing
109+
// do nothing
114110
break;
115111
}
116112
}
@@ -120,8 +116,8 @@ public List<ViewChange> getViewChangeHideList(){
120116
public ViewNodeVer getChildViewNode(int i) {
121117
return (ViewNodeVer) getChild(i);
122118
}
123-
124-
public Collection<ViewNodeVer> getDeletedViewList(){
119+
120+
public Collection<ViewNodeVer> getDeletedViewList() {
125121
return deletedViews.values();
126122
}
127123

@@ -133,7 +129,5 @@ public NodeChanges chooseNodeChanges(NodeChangesMaps changesMaps) {
133129
@Override
134130
public void clearDeletedViews() {
135131
deletedViews.clear();
136-
137132
}
138-
139133
}

src/org/argmap/client/ViewChange.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.argmap.client;
22

3+
import java.util.Comparator;
4+
35
public class ViewChange {
46
Change change;
57
ViewNodeVer viewNode;
@@ -11,4 +13,13 @@ public String toString() {
1113
return "change: " + change + "; viewNode:" + viewNode + "; hidden:"
1214
+ hidden + "; alwaysHidden:" + alwaysHidden;
1315
}
16+
17+
public static final Comparator<ViewChange> DATE_COMPARATOR = new Comparator<ViewChange>() {
18+
19+
@Override
20+
public int compare(ViewChange first, ViewChange second) {
21+
return first.change.date.compareTo(second.change.date);
22+
}
23+
24+
};
1425
}

0 commit comments

Comments
 (0)