76 |
|
|
77 |
Cell searchStart; |
Cell searchStart; |
78 |
|
|
79 |
|
/** The current set of marks. |
80 |
|
* Each marked cell is represented as a <code>gzz.view.Mark</code> |
81 |
|
* object. We don't have support for multiple mark sets yet. |
82 |
|
*/ |
83 |
|
java.util.List marks = new ArrayList(); |
84 |
|
|
85 |
|
/** The set of all marked cells. |
86 |
|
* This is the set of all cells in the <code>Mark</code> objects |
87 |
|
* of <code>marks</code>. We need this because going through |
88 |
|
* the whole list for all cells on the screen scales badly. |
89 |
|
* We want to be able to have big mark sets. |
90 |
|
*/ |
91 |
|
public Set markedCells = new HashSet(); |
92 |
|
|
93 |
public FallbackBinder(Fallback fallback) { |
public FallbackBinder(Fallback fallback) { |
94 |
this.fallback = fallback; |
this.fallback = fallback; |
95 |
} |
} |
105 |
if(dbg) pa("Dir: "+dim+" "+dir+" '"+n+"'"); |
if(dbg) pa("Dir: "+dim+" "+dir+" '"+n+"'"); |
106 |
switch(directOp) { |
switch(directOp) { |
107 |
case NONE: if(n != null) w.cursor = n; break; |
case NONE: if(n != null) w.cursor = n; break; |
108 |
case CONNECT: dims[dim].connect(w.cursor, dir, other.cursor); break; |
case CONNECT: |
109 |
|
if(marks.isEmpty()) |
110 |
|
dims[dim].connect(w.cursor, dir, other.cursor); |
111 |
|
else { |
112 |
|
c = w.cursor; |
113 |
|
for(Iterator i=marks.iterator(); i.hasNext();) { |
114 |
|
Mark m = (Mark)i.next(); |
115 |
|
c.connect(dims[dim], dir, m.cell); |
116 |
|
c = m.cell; |
117 |
|
} |
118 |
|
marks = new ArrayList(); |
119 |
|
markedCells = new HashSet(); |
120 |
|
} |
121 |
|
break; |
122 |
case DISCONNECT: dims[dim].disconnect(w.cursor, dir); break; |
case DISCONNECT: dims[dim].disconnect(w.cursor, dir); break; |
123 |
case HOP: dims[dim].hop(w.cursor, dir); break; |
case HOP: dims[dim].hop(w.cursor, dir); break; |
124 |
case NEW: w.cursor = w.cursor.N(dims[dim], dir); break; |
case NEW: w.cursor = w.cursor.N(dims[dim], dir); break; |
149 |
directOp = op; |
directOp = op; |
150 |
} |
} |
151 |
|
|
152 |
|
void mark(int win) { |
153 |
|
Cell c = fallback.windows[win].cursor; |
154 |
|
boolean there = false; |
155 |
|
|
156 |
|
for(Iterator i=marks.iterator(); i.hasNext();) { |
157 |
|
Mark m = (Mark)i.next(); |
158 |
|
if(m.cell.equals(c)) { |
159 |
|
i.remove(); |
160 |
|
markedCells.remove(m.cell); |
161 |
|
there = true; |
162 |
|
} |
163 |
|
} |
164 |
|
|
165 |
|
if(!there) { |
166 |
|
marks.add(new Mark(c)); |
167 |
|
markedCells.add(c); |
168 |
|
} |
169 |
|
} |
170 |
|
|
171 |
boolean save() { |
boolean save() { |
172 |
try { |
try { |
173 |
gzz.slices.SliceSpace sp = (gzz.slices.SliceSpace)fallback.space; |
gzz.slices.SliceSpace sp = (gzz.slices.SliceSpace)fallback.space; |
282 |
case 'Z': rotate(0, 2, 1); break; |
case 'Z': rotate(0, 2, 1); break; |
283 |
|
|
284 |
// Special |
// Special |
285 |
|
case 'm': mark(1); break; |
286 |
|
case 'M': mark(0); break; |
287 |
case 'v': changeView(1, 1); break; |
case 'v': changeView(1, 1); break; |
288 |
case 'V': changeView(0, 1); break; |
case 'V': changeView(0, 1); break; |
289 |
case 'r': |
case 'r': |