1 33 34 package edu.rice.cs.drjava.ui; 35 36 import java.util.Vector ; 37 import java.util.ArrayList ; 38 import java.util.Enumeration ; 39 40 import javax.swing.*; 41 import javax.swing.event.*; 42 import javax.swing.tree.*; 43 import javax.swing.table.*; 44 import javax.swing.text.BadLocationException ; 45 import java.awt.event.*; 46 import java.awt.*; 47 import javax.swing.text.BadLocationException ; 48 import javax.swing.text.Position ; 49 50 import edu.rice.cs.drjava.model.RegionManager; 51 import edu.rice.cs.drjava.model.RegionManagerListener; 52 import edu.rice.cs.drjava.model.DocumentRegion; 53 import edu.rice.cs.drjava.model.OpenDefinitionsDocument; 54 import edu.rice.cs.drjava.config.*; 55 import edu.rice.cs.util.swing.Utilities; 56 import edu.rice.cs.util.UnexpectedException; 57 58 64 public class BrowserHistoryPanel extends RegionsListPanel<DocumentRegion> { 65 protected JButton _backButton; 66 protected JButton _forwardButton; 67 protected JButton _goToButton; 68 protected JButton _removeButton; 69 protected JButton _removeAllButton; 70 protected AbstractAction _backAction; 71 protected AbstractAction _forwardAction; 72 73 77 public BrowserHistoryPanel(MainFrame frame) { 78 super(frame, "Browser History"); 79 _model.getBrowserHistoryManager().addListener(new RegionManagerListener<DocumentRegion>() { 80 public void regionAdded(DocumentRegion r, int index) { 81 addRegion(r, index); 82 _list.ensureIndexIsVisible(index); 83 } 84 public void regionChanged(DocumentRegion r, int index) { 85 regionRemoved(r); 86 regionAdded(r, index); 87 } 88 public void regionRemoved(DocumentRegion r) { 89 removeRegion(r); 90 } 91 }); 92 } 93 94 95 protected void performDefaultAction() { 96 goToRegion(); 97 } 98 99 100 protected void goToRegion() { 101 ArrayList <DocumentRegion> r = getSelectedRegions(); 102 if (r.size() == 1) { 103 _model.getBrowserHistoryManager().setCurrentRegion(r.get(0)); 104 updateButtons(); 105 RegionListUserObj<DocumentRegion> userObj = getUserObjForRegion(r.get(0)); 106 if (userObj!=null) { _list.ensureIndexIsVisible(_listModel.indexOf(userObj)); } 107 _frame.scrollToDocumentAndOffset(r.get(0).getDocument(), r.get(0).getStartOffset(), false, false); 108 } 109 } 110 111 112 protected void backRegion() { 113 RegionManager rm = _model.getBrowserHistoryManager(); 114 115 _frame.addToBrowserHistory(); 117 118 DocumentRegion r = rm.prevCurrentRegion(); 120 updateButtons(); 121 RegionListUserObj<DocumentRegion> userObj = getUserObjForRegion(r); 122 if (userObj!=null) { _list.ensureIndexIsVisible(_listModel.indexOf(userObj)); } 123 _frame.scrollToDocumentAndOffset(r.getDocument(), r.getStartOffset(), false, false); 124 } 125 126 127 protected void forwardRegion() { 128 RegionManager rm = _model.getBrowserHistoryManager(); 129 130 _frame.addToBrowserHistory(); 132 133 DocumentRegion r = rm.nextCurrentRegion(); 135 updateButtons(); 136 RegionListUserObj<DocumentRegion> userObj = getUserObjForRegion(r); 137 if (userObj!=null) { _list.ensureIndexIsVisible(_listModel.indexOf(userObj)); } 138 _frame.scrollToDocumentAndOffset(r.getDocument(), r.getStartOffset(), false, false); 139 } 140 141 142 AbstractAction getBackAction() { 143 return _backAction; 144 } 145 146 147 AbstractAction getForwardAction() { 148 return _forwardAction; 149 } 150 151 152 protected JComponent[] makeButtons() { 153 _backAction = new AbstractAction("Back") { 154 public void actionPerformed(ActionEvent ae) { 155 backRegion(); 156 } 157 }; 158 _backButton = new JButton(_backAction); 159 160 _forwardAction = new AbstractAction("Forward") { 161 public void actionPerformed(ActionEvent ae) { 162 forwardRegion(); 163 } 164 }; 165 _forwardButton = new JButton(_forwardAction); 166 167 Action goToAction = new AbstractAction("Go to") { 168 public void actionPerformed(ActionEvent ae) { 169 goToRegion(); 170 } 171 }; 172 _goToButton = new JButton(goToAction); 173 174 Action removeAction = new AbstractAction("Remove") { 175 public void actionPerformed(ActionEvent ae) { 176 for (DocumentRegion r: getSelectedRegions()) { 177 _model.getBrowserHistoryManager().removeRegion(r); 178 } 179 } 180 }; 181 _removeButton = new JButton(removeAction); 182 183 Action removeAllAction = new AbstractAction("Remove All") { 184 public void actionPerformed(ActionEvent ae) { 185 _model.getBrowserHistoryManager().clearRegions(); 186 } 187 }; 188 _removeAllButton = new JButton(removeAllAction); 189 190 JComponent[] buts = new JComponent[] { 191 _backButton, 192 _forwardButton, 193 _goToButton, 194 _removeButton, 195 _removeAllButton 196 }; 197 198 return buts; 199 } 200 201 202 protected void updateButtons() { 203 ArrayList <DocumentRegion> regs = getSelectedRegions(); 204 _goToButton.setEnabled(regs.size()==1); 205 _removeButton.setEnabled(regs.size()>0); 206 _removeAllButton.setEnabled(_listModel.size()>0); 207 _backAction.setEnabled((_listModel.size()>0) && (!_model.getBrowserHistoryManager().isCurrentRegionFirst())); 208 _forwardAction.setEnabled((_listModel.size()>0) && (!_model.getBrowserHistoryManager().isCurrentRegionLast())); 209 } 210 211 212 protected AbstractAction[] makePopupMenuActions() { 213 AbstractAction[] acts = new AbstractAction[] { 214 new AbstractAction("Go to") { 215 public void actionPerformed(ActionEvent e) { 216 goToRegion(); 217 } 218 }, 219 220 new AbstractAction("Remove") { 221 public void actionPerformed(ActionEvent e) { 222 for (DocumentRegion r: getSelectedRegions()) { 223 _model.getBrowserHistoryManager().removeRegion(r); 224 } 225 } 226 } 227 }; 228 return acts; 229 } 230 231 232 protected RegionListUserObj<DocumentRegion> getUserObjForRegion(DocumentRegion r) { 233 for(int i=0; i<_listModel.size(); ++i) { 234 @SuppressWarnings ("unchecked") RegionListUserObj<DocumentRegion> userObj = (RegionListUserObj<DocumentRegion>)_listModel.get(i); 235 if (userObj.region()==r) { 236 return userObj; 237 } 238 } 239 return null; 240 } 241 242 244 protected RegionListUserObj<DocumentRegion> makeRegionListUserObj(DocumentRegion r) { 245 return new BrowserHistoryListUserObj(r); 246 } 247 248 249 protected class BrowserHistoryListUserObj extends RegionListUserObj<DocumentRegion> { 250 public BrowserHistoryListUserObj(DocumentRegion r) { super(r); } 251 public String toString() { 252 final StringBuilder sb = new StringBuilder (); 253 _region.getDocument().acquireReadLock(); 254 try { 255 sb.append("<html>"); 256 if (_region==_model.getBrowserHistoryManager().getCurrentRegion()) { 257 sb.append("<font color=\"red\">"); 258 } 259 sb.append(_region.getDocument().toString()); 260 sb.append(':'); 261 sb.append(lineNumber()); 262 try { 263 sb.append(": "); 264 int length = Math.min(120, _region.getEndOffset()-_region.getStartOffset()); 265 sb.append(_region.getDocument().getText(_region.getStartOffset(), length).trim()); 266 } catch(BadLocationException bpe) { } 267 if (_region.equals(_model.getBrowserHistoryManager().getCurrentRegion())) { 268 sb.append("</font>"); 269 } 270 sb.append("</html>"); 271 } finally { _region.getDocument().releaseReadLock(); } 272 return sb.toString(); 273 } 274 public boolean equals(Object other) { 275 @SuppressWarnings ("unchecked") BrowserHistoryListUserObj o = (BrowserHistoryListUserObj)other; 276 return (o.region().getDocument().equals(region().getDocument())) && 277 (o.region().getStartOffset()==region().getStartOffset()) && 278 (o.region().getEndOffset()==region().getEndOffset()); 279 } 280 } 281 } 282 | Popular Tags |