KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > DiffFormatter


1 /*
2  * DiffFormatter.java
3  *
4  * Copyright (C) 1998-2003 Peter Graves
5  * $Id: DiffFormatter.java,v 1.6 2003/05/10 15:44:00 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 public final class DiffFormatter extends Formatter
25 {
26     // Formats.
27
private static final int DIFF_FORMAT_TEXT = 0;
28     private static final int DIFF_FORMAT_FILE = 1;
29     private static final int DIFF_FORMAT_HEADER = 2;
30     private static final int DIFF_FORMAT_CONTEXT = 3;
31     private static final int DIFF_FORMAT_INSERTED = 4;
32     private static final int DIFF_FORMAT_DELETED = 5;
33     private static final int DIFF_FORMAT_CHANGED = 6;
34
35     public static final int DIFF_FORMAT_LAST = 6;
36
37     public DiffFormatter(Buffer buffer)
38     {
39         this.buffer = buffer;
40     }
41
42     public LineSegmentList formatLine(Line line)
43     {
44         clearSegmentList();
45         if (line == null || line.length() == 0) {
46             addSegment("", DIFF_FORMAT_TEXT);
47             return segmentList;
48         }
49         final String JavaDoc text = getDetabbedText(line);
50         char c = text.charAt(0);
51         if (c == '+' && !text.startsWith("+++ ")) {
52             // Inserted line.
53
addSegment(text, DIFF_FORMAT_INSERTED);
54             return segmentList;
55         }
56         if (c == '>') {
57             // Inserted line.
58
addSegment(text, DIFF_FORMAT_INSERTED);
59             return segmentList;
60         }
61         if (c == '-' && !text.equals("---") && !text.startsWith("--- ")) {
62             // Deleted line.
63
addSegment(text, DIFF_FORMAT_DELETED);
64             return segmentList;
65         }
66         if (c == '<') {
67             // Deleted line.
68
addSegment(text, DIFF_FORMAT_DELETED);
69             return segmentList;
70         }
71         if (c == '!') {
72             // Changed line (diff -c).
73
addSegment(text, DIFF_FORMAT_CHANGED);
74             return segmentList;
75         }
76         if (c == '?' || text.startsWith("Index: ")) {
77             // File line.
78
addSegment(text, DIFF_FORMAT_FILE);
79             return segmentList;
80         }
81         if (text.startsWith("==== ") && text.endsWith(" ====")) {
82             // File line (p4 diff).
83
addSegment(text, DIFF_FORMAT_FILE);
84             return segmentList;
85         }
86         if (isDiffHeader(text)) {
87             addSegment(text, DIFF_FORMAT_HEADER);
88             return segmentList;
89         }
90         if (c == ' ' && buffer instanceof org.armedbear.j.mail.MessageBuffer) {
91             // Diff might be indented.
92
if (isDiffHeader(text.trim())) {
93                 addSegment(text, DIFF_FORMAT_HEADER);
94                 return segmentList;
95             }
96             int indent = -1;
97             for (Line ln = line.previous(); ln != null; ln = ln.previous()) {
98                 String JavaDoc trim = ln.trim();
99                 if (trim.startsWith("@@ ") && trim.endsWith(" @@")) {
100                     indent = getDetabbedText(ln).indexOf('@');
101                     break;
102                 }
103                 if (trim.startsWith("+++ ")) {
104                     indent = getDetabbedText(ln).indexOf('+');
105                     break;
106                 }
107             }
108             if (indent >= 0) {
109                 String JavaDoc s = text.substring(indent);
110                 if (s.length() == 0) {
111                     addSegment("", DIFF_FORMAT_TEXT);
112                     return segmentList;
113                 }
114                 c = s.charAt(0);
115                 if (c == '+' && !s.startsWith("+++ ")) {
116                     // Inserted line.
117
addSegment(text, DIFF_FORMAT_INSERTED);
118                     return segmentList;
119                 }
120                 if (c == '-' && !s.startsWith("--- ")) {
121                     // Deleted line.
122
addSegment(text, DIFF_FORMAT_DELETED);
123                     return segmentList;
124                 }
125                 if (c == '!') {
126                     // Changed line (diff -c).
127
addSegment(s, DIFF_FORMAT_CHANGED);
128                     return segmentList;
129                 }
130                 if (c == '?' || s.startsWith("Index: ")) {
131                     // File line.
132
addSegment(text, DIFF_FORMAT_FILE);
133                     return segmentList;
134                 }
135                 if (s.startsWith("==== ") && s.endsWith(" ====")) {
136                     // File line (p4 diff).
137
addSegment(text, DIFF_FORMAT_FILE);
138                     return segmentList;
139                 }
140             }
141         }
142         // Otherwise, assume it's a context line.
143
addSegment(text, DIFF_FORMAT_CONTEXT);
144         return segmentList;
145     }
146
147     private static boolean isDiffHeader(String JavaDoc s)
148     {
149         if ((s.startsWith("cvs server: ") ||
150             s.startsWith("========") ||
151             s.startsWith("RCS file: ") ||
152             s.startsWith("retrieving revision ") ||
153             s.startsWith("diff ") ||
154             s.startsWith("*** ") ||
155             s.startsWith("--- ") ||
156             s.startsWith("+++ ") ||
157             (s.startsWith("@@ ") || s.endsWith(" @@")) ||
158             (s.startsWith("@ ") && s.endsWith(" @"))))
159             return true;
160         if (s.equals("***************"))
161             return true;
162         if (s.equals("---"))
163             return true;
164         if (s.length() > 0) {
165             char c = s.charAt(0);
166             if (c >= '0' && c <= '9')
167                 return true;
168         }
169         return false;
170     }
171
172     public FormatTable getFormatTable()
173     {
174         if (formatTable == null) {
175             formatTable = new FormatTable("DiffMode");
176             formatTable.addEntryFromPrefs(DIFF_FORMAT_TEXT, "text");
177             formatTable.addEntryFromPrefs(DIFF_FORMAT_FILE, "file", "text");
178             formatTable.addEntryFromPrefs(DIFF_FORMAT_HEADER, "header", "comment");
179             formatTable.addEntryFromPrefs(DIFF_FORMAT_CONTEXT, "context", "text");
180             formatTable.addEntryFromPrefs(DIFF_FORMAT_INSERTED, "inserted", "text");
181             formatTable.addEntryFromPrefs(DIFF_FORMAT_DELETED, "deleted", "text");
182             formatTable.addEntryFromPrefs(DIFF_FORMAT_CHANGED, "changed", "text");
183         }
184         return formatTable;
185     }
186 }
187
Popular Tags