| /******************************************************************************* |
| * Copyright (c) 2000, 2010 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * CSC - Initial implementation |
| * IBM Corporation - ongoing maintenance |
| * Brian Mauter <brianmauter@gmail.com> - bug 248333 |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ccvs.ui; |
| |
| import java.text.ParseException; |
| import java.util.Locale; |
| |
| import org.eclipse.jface.viewers.*; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.*; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.*; |
| import org.eclipse.team.internal.ccvs.core.EditorsInfo; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.part.ViewPart; |
| |
| import com.ibm.icu.text.DateFormat; |
| import com.ibm.icu.text.SimpleDateFormat; |
| |
| /** |
| * |
| * The <code>EditorsView</code> shows the result of cvs editors command |
| * |
| * @author <a href="mailto:gregor.kohlwes@csc.com,kohlwes@gmx.net">Gregor Kohlwes</a> |
| * @see org.eclipse.team.internal.ccvs.ui.actions.ShowEditorsAction |
| */ |
| public class EditorsView extends ViewPart { |
| public static final String VIEW_ID = "org.eclipse.team.ccvs.ui.EditorsView"; //$NON-NLS-1$ |
| |
| private Table table; |
| private TableViewer tableViewer; |
| |
| class EditorsLabelProvider implements ITableLabelProvider { |
| @Override |
| public Image getColumnImage(Object element, int columnIndex) { |
| return null; |
| } |
| |
| @Override |
| public String getColumnText(Object element, int columnIndex) { |
| if (element == null) |
| return ""; //$NON-NLS-1$ |
| EditorsInfo info = (EditorsInfo) element; |
| |
| String result = null; |
| switch (columnIndex) { |
| case 0 : |
| result = info.getFileName(); |
| break; |
| case 1 : |
| result = info.getUserName(); |
| break; |
| case 2 : |
| result = info.getDateString(); |
| break; |
| case 3 : |
| result = info.getComputerName(); |
| break; |
| } |
| // This method must not return null |
| if (result == null) result = ""; //$NON-NLS-1$ |
| return result; |
| |
| } |
| |
| @Override |
| public void addListener(ILabelProviderListener listener) { |
| } |
| |
| @Override |
| public void dispose() { |
| } |
| |
| @Override |
| public boolean isLabelProperty(Object element, String property) { |
| return false; |
| } |
| |
| @Override |
| public void removeListener(ILabelProviderListener listener) { |
| } |
| |
| } |
| |
| class EditorsComparator extends ViewerComparator { |
| private int column; |
| private boolean reversed; |
| |
| // we recognize the following date/time formats |
| private DateFormat[] dateFormats = new DateFormat[] { |
| new SimpleDateFormat("dd MMM yyyy HH:mm:ss z", Locale.US), //$NON-NLS-1$ |
| new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"), //$NON-NLS-1$ |
| new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy z") //$NON-NLS-1$ |
| }; |
| |
| public EditorsComparator(int column) { |
| this.column = column; |
| } |
| |
| public int getColumnNumber() { |
| return column; |
| } |
| |
| public boolean isReversed() { |
| return reversed; |
| } |
| |
| public void setReversed(boolean reversed) { |
| this.reversed = reversed; |
| } |
| |
| @Override |
| public int compare(Viewer compareViewer, Object o1, Object o2) { |
| int result = 0; |
| if ((o1 instanceof EditorsInfo) && (o2 instanceof EditorsInfo)) { |
| EditorsInfo ei1 = (EditorsInfo) o1; |
| EditorsInfo ei2 = (EditorsInfo) o2; |
| switch (column) { |
| case 0 : // file name |
| result = compareStrings(ei1.getFileName(), ei2.getFileName()); |
| break; |
| case 1 : // user name |
| result = compareStrings(ei1.getUserName(), ei2.getUserName()); |
| break; |
| case 2 : // date |
| result = compareDates(ei1.getDateString(), ei2.getDateString()); |
| break; |
| case 3 : // computer name |
| result = compareStrings(ei1.getComputerName(), ei2.getComputerName()); |
| } |
| if (reversed) |
| result = -result; |
| } |
| return result; |
| } |
| |
| private int compareStrings(String s1, String s2) { |
| if (s1 == null && s2 == null) |
| return 0; |
| if (s1 == null) |
| return -1; |
| if (s2 == null) |
| return 1; |
| return getComparator().compare(s1, s2); |
| } |
| |
| private int compareDates(String s1, String s2) { |
| long date1 = extractDate(s1); |
| long date2 = extractDate(s2); |
| if (date1 == date2) |
| return 0; |
| if (date1 == -1) |
| return -1; |
| if (date2 == -1) |
| return 1; |
| return date1 > date2 ? 1 : -1; |
| } |
| |
| /** |
| * @param dateString Date to parse |
| * @return the parsed time/date in milliseconds or -1 on error |
| */ |
| private long extractDate(String dateString) { |
| if (dateString != null) { |
| for (int i = 0; i < dateFormats.length; i++) { |
| dateFormats[i].setLenient(true); |
| try { |
| return dateFormats[i].parse(dateString).getTime(); |
| } catch (ParseException ex) { |
| // silently ignored |
| } |
| } |
| } |
| return -1; |
| } |
| } |
| |
| @Override |
| public void createPartControl(Composite parent) { |
| table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); |
| table.setHeaderVisible(true); |
| table.setLinesVisible(true); |
| |
| GridData gridData = new GridData(GridData.FILL_BOTH); |
| gridData.widthHint=500; |
| gridData.heightHint=100; |
| table.setLayoutData(gridData); |
| |
| TableLayout layout = new TableLayout(); |
| table.setLayout(layout); |
| |
| tableViewer = new TableViewer(table); |
| createColumns(table, layout); |
| |
| tableViewer.setContentProvider(ArrayContentProvider.getInstance()); |
| tableViewer.setLabelProvider(new EditorsLabelProvider()); |
| // set F1 help |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(tableViewer.getControl(), IHelpContextIds.CVS_EDITORS_VIEW); |
| } |
| public void setInput(EditorsInfo[] infos) { |
| tableViewer.setInput(infos); |
| } |
| /** |
| * Method createColumns. |
| * @param table |
| * @param layout |
| * @param viewer |
| */ |
| private void createColumns(Table table, TableLayout layout) { |
| SelectionListener headerListener = getColumnListener(tableViewer); |
| |
| TableColumn col; |
| // file name |
| col = new TableColumn(table, SWT.NONE); |
| col.setResizable(true); |
| col.setText(CVSUIMessages.EditorsView_file); |
| layout.addColumnData(new ColumnWeightData(30, true)); |
| col.addSelectionListener(headerListener); |
| |
| // user name |
| col = new TableColumn(table, SWT.NONE); |
| col.setResizable(true); |
| col.setText(CVSUIMessages.EditorsView_user); |
| layout.addColumnData(new ColumnWeightData(20, true)); |
| col.addSelectionListener(headerListener); |
| |
| // creation date |
| col = new TableColumn(table, SWT.NONE); |
| col.setResizable(true); |
| col.setText(CVSUIMessages.EditorsView_date); |
| layout.addColumnData(new ColumnWeightData(30, true)); |
| col.addSelectionListener(headerListener); |
| |
| // computer name |
| col = new TableColumn(table, SWT.NONE); |
| col.setResizable(true); |
| col.setText(CVSUIMessages.EditorsView_computer); |
| layout.addColumnData(new ColumnWeightData(20, true)); |
| col.addSelectionListener(headerListener); |
| } |
| |
| private SelectionListener getColumnListener(final TableViewer tableViewer) { |
| return new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| // column selected - need to sort |
| TableColumn tableColumn = (TableColumn) e.widget; |
| int column = tableViewer.getTable().indexOf(tableColumn); |
| EditorsComparator oldSorter = (EditorsComparator) tableViewer.getComparator(); |
| if (oldSorter != null && column == oldSorter.getColumnNumber()) { |
| oldSorter.setReversed(!oldSorter.isReversed()); |
| |
| tableViewer.getTable().setSortColumn(tableColumn); |
| tableViewer.getTable().setSortDirection(oldSorter.isReversed() ? SWT.DOWN : SWT.UP); |
| tableViewer.refresh(); |
| } else { |
| tableViewer.getTable().setSortColumn(tableColumn); |
| tableViewer.getTable().setSortDirection(SWT.UP); |
| tableViewer.setComparator(new EditorsComparator(column)); |
| } |
| } |
| }; |
| } |
| |
| @Override |
| public void setFocus() { |
| if (table != null) |
| table.setFocus(); |
| } |
| |
| public Table getTable() { |
| return table; |
| } |
| |
| } |