1 21 22 package org.armedbear.j; 23 24 import gnu.regexp.REMatch; 25 26 public final class DirectoryFormatter extends Formatter 27 { 28 private static final byte DIRECTORY_FORMAT_TEXT = 0; 30 private static final byte DIRECTORY_FORMAT_DIRECTORY = 1; 31 private static final byte DIRECTORY_FORMAT_SYMLINK = 2; 32 private static final byte DIRECTORY_FORMAT_TAGGED = 3; 33 34 private final Directory directory; 35 36 public DirectoryFormatter(Buffer buffer) 37 { 38 this.buffer = buffer; 39 directory = (Directory) buffer; 40 } 41 42 public LineSegmentList formatLine(Line line) 43 { 44 clearSegmentList(); 45 if (line == null || line.length() == 0) { 46 addSegment("", DIRECTORY_FORMAT_TEXT); 47 return segmentList; 48 } 49 final String text = line.getText(); 50 if (text.charAt(0) == 'T') { 51 int nameOffset = getNameOffset(text); 53 addSegment("T", DIRECTORY_FORMAT_TAGGED); 54 addSegment(text, 1, nameOffset, DIRECTORY_FORMAT_TEXT); 55 addSegment(text, nameOffset, DIRECTORY_FORMAT_TAGGED); 56 return segmentList; 57 } 58 final int index = text.indexOf(" -> "); 59 if (index >= 0) { 60 int nameOffset = getNameOffset(text); 62 addSegment(text, 0, nameOffset, DIRECTORY_FORMAT_TEXT); 63 addSegment(text, nameOffset, index, DIRECTORY_FORMAT_SYMLINK); 64 addSegment(text, index, DIRECTORY_FORMAT_TEXT); 65 return segmentList; 66 } 67 final String trim = text.trim(); 68 if (trim.startsWith("d") || trim.startsWith("<DIR>")) { 69 int nameOffset = getNameOffset(text); 71 addSegment(text, 0, nameOffset, DIRECTORY_FORMAT_TEXT); 72 addSegment(text, nameOffset, DIRECTORY_FORMAT_DIRECTORY); 73 return segmentList; 74 } 75 addSegment(text, DIRECTORY_FORMAT_TEXT); 76 return segmentList; 77 } 78 79 private int getNameOffset(String text) 80 { 81 REMatch match; 82 if (directory.isUsingNativeFormat()) 83 match = Directory.getNativeMoveToFilenameRegExp().getMatch(text); 84 else 85 match = Directory.getInternalMoveToFilenameRegExp().getMatch(text); 86 return (match != null) ? match.getEndIndex() : text.length(); 87 } 88 89 public FormatTable getFormatTable() 90 { 91 if (formatTable == null) { 92 formatTable = new FormatTable("DirectoryMode"); 93 formatTable.addEntryFromPrefs(DIRECTORY_FORMAT_TEXT, "text"); 94 formatTable.addEntryFromPrefs(DIRECTORY_FORMAT_DIRECTORY, "directory"); 95 formatTable.addEntryFromPrefs(DIRECTORY_FORMAT_SYMLINK, "symlink"); 96 formatTable.addEntryFromPrefs(DIRECTORY_FORMAT_TAGGED, "marked"); 97 } 98 return formatTable; 99 } 100 } 101 | Popular Tags |