KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > team > internal > ui > history > GenericHistoryTableProvider


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11
12 package org.eclipse.team.internal.ui.history;
13
14 import com.ibm.icu.text.DateFormat;
15 import java.util.Date JavaDoc;
16
17 import org.eclipse.core.resources.IFile;
18 import org.eclipse.core.runtime.IAdaptable;
19 import org.eclipse.jface.resource.JFaceResources;
20 import org.eclipse.jface.viewers.*;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.DisposeEvent;
23 import org.eclipse.swt.events.DisposeListener;
24 import org.eclipse.swt.events.SelectionAdapter;
25 import org.eclipse.swt.events.SelectionEvent;
26 import org.eclipse.swt.events.SelectionListener;
27 import org.eclipse.swt.graphics.Color;
28 import org.eclipse.swt.graphics.Font;
29 import org.eclipse.swt.graphics.FontData;
30 import org.eclipse.swt.graphics.Image;
31 import org.eclipse.swt.layout.GridData;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.Display;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.swt.widgets.TableColumn;
36 import org.eclipse.team.core.RepositoryProvider;
37 import org.eclipse.team.core.history.IFileHistory;
38 import org.eclipse.team.core.history.IFileRevision;
39 import org.eclipse.team.internal.ui.TeamUIMessages;
40
41 public class GenericHistoryTableProvider {
42
43     private IFileHistory currentFileHistory;
44     private IFile currentFile;
45     private String JavaDoc currentRevision;
46     private TableViewer viewer;
47     private Font currentRevisionFont;
48     
49     //column constants
50
private static final int COL_REVISIONID = 0;
51     private static final int COL_DATE= 1;
52     private static final int COL_AUTHOR = 2;
53     private static final int COL_COMMENT = 3;
54
55     /**
56      * The history label provider.
57      */

58     class HistoryLabelProvider extends LabelProvider implements ITableLabelProvider, IColorProvider, IFontProvider {
59         private DateFormat dateFormat;
60         public Image getColumnImage(Object JavaDoc element, int columnIndex) {
61             return null;
62         }
63         public String JavaDoc getColumnText(Object JavaDoc element, int columnIndex) {
64             IFileRevision entry = adaptToFileRevision(element);
65             if (entry == null) return ""; //$NON-NLS-1$
66
switch (columnIndex) {
67                 case COL_REVISIONID:
68                     String JavaDoc revision = entry.getContentIdentifier();
69                     return revision;
70                 case COL_DATE:
71                     long date = entry.getTimestamp();
72                     Date JavaDoc dateFromLong = new Date JavaDoc(date);
73                     return getDateFormat().format(dateFromLong);
74                 case COL_AUTHOR:
75                     return entry.getAuthor();
76                 case COL_COMMENT:
77                     String JavaDoc comment = entry.getComment();
78                     return comment;
79             }
80             return ""; //$NON-NLS-1$
81
}
82         
83         private synchronized DateFormat getDateFormat() {
84             if (dateFormat == null)
85                 dateFormat = DateFormat.getInstance();
86             return dateFormat;
87         }
88         
89         /* (non-Javadoc)
90          * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
91          */

92         public Color getForeground(Object JavaDoc element) {
93             IFileRevision entry = adaptToFileRevision(element);
94             if (!entry.exists()) {
95                 return Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
96             }
97             
98             return null;
99         }
100         /* (non-Javadoc)
101          * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
102          */

103         public Color getBackground(Object JavaDoc element) {
104             return null;
105         }
106         /*
107          * (non-Javadoc)
108          * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
109          */

110         public Font getFont(Object JavaDoc element) {
111             IFileRevision entry = adaptToFileRevision(element);
112             if (entry == null)
113                 return null;
114             String JavaDoc revision = entry.getContentIdentifier();
115             String JavaDoc tempCurrentRevision = getCurrentRevision();
116             if (tempCurrentRevision != null && tempCurrentRevision.equals(revision)) {
117                 if (currentRevisionFont == null) {
118                     Font defaultFont = JFaceResources.getDefaultFont();
119                     FontData[] data = defaultFont.getFontData();
120                     for (int i = 0; i < data.length; i++) {
121                         data[i].setStyle(SWT.BOLD);
122                     }
123                     currentRevisionFont = new Font(viewer.getTable().getDisplay(), data);
124                 }
125                 return currentRevisionFont;
126             }
127             return null;
128         }
129     }
130     
131     /**
132      * The history sorter
133      */

134     class HistoryComparator extends ViewerComparator {
135         private boolean reversed = false;
136         private int columnNumber;
137         
138         // column headings: "Revision" "Tags" "Date" "Author" "Comment"
139
private int[][] SORT_ORDERS_BY_COLUMN = {
140             {COL_REVISIONID, COL_DATE, COL_AUTHOR, COL_COMMENT}, /* revision */
141             {COL_REVISIONID, COL_DATE, COL_AUTHOR, COL_COMMENT}, /* tags */
142             {COL_DATE, COL_REVISIONID, COL_AUTHOR, COL_COMMENT}, /* date */
143             {COL_AUTHOR, COL_REVISIONID, COL_DATE, COL_COMMENT}, /* author */
144             {COL_COMMENT, COL_REVISIONID, COL_DATE, COL_AUTHOR} /* comment */
145         };
146         
147         /**
148          * The constructor.
149          */

150         public HistoryComparator(int columnNumber) {
151             this.columnNumber = columnNumber;
152         }
153         /**
154          * Compares two log entries, sorting first by the main column of this sorter,
155          * then by subsequent columns, depending on the column sort order.
156          */

157         public int compare(Viewer viewer, Object JavaDoc o1, Object JavaDoc o2) {
158             IFileRevision e1 = adaptToFileRevision(o1);
159             IFileRevision e2 = adaptToFileRevision(o2);
160             int result = 0;
161             if (e1 == null || e2 == null) {
162                 result = super.compare(viewer, o1, o2);
163             } else {
164                 int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
165                 for (int i = 0; i < columnSortOrder.length; ++i) {
166                     result = compareColumnValue(columnSortOrder[i], e1, e2);
167                     if (result != 0)
168                         break;
169                 }
170             }
171             if (reversed)
172                 result = -result;
173             return result;
174         }
175         /**
176          * Compares two markers, based only on the value of the specified column.
177          */

178         int compareColumnValue(int columnNumber, IFileRevision e1, IFileRevision e2) {
179             switch (columnNumber) {
180                 case 0: /* revision */
181                     return e1.getContentIdentifier().compareTo(e2.getContentIdentifier());
182                 case 1: /* date */
183                     long date1 = e1.getTimestamp();
184                     long date2 = e2.getTimestamp();
185                     if (date1 == date2)
186                         return 0;
187                     
188                     return date1>date2 ? -1 : 1;
189         
190                 case 2: /* author */
191                     return getComparator().compare(e1.getAuthor(), e2.getAuthor());
192                 case 3: /* comment */
193                     return getComparator().compare(e1.getComment(), e2.getComment());
194                 default:
195                     return 0;
196             }
197         }
198         /**
199          * Returns the number of the column by which this is sorting.
200          */

201         public int getColumnNumber() {
202             return columnNumber;
203         }
204         /**
205          * Returns true for descending, or false
206          * for ascending sorting order.
207          */

208         public boolean isReversed() {
209             return reversed;
210         }
211         /**
212          * Sets the sorting order.
213          */

214         public void setReversed(boolean newReversed) {
215             reversed = newReversed;
216         }
217     }
218     protected IFileRevision adaptToFileRevision(Object JavaDoc element) {
219         // Get the log entry for the provided object
220
IFileRevision entry = null;
221         if (element instanceof IFileRevision) {
222             entry = (IFileRevision) element;
223         } else if (element instanceof IAdaptable) {
224             entry = (IFileRevision)((IAdaptable)element).getAdapter(IFileRevision.class);
225         }
226         return entry;
227     }
228     
229     /**
230      * Create a TableViewer that can be used to display a list of IFileRevision instances.
231      * Ths method provides the labels and sorter but does not provide a content provider
232      *
233      * @param parent
234      * @return TableViewer
235      */

236     public TableViewer createTable(Composite parent) {
237         Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
238         table.setHeaderVisible(true);
239         table.setLinesVisible(true);
240         GridData data = new GridData(GridData.FILL_BOTH);
241         table.setLayoutData(data);
242     
243         TableLayout layout = new TableLayout();
244         table.setLayout(layout);
245         
246         TableViewer viewer = new TableViewer(table);
247         
248         createColumns(table, layout, viewer);
249
250         viewer.setLabelProvider(new HistoryLabelProvider());
251         
252         // By default, reverse sort by revision.
253
HistoryComparator sorter = new HistoryComparator(COL_REVISIONID);
254         sorter.setReversed(true);
255         viewer.setComparator(sorter);
256         
257         table.addDisposeListener(new DisposeListener() {
258             public void widgetDisposed(DisposeEvent e) {
259                 if(currentRevisionFont != null) {
260                     currentRevisionFont.dispose();
261                 }
262             }
263         });
264         
265         this.viewer = viewer;
266         return viewer;
267     }
268     
269     
270     /**
271      * Creates the columns for the history table.
272      */

273     private void createColumns(Table table, TableLayout layout, TableViewer viewer) {
274         SelectionListener headerListener = getColumnListener(viewer);
275         // revision
276
TableColumn col = new TableColumn(table, SWT.NONE);
277         col.setResizable(true);
278         col.setText(TeamUIMessages.GenericHistoryTableProvider_Revision);
279         col.addSelectionListener(headerListener);
280         layout.addColumnData(new ColumnWeightData(20, true));
281     
282         // creation date
283
col = new TableColumn(table, SWT.NONE);
284         col.setResizable(true);
285         col.setText(TeamUIMessages.GenericHistoryTableProvider_RevisionTime);
286         col.addSelectionListener(headerListener);
287         layout.addColumnData(new ColumnWeightData(20, true));
288     
289         // author
290
col = new TableColumn(table, SWT.NONE);
291         col.setResizable(true);
292         col.setText(TeamUIMessages.GenericHistoryTableProvider_Author);
293         col.addSelectionListener(headerListener);
294         layout.addColumnData(new ColumnWeightData(20, true));
295     
296         //comment
297
col = new TableColumn(table, SWT.NONE);
298         col.setResizable(true);
299         col.setText(TeamUIMessages.GenericHistoryTableProvider_Comment);
300         col.addSelectionListener(headerListener);
301         layout.addColumnData(new ColumnWeightData(50, true));
302     }
303     
304     /**
305      * Adds the listener that sets the sorter.
306      */

307     private SelectionListener getColumnListener(final TableViewer tableViewer) {
308         /**
309          * This class handles selections of the column headers.
310          * Selection of the column header will cause resorting
311          * of the shown tasks using that column's sorter.
312          * Repeated selection of the header will toggle
313          * sorting order (ascending versus descending).
314          */

315         return new SelectionAdapter() {
316             /**
317              * Handles the case of user selecting the
318              * header area.
319              * <p>If the column has not been selected previously,
320              * it will set the sorter of that column to be
321              * the current tasklist sorter. Repeated
322              * presses on the same column header will
323              * toggle sorting order (ascending/descending).
324              */

325             public void widgetSelected(SelectionEvent e) {
326                 // column selected - need to sort
327
int column = tableViewer.getTable().indexOf((TableColumn) e.widget);
328                 HistoryComparator oldSorter = (HistoryComparator)tableViewer.getComparator();
329                 if (oldSorter != null && column == oldSorter.getColumnNumber()) {
330                     oldSorter.setReversed(!oldSorter.isReversed());
331                     tableViewer.refresh();
332                 } else {
333                     tableViewer.setComparator(new HistoryComparator(column));
334                 }
335             }
336         };
337     }
338     
339     public void setFile(IFileHistory fileHistory, IFile file) {
340         this.currentFileHistory = fileHistory;
341         this.currentFile= file;
342         this.currentRevision = findCurrentRevision();
343     }
344     
345     private String JavaDoc findCurrentRevision() {
346         
347         RepositoryProvider teamProvider = RepositoryProvider.getProvider(currentFile.getProject());
348         IFileRevision fileRevision = teamProvider.getFileHistoryProvider().getWorkspaceFileRevision(currentFile);
349         
350         if (fileRevision != null )
351             return fileRevision.getContentIdentifier();
352         
353         return null;
354     }
355
356     public IFileHistory getIFileHistory() {
357         return this.currentFileHistory;
358     }
359     
360     public String JavaDoc getCurrentRevision() {
361         return currentRevision;
362     }
363 }
364
Popular Tags