1 11 12 package org.eclipse.team.internal.ui.history; 13 14 import com.ibm.icu.text.DateFormat; 15 import java.util.Date ; 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 currentRevision; 46 private TableViewer viewer; 47 private Font currentRevisionFont; 48 49 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 58 class HistoryLabelProvider extends LabelProvider implements ITableLabelProvider, IColorProvider, IFontProvider { 59 private DateFormat dateFormat; 60 public Image getColumnImage(Object element, int columnIndex) { 61 return null; 62 } 63 public String getColumnText(Object element, int columnIndex) { 64 IFileRevision entry = adaptToFileRevision(element); 65 if (entry == null) return ""; switch (columnIndex) { 67 case COL_REVISIONID: 68 String revision = entry.getContentIdentifier(); 69 return revision; 70 case COL_DATE: 71 long date = entry.getTimestamp(); 72 Date dateFromLong = new Date (date); 73 return getDateFormat().format(dateFromLong); 74 case COL_AUTHOR: 75 return entry.getAuthor(); 76 case COL_COMMENT: 77 String comment = entry.getComment(); 78 return comment; 79 } 80 return ""; } 82 83 private synchronized DateFormat getDateFormat() { 84 if (dateFormat == null) 85 dateFormat = DateFormat.getInstance(); 86 return dateFormat; 87 } 88 89 92 public Color getForeground(Object 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 103 public Color getBackground(Object element) { 104 return null; 105 } 106 110 public Font getFont(Object element) { 111 IFileRevision entry = adaptToFileRevision(element); 112 if (entry == null) 113 return null; 114 String revision = entry.getContentIdentifier(); 115 String 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 134 class HistoryComparator extends ViewerComparator { 135 private boolean reversed = false; 136 private int columnNumber; 137 138 private int[][] SORT_ORDERS_BY_COLUMN = { 140 {COL_REVISIONID, COL_DATE, COL_AUTHOR, COL_COMMENT}, 141 {COL_REVISIONID, COL_DATE, COL_AUTHOR, COL_COMMENT}, 142 {COL_DATE, COL_REVISIONID, COL_AUTHOR, COL_COMMENT}, 143 {COL_AUTHOR, COL_REVISIONID, COL_DATE, COL_COMMENT}, 144 {COL_COMMENT, COL_REVISIONID, COL_DATE, COL_AUTHOR} 145 }; 146 147 150 public HistoryComparator(int columnNumber) { 151 this.columnNumber = columnNumber; 152 } 153 157 public int compare(Viewer viewer, Object o1, Object 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 178 int compareColumnValue(int columnNumber, IFileRevision e1, IFileRevision e2) { 179 switch (columnNumber) { 180 case 0: 181 return e1.getContentIdentifier().compareTo(e2.getContentIdentifier()); 182 case 1: 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: 191 return getComparator().compare(e1.getAuthor(), e2.getAuthor()); 192 case 3: 193 return getComparator().compare(e1.getComment(), e2.getComment()); 194 default: 195 return 0; 196 } 197 } 198 201 public int getColumnNumber() { 202 return columnNumber; 203 } 204 208 public boolean isReversed() { 209 return reversed; 210 } 211 214 public void setReversed(boolean newReversed) { 215 reversed = newReversed; 216 } 217 } 218 protected IFileRevision adaptToFileRevision(Object element) { 219 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 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 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 273 private void createColumns(Table table, TableLayout layout, TableViewer viewer) { 274 SelectionListener headerListener = getColumnListener(viewer); 275 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 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 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 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 307 private SelectionListener getColumnListener(final TableViewer tableViewer) { 308 315 return new SelectionAdapter() { 316 325 public void widgetSelected(SelectionEvent e) { 326 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 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 getCurrentRevision() { 361 return currentRevision; 362 } 363 } 364 | Popular Tags |