Changeset 34652 in osm for applications/editors
- Timestamp:
- 2018-09-15T13:50:24+02:00 (6 years ago)
- Location:
- applications/editors/josm/plugins/seachart
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/seachart/.project
r32394 r34652 16 16 </arguments> 17 17 </buildCommand> 18 <buildCommand>19 <name>net.sf.eclipsecs.core.CheckstyleBuilder</name>20 <arguments>21 </arguments>22 </buildCommand>23 18 </buildSpec> 24 19 <natures> 25 20 <nature>org.eclipse.jdt.core.javanature</nature> 26 <nature>net.sf.eclipsecs.core.CheckstyleNature</nature>27 21 </natures> 28 22 </projectDescription> -
applications/editors/josm/plugins/seachart/src/render/Renderer.java
r33195 r34652 423 423 if (delta == null) delta = new Delta(Handle.CC); 424 424 if (bg == null) bg = new Color(0x00000000, true); 425 if ( (str == null) || (str.isEmpty())) str = " ";425 if (str == null || str.isEmpty()) str = " "; 426 426 FontRenderContext frc = g2.getFontRenderContext(); 427 GlyphVector gv = font.deriveFont((float) (font.getSize())).createGlyphVector(frc, str.equals(" ") ? "M" : str);427 GlyphVector gv = font.deriveFont((float) font.getSize()).createGlyphVector(frc, str.equals(" ") ? "M" : str); 428 428 Rectangle2D bounds = gv.getVisualBounds(); 429 429 double width = bounds.getWidth(); … … 593 593 pos.translate((mid.getX() - centre.getX()), (mid.getY() - centre.getY())); 594 594 Symbol label = new Symbol(); 595 label.add(new Instr(Form.BBOX, new Rectangle2D.Double((-width / 2), (-height), width, height)));595 label.add(new Instr(Form.BBOX, new Rectangle2D.Double((-width / 2), -height, width, height))); 596 596 label.add(new Instr(Form.TEXT, new Caption(str, font, colour, new Delta(Handle.BC)))); 597 597 Symbols.drawSymbol(g2, label, sScale, centre.getX(), centre.getY(), null, new Delta(Handle.BC, pos)); … … 603 603 public static void lightSector(Color col1, Color col2, double radius, double s1, double s2, Double dir, String str) { 604 604 if ((zoom >= 16) && (radius > 0.2)) { 605 radius /= (Math.pow(2, zoom-15));605 radius /= Math.pow(2, zoom-15); 606 606 } 607 607 double mid = (((s1 + s2) / 2) + (s1 > s2 ? 180 : 0)) % 360; … … 632 632 2 * (radial - arcWidth), -(s1 + 90), ((s1 < s2) ? (s1 - s2) : (s1 - s2 - 360)), Arc2D.OPEN)); 633 633 } 634 if ( (str != null) && (!str.isEmpty())) {634 if (str != null && !str.isEmpty()) { 635 635 Font font = new Font("Arial", Font.PLAIN, 40); 636 636 double arc = (s2 > s1) ? (s2 - s1) : (s2 - s1 + 360); -
applications/editors/josm/plugins/seachart/src/render/Rules.java
r33995 r34652 546 546 Renderer.symbol(Beacons.Stake, getScheme(feature.type)); 547 547 } 548 } else if ( (shape == BcnSHP.BCN_PRCH) && (feature.type == Obj.BCNLAT) && !(feature.objs.containsKey(Obj.TOPMAR))) {548 } else if (shape == BcnSHP.BCN_PRCH && feature.type == Obj.BCNLAT && !feature.objs.containsKey(Obj.TOPMAR)) { 549 549 switch ((CatLAM) getAttEnum(feature.type, Att.CATLAM)) { 550 550 case LAM_PORT: … … 565 565 } 566 566 if (topmap.containsKey(Att.TOPSHP)) { 567 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.BeaconDelta);567 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.TOPMAR), Topmarks.BeaconDelta); 568 568 } 569 569 } else if (feature.objs.containsKey(Obj.DAYMAR)) { 570 570 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0); 571 571 if (topmap.containsKey(Att.TOPSHP)) { 572 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.BeaconDelta);572 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.DAYMAR), Topmarks.BeaconDelta); 573 573 } 574 574 } … … 591 591 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0); 592 592 if (topmap.containsKey(Att.TOPSHP)) { 593 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));593 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape)); 594 594 } 595 595 } else if (feature.objs.containsKey(Obj.DAYMAR)) { 596 596 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0); 597 597 if (topmap.containsKey(Att.TOPSHP)) { 598 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.BuoyDeltas.get(shape));598 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.DAYMAR), Topmarks.BuoyDeltas.get(shape)); 599 599 } 600 600 } … … 649 649 } else if (feature.type == Obj.CBLOHD) { 650 650 AttMap atts = feature.objs.get(Obj.CBLOHD).get(0); 651 if ( (atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {651 if (atts != null && atts.containsKey(Att.CATCBL) && atts.get(Att.CATCBL).val == CatCBL.CBL_POWR) { 652 652 Renderer.lineSymbols(Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black); 653 653 } else { … … 724 724 if (Renderer.zoom >= 15) { 725 725 AttMap atts = getAtts(Obj.DISMAR, 0); 726 if ( (atts != null) && (atts.containsKey(Att.WTWDIS))) {726 if (atts != null && atts.containsKey(Att.WTWDIS)) { 727 727 Double dist = (Double) atts.get(Att.WTWDIS).val; 728 728 String str = ""; … … 777 777 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0); 778 778 if (topmap.containsKey(Att.TOPSHP)) { 779 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.FloatDelta);779 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.TOPMAR), Topmarks.FloatDelta); 780 780 } 781 781 } else if (feature.objs.containsKey(Obj.DAYMAR)) { 782 782 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0); 783 783 if (topmap.containsKey(Att.TOPSHP)) { 784 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.FloatDelta);784 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.DAYMAR), Topmarks.FloatDelta); 785 785 } 786 786 } … … 830 830 addName(15, new Font("Arial", Font.BOLD, 60), Symbols.Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0))); 831 831 ArrayList<StsSTS> sts = (ArrayList<StsSTS>) getAttList(Obj.ACHARE, Att.STATUS); 832 if ( (Renderer.zoom >= 15) && (sts.contains(StsSTS.STS_RESV))) {832 if (Renderer.zoom >= 15 && sts.contains(StsSTS.STS_RESV)) { 833 833 Renderer.labelText("Reserved", new Font("Arial", Font.PLAIN, 50), Symbols.Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60))); 834 834 } … … 923 923 switch (feature.type) { 924 924 case ROADWY: 925 ArrayList<CatROD> cat = (ArrayList<CatROD>) (getAttList(Obj.ROADWY, Att.CATROD));925 ArrayList<CatROD> cat = (ArrayList<CatROD>) getAttList(Obj.ROADWY, Att.CATROD); 926 926 if (cat.size() > 0) { 927 927 switch (cat.get(0)) { … … 1018 1018 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0); 1019 1019 if (topmap.containsKey(Att.TOPSHP)) { 1020 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), Topmarks.LightDelta);1020 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.TOPMAR), Topmarks.LightDelta); 1021 1021 } 1022 1022 } else if (feature.objs.containsKey(Obj.DAYMAR)) { 1023 1023 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0); 1024 1024 if (topmap.containsKey(Att.TOPSHP)) { 1025 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), Topmarks.LightDelta);1025 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.DAYMAR), Topmarks.LightDelta); 1026 1026 } 1027 1027 } … … 1108 1108 for (AttMap atts : objs.values()) { 1109 1109 if (atts.get(Att.MARSYS) != null) 1110 sys = ((ArrayList<MarSYS>) (atts.get(Att.MARSYS).val)).get(0);1110 sys = ((ArrayList<MarSYS>) atts.get(Att.MARSYS).val).get(0); 1111 1111 if (atts.get(Att.BNKWTW) != null) 1112 bnk = ((ArrayList<BnkWTW>) (atts.get(Att.BNKWTW).val)).get(0);1112 bnk = ((ArrayList<BnkWTW>) atts.get(Att.BNKWTW).val).get(0); 1113 1113 CatNMK cat = CatNMK.NMK_UNKN; 1114 1114 if (atts.get(Att.CATNMK) != null) 1115 cat = ((ArrayList<CatNMK>) (atts.get(Att.CATNMK).val)).get(0);1115 cat = ((ArrayList<CatNMK>) atts.get(Att.CATNMK).val).get(0); 1116 1116 Symbol sym = Notices.getNotice(cat, sys, bnk); 1117 1117 Scheme sch = Notices.getScheme(sys, bnk); 1118 1118 ArrayList<AddMRK> add = new ArrayList<>(); 1119 1119 if (atts.get(Att.ADDMRK) != null) 1120 add = (ArrayList<AddMRK>) (atts.get(Att.ADDMRK).val);1120 add = (ArrayList<AddMRK>) atts.get(Att.ADDMRK).val; 1121 1121 Handle h = Handle.CC; 1122 1122 double ax = 0.0; … … 1254 1254 AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0); 1255 1255 if (topmap.containsKey(Att.TOPSHP)) { 1256 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), null);1256 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.TOPMAR), null); 1257 1257 } 1258 1258 } else if (feature.objs.containsKey(Obj.DAYMAR)) { 1259 1259 AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0); 1260 1260 if (topmap.containsKey(Att.TOPSHP)) { 1261 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), null);1261 Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) topmap.get(Att.TOPSHP).val).get(0)), getScheme(Obj.DAYMAR), null); 1262 1262 } 1263 1263 } -
applications/editors/josm/plugins/seachart/src/render/Signals.java
r34237 r34652 125 125 case BCNSAW: 126 126 case BCNSPP: 127 if ( (feature.objs.containsKey(Obj.TOPMAR)) || (feature.objs.containsKey(Obj.DAYMAR))) {127 if (feature.objs.containsKey(Obj.TOPMAR) || feature.objs.containsKey(Obj.DAYMAR)) { 128 128 Renderer.symbol(Topmarks.RadarReflector, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -140))); 129 129 } else { … … 134 134 case LITVES: 135 135 case BOYINB: 136 if ( (feature.objs.containsKey(Obj.TOPMAR)) || (feature.objs.containsKey(Obj.DAYMAR))) {136 if (feature.objs.containsKey(Obj.TOPMAR) || feature.objs.containsKey(Obj.DAYMAR)) { 137 137 Renderer.symbol(Topmarks.RadarReflector, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -110))); 138 138 } else { … … 142 142 case LITMAJ: 143 143 case LITMIN: 144 if ( (feature.objs.containsKey(Obj.TOPMAR)) || (feature.objs.containsKey(Obj.DAYMAR))) {144 if (feature.objs.containsKey(Obj.TOPMAR) || feature.objs.containsKey(Obj.DAYMAR)) { 145 145 Renderer.symbol(Topmarks.RadarReflector, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90))); 146 146 } else { … … 153 153 case BOYSAW: 154 154 case BOYSPP: 155 if ( (feature.objs.containsKey(Obj.TOPMAR)) || (feature.objs.containsKey(Obj.DAYMAR))) {155 if (feature.objs.containsKey(Obj.TOPMAR) || feature.objs.containsKey(Obj.DAYMAR)) { 156 156 if (testAttribute(feature.type, Att.BOYSHP, BoySHP.BOY_PILR) || testAttribute(feature.type, Att.BOYSHP, BoySHP.BOY_SPAR)) { 157 157 Renderer.symbol(Topmarks.RadarReflector, new Delta(Handle.BC, AffineTransform.getTranslateInstance(50, -160))); … … 181 181 String str = ""; 182 182 if (atts.containsKey(Att.CATFOG)) { 183 str += fogSignals.get(((ArrayList<?>) (atts.get(Att.CATFOG).val)).get(0));183 str += fogSignals.get(((ArrayList<?>) atts.get(Att.CATFOG).val).get(0)); 184 184 } 185 185 if (atts.containsKey(Att.SIGGRP)) { … … 440 440 continue; 441 441 if (srad == radius) { 442 ArrayList<CatLIT> scats = (ArrayList<CatLIT>) ( (satts.containsKey(Att.CATLIT)) ? (ArrayList<CatLIT>) satts.get(Att.CATLIT).val : new ArrayList<>());442 ArrayList<CatLIT> scats = (ArrayList<CatLIT>) (satts.containsKey(Att.CATLIT) ? (ArrayList<CatLIT>) satts.get(Att.CATLIT).val : new ArrayList<>()); 443 443 if (scats.contains(CatLIT.LIT_DIR)) { 444 444 if (satts.containsKey(Att.ORIENT)) { … … 557 557 for (ArrayList<LitSect> group : groupings) { 558 558 LitSect mem = group.get(0); 559 if ( (lit.dir == mem.dir) && (lit.chr == mem.chr) && (lit.grp.equals(mem.grp)) && (lit.per == mem.per) && (lit.hgt == mem.hgt)) {559 if (lit.dir == mem.dir && lit.chr == mem.chr && lit.grp.equals(mem.grp) && lit.per == mem.per && lit.hgt == mem.hgt) { 560 560 group.add(lit); 561 561 found = true; … … 616 616 } 617 617 LitSect tmp = group.get(0); 618 str = (tmp.dir)? "Dir" : "";618 str = tmp.dir ? "Dir" : ""; 619 619 str += LightCharacters.get(tmp.chr); 620 620 if (!tmp.grp.isEmpty()) … … 645 645 cats = (ArrayList<CatLIT>) atts.get(Att.CATLIT).val; 646 646 } 647 str = (cats.contains(CatLIT.LIT_DIR)) ? "Dir" : "";648 str += (atts.containsKey(Att.MLTYLT)) ? atts.get(Att.MLTYLT).val : "";647 str = cats.contains(CatLIT.LIT_DIR) ? "Dir" : ""; 648 str += atts.containsKey(Att.MLTYLT) ? atts.get(Att.MLTYLT).val : ""; 649 649 if (atts.containsKey(Att.LITCHR)) { 650 650 LitCHR chr = ((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0); … … 680 680 } 681 681 } 682 str += (cats.contains(CatLIT.LIT_VERT)) ? "(vert)" : "";683 str += (cats.contains(CatLIT.LIT_HORI)) ? "(hor)" : "";682 str += cats.contains(CatLIT.LIT_VERT) ? "(vert)" : ""; 683 str += cats.contains(CatLIT.LIT_HORI) ? "(hor)" : ""; 684 684 str += (!str.isEmpty() && (atts.containsKey(Att.SIGPER) || atts.containsKey(Att.HEIGHT) || atts.containsKey(Att.VALMXR)) && !str.endsWith(")")) ? "." : ""; 685 str += (atts.containsKey(Att.SIGPER)) ? df.format(atts.get(Att.SIGPER).val) + "s" : "";686 str += (atts.containsKey(Att.HEIGHT)) ? df.format(atts.get(Att.HEIGHT).val) + "m" : "";687 str += (atts.containsKey(Att.VALNMR)) ? df.format(atts.get(Att.VALNMR).val) + "M" : "";688 str += (cats.contains(CatLIT.LIT_FRNT)) ? "(Front)" : "";689 str += (cats.contains(CatLIT.LIT_REAR)) ? "(Rear)" : "";690 str += (cats.contains(CatLIT.LIT_UPPR)) ? "(Upper)" : "";691 str += (cats.contains(CatLIT.LIT_LOWR)) ? "(Lower)" : "";685 str += atts.containsKey(Att.SIGPER) ? df.format(atts.get(Att.SIGPER).val) + "s" : ""; 686 str += atts.containsKey(Att.HEIGHT) ? df.format(atts.get(Att.HEIGHT).val) + "m" : ""; 687 str += atts.containsKey(Att.VALNMR) ? df.format(atts.get(Att.VALNMR).val) + "M" : ""; 688 str += cats.contains(CatLIT.LIT_FRNT) ? "(Front)" : ""; 689 str += cats.contains(CatLIT.LIT_REAR) ? "(Rear)" : ""; 690 str += cats.contains(CatLIT.LIT_UPPR) ? "(Upper)" : ""; 691 str += cats.contains(CatLIT.LIT_LOWR) ? "(Lower)" : ""; 692 692 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.TL, AffineTransform.getTranslateInstance(60, -30))); 693 693 } -
applications/editors/josm/plugins/seachart/src/s57/S57map.java
r32909 r34652 908 908 first = false; 909 909 } else { 910 sarc += (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));910 sarc += Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)); 911 911 } 912 912 llat = lat; … … 931 931 first = false; 932 932 } else { 933 sarc = (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));933 sarc = Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)); 934 934 if (sarc > harc) 935 935 break; -
applications/editors/josm/plugins/seachart/src/s57/S57obj.java
r32907 r34652 163 163 164 164 public static Obj enumType(String type) { // Convert OSM object string to SCM object enumeration 165 if ( (type != null) && !type.isEmpty() && (StrObj.containsKey(type)))165 if (type != null && !type.isEmpty() && StrObj.containsKey(type)) 166 166 return StrObj.get(type); 167 167 else -
applications/editors/josm/plugins/seachart/src/s57/S57osm.java
r33724 r34652 9 9 import s57.S57map.Snode; 10 10 import s57.S57obj.Obj; 11 import s57.S57val.CatBUA;12 11 import s57.S57val.CatROD; 13 12 import s57.S57val.Conv; … … 131 130 } 132 131 } else { 133 if ((inNode || inWay || inRel) && (ln.contains("<tag"))) {132 if ((inNode || inWay || inRel) && ln.contains("<tag")) { 134 133 k = v = ""; 135 134 String[] token = ln.split("k="); … … 205 204 ref = Long.parseLong(token.split("[\"\']")[1]); 206 205 } else if (token.matches("^type=.+")) { 207 type = (token.split("[\"\']")[1]);206 type = token.split("[\"\']")[1]; 208 207 } else if (token.matches("^role=.+")) { 209 208 String[] str = token.split("[\"\']"); 210 209 if (str.length > 1) { 211 role = (token.split("[\"\']")[1]);210 role = token.split("[\"\']")[1]; 212 211 } 213 212 } -
applications/editors/josm/plugins/seachart/src/s57/S57val.java
r33936 r34652 1654 1654 1655 1655 public static Enum<?> unknAtt(Att att) { 1656 return (Enum<?>) (keys.get(att).map.keySet().toArray()[0]);1656 return (Enum<?>) keys.get(att).map.keySet().toArray()[0]; 1657 1657 } 1658 1658 } -
applications/editors/josm/plugins/seachart/src/seachart/SeachartAction.java
r34098 r34652 203 203 map.addEdge(way.getUniqueId()); 204 204 for (Node node : way.getNodes()) { 205 map.addToEdge( (node.getUniqueId()));205 map.addToEdge(node.getUniqueId()); 206 206 } 207 207 for (Entry<String, String> entry : way.getKeys().entrySet()) { … … 216 216 for (RelationMember mem : rel.getMembers()) { 217 217 if (mem.getType() == OsmPrimitiveType.WAY) 218 map.addToArea(mem.getUniqueId(), (mem.getRole().equals("outer")));218 map.addToArea(mem.getUniqueId(), mem.getRole().equals("outer")); 219 219 } 220 220 for (Entry<String, String> entry : rel.getKeys().entrySet()) { -
applications/editors/josm/plugins/seachart/src/symbols/Symbols.java
r32907 r34652 186 186 if (cs != null) { 187 187 if ((cs.pat.size() > 0) && (cs.col.size() > 0) && (cs.pat.get(0) == Patt.B)) { 188 bpat = (cs.pat.remove(0));189 bcol = (cs.col.remove(0));188 bpat = cs.pat.remove(0); 189 bcol = cs.col.remove(0); 190 190 } 191 191 pn = cs.pat.size();
Note:
See TracChangeset
for help on using the changeset viewer.