blob: dec006fa738a461daecb803cccc3480db1cc4ae9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.preferences;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.team.core.Team;
import org.eclipse.team.internal.ui.PixelConverter;
import org.eclipse.team.internal.ui.SWTUtils;
import org.eclipse.team.internal.ui.TeamUIMessages;
public class FileTypeTable implements ICellModifier, IStructuredContentProvider, ITableLabelProvider {
private final static int COMBO_INDEX_BINARY= 0;
private final static int COMBO_INDEX_TEXT= 1;
private final static String [] MODES_TEXT= { TeamUIMessages.FileTypeTable_0, TeamUIMessages.FileTypeTable_1 }; //
private final static int COMBO_INDEX_SAVE= 0;
private final static int COMBO_INDEX_DONT_SAVE= 1;
private static final String [] SAVE_TEXT= { TeamUIMessages.FileTypeTable_2, TeamUIMessages.FileTypeTable_3 }; //
private static final class FileTypeComparator extends ViewerComparator {
public FileTypeComparator() {
}
private int getCategory(Object element) {
if (element instanceof Extension)
return 0;
if (element instanceof Name) {
return 1;
}
return 2;
}
@Override
public int compare(Viewer viewer,Object e1,Object e2) {
final int compare= getCategory(e1) - getCategory(e2);
if (compare != 0)
return compare;
return super.compare(viewer, ((Item)e1).name, ((Item)e2).name);
}
}
public abstract static class Item implements Comparable {
public final String name;
public boolean save;
public int mode;
public boolean contributed;
public Item(String name, boolean contributed) { this.name= name; this.contributed = contributed; save= true; mode= Team.BINARY; }
@Override
public int compareTo(Object o) {
return name.compareTo(((Item)o).name);
}
}
public static class Extension extends Item {
public Extension(String name, boolean contributed) { super(name, contributed); }
}
public static class Name extends Item {
public Name(String name, boolean contributed) { super(name, contributed); }
}
private final static int COLUMN_PADDING = 5;
protected static final String ITEM = "item"; //$NON-NLS-1$
protected static final String PROPERTY_MODE= "mode"; //$NON-NLS-1$
protected static final String PROPERTY_SAVE= "save"; //$NON-NLS-1$
private final TableViewer fTableViewer;
private final List fItems;
private final boolean fShowSaveColumn;
public FileTypeTable(Composite composite, List items, boolean showSaveColumn) {
fShowSaveColumn= showSaveColumn;
fItems= items;
/**
* Create a table.
*/
final Table table = new Table(composite, SWT.V_SCROLL | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
table.setLayoutData(SWTUtils.createHVFillGridData());
table.setLinesVisible(true);
table.setHeaderVisible(true);
final PixelConverter converter= SWTUtils.createDialogPixelConverter(composite);
/**
* The 'Extension' column
*/
final TableColumn fileColumn = new TableColumn(table, SWT.NONE, 0);
fileColumn.setWidth(converter.convertWidthInCharsToPixels(TeamUIMessages.FileTypeTable_4.length() + COLUMN_PADDING));
fileColumn.setText(TeamUIMessages.FileTypeTable_4);
/**
* The 'Mode' column
*/
final TableColumn modeColumn = new TableColumn(table, SWT.NONE, 1);
int length;
try {
length = TeamUIMessages.FileTypeTable_5.length();
length = Math.max(length, TeamUIMessages.FileTypeTable_0.length());
length = Math.max(length, TeamUIMessages.FileTypeTable_1.length());
} catch (RuntimeException e) {
// There may be an unbound message so just pick a reasonable length
length = 15;
}
modeColumn.setWidth(converter.convertWidthInCharsToPixels(length + COLUMN_PADDING));
modeColumn.setText(TeamUIMessages.FileTypeTable_5);
/**
* The 'Save' column
*/
if (fShowSaveColumn) {
final TableColumn saveColumn = new TableColumn(table, SWT.NONE, 2);
saveColumn.setWidth(converter.convertWidthInCharsToPixels(TeamUIMessages.FileTypeTable_6.length() + COLUMN_PADDING));
saveColumn.setText(TeamUIMessages.FileTypeTable_6);
}
/**
* Create a viewer for the table.
*/
fTableViewer = new TableViewer(table);
fTableViewer.setContentProvider(this);
fTableViewer.setLabelProvider(this);
fTableViewer.setComparator(new FileTypeComparator());
/**
* Add a cell editor in the Keyword Substitution Mode column
*/
new TableEditor(table);
final CellEditor modeEditor = new ComboBoxCellEditor(table, MODES_TEXT, SWT.READ_ONLY);
final CellEditor saveEditor= new ComboBoxCellEditor(table, SAVE_TEXT, SWT.READ_ONLY);
if (fShowSaveColumn) {
fTableViewer.setCellEditors(new CellEditor[] { null, modeEditor, saveEditor });
fTableViewer.setColumnProperties(new String [] { ITEM, PROPERTY_MODE, PROPERTY_SAVE });
} else {
fTableViewer.setCellEditors(new CellEditor [] { null, modeEditor });
fTableViewer.setColumnProperties(new String [] { ITEM, PROPERTY_MODE });
}
fTableViewer.setCellModifier(this);
fTableViewer.setInput(fItems);
}
@Override
public Object getValue(Object element, String property) {
final Item item= (Item)element;
if (PROPERTY_MODE.equals(property)) {
if (item.mode == Team.BINARY)
return Integer.valueOf(COMBO_INDEX_BINARY);
if (item.mode == Team.TEXT)
return Integer.valueOf(COMBO_INDEX_TEXT);
}
if (fShowSaveColumn && PROPERTY_SAVE.equals(property)) {
return Integer.valueOf(item.save ? COMBO_INDEX_SAVE : COMBO_INDEX_DONT_SAVE);
}
return null;
}
@Override
public boolean canModify(Object element, String property) {
return PROPERTY_MODE.equals(property) || (fShowSaveColumn && PROPERTY_SAVE.equals(property));
}
@Override
public void modify(Object element, String property, Object value) {
final IStructuredSelection selection = fTableViewer.getStructuredSelection();
final Item item= (Item)selection.getFirstElement();
if (item == null)
return;
final int comboIndex = ((Integer)value).intValue();
if (PROPERTY_MODE.equals(property)) {
if (comboIndex == COMBO_INDEX_BINARY)
item.mode= Team.BINARY;
if (comboIndex == COMBO_INDEX_TEXT)
item.mode= Team.TEXT;
}
if (fShowSaveColumn && PROPERTY_SAVE.equals(property)) {
item.save= COMBO_INDEX_SAVE == comboIndex;
}
fTableViewer.refresh(item);
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
final Item item= (Item) element;
if (columnIndex == 0) {
String label = (item instanceof Extension ? "*." : "") + item.name; //$NON-NLS-1$ //$NON-NLS-2$
label = TextProcessor.process(label, ".*"); //$NON-NLS-1$
return label;
}
if (columnIndex == 1) {
if (item.mode == Team.BINARY) {
return MODES_TEXT[COMBO_INDEX_BINARY];
} else if (item.mode == Team.TEXT) {
return MODES_TEXT[COMBO_INDEX_TEXT];
}
}
if (columnIndex == 2) {
if (fShowSaveColumn) return SAVE_TEXT[item.save ? COMBO_INDEX_SAVE : COMBO_INDEX_DONT_SAVE];
}
return null;
}
@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) {}
@Override
public Object[] getElements(Object inputElement) {
return ((Collection)inputElement).toArray();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
public IStructuredSelection getSelection() {
return fTableViewer.getStructuredSelection();
}
public void setInput(List items) {
fItems.clear();
fItems.addAll(items);
fTableViewer.refresh();
}
public TableViewer getViewer() {
return fTableViewer;
}
}