blob: f43b4379659c02a3a585be15b2ee570787fb315f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.ui.internal.preferences;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class ICTable {
private Table table;
private TableViewer viewer;
private final String NAME_COLUMN = Messages.RemoteICViewer_Name;
private final String LOCATION_COLUMN = Messages.RemoteICViewer_URL;
private final String STATUS_COLUMN = Messages.RemoteICViewer_Enabled;
// Set column names
private String[] columnNames = new String[] {NAME_COLUMN,
LOCATION_COLUMN, STATUS_COLUMN};
public ICTable(Composite parent) {
// Create the table
table = createTable(parent);
// Create and setup the TableViewer
viewer = createTableViewer();
loadPreferences();
}
/**
* Release resources
*/
public void dispose() {
// Tell the label provider to release its resources
viewer.getLabelProvider().dispose();
}
/**
* Create the Table
*/
private Table createTable(Composite parent) {
int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;
TableLayout tableLayout = new TableLayout();
Table table = new Table(parent, style);
table.setLayout(tableLayout);
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setFont(parent.getFont());
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.grabExcessHorizontalSpace = true;
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalAlignment = GridData.FILL;
gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
gridData.heightHint = table.getItemHeight();
gridData.horizontalSpan = 1;
table.setLayoutData(gridData);
ColumnLayoutData[] fTableColumnLayouts= {
new ColumnWeightData(85),
new ColumnWeightData(165),
new ColumnWeightData(60)
};
TableColumn column;
tableLayout.addColumnData(fTableColumnLayouts[0]);
column = new TableColumn(table, SWT.NONE, 0);
column.setResizable(fTableColumnLayouts[0].resizable);
column.setText(NAME_COLUMN);
tableLayout.addColumnData(fTableColumnLayouts[1]);
column = new TableColumn(table, SWT.NONE, 1);
column.setResizable(fTableColumnLayouts[1].resizable);
column.setText(LOCATION_COLUMN);
tableLayout.addColumnData(fTableColumnLayouts[2]);
column = new TableColumn(table, SWT.NONE, 2);
column.setResizable(fTableColumnLayouts[2].resizable);
column.setText(STATUS_COLUMN);
return table;
}
/**
* Create the TableViewer
*/
private TableViewer createTableViewer() {
TableViewer viewer = new TableViewer(table);
viewer.setUseHashlookup(true);
viewer.setColumnProperties(columnNames);
viewer.setContentProvider(new ICContentProvider());
viewer.setLabelProvider(new ICLabelProvider());
return viewer;
}
/**
* Proxy for the the RemoteICList which provides content
* for the Table. This class implements IRemoteHelpListViewer interface an
* registers itself with RemoteICList
*/
class ICContentProvider implements IStructuredContentProvider
{
private List<IC> content = new ArrayList<>();
@Override
public void dispose() {
content = null;
}
@Override
@SuppressWarnings("unchecked")
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
content = (List<IC>)newInput;
}
@Override
public IC[] getElements(Object inputElement) {
return content.toArray(new IC[content.size()]);
}
}
public class ICLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0:
return ((IC)element).getName();
case 1:
return ((IC)element).getHref();
case 2:
return ((IC)element).isEnabled() ? Messages.RemoteICLabelProvider_4 : Messages.RemoteICLabelProvider_5;
default:
return null;
}
}
}
/**
* @param rics the ordered remote InfoCenters
*/
public void update(List<IC> ics) {
viewer.getContentProvider().inputChanged(viewer, null, ics);
refresh();
}
/**
* Make sure the table viewer shows the latest copy of the ordered InfoCenters
*/
public void refresh() {
viewer.refresh(getICs());
}
/**
* Return the column names in a collection
*
* @return List containing column names
*/
public List<String> getColumnNames() {
return Arrays.asList(columnNames);
}
/**
* @return currently selected item
*/
public ISelection getSelection() {
return viewer.getSelection();
}
/**
* Return the RemoteICList
*/
public List<IC> getICs() {
ICContentProvider p = (ICContentProvider)viewer.getContentProvider();
IC objs[] = p.getElements(null);
List<IC> content = new ArrayList<>();
for (int o=0;o<objs.length;o++)
content.add(objs[o]);
return content;
}
public void setICs(List<IC> ics)
{
List<IC> oldICs = getICs();
for (int o=0;o<oldICs.size();o++)
removeIC(oldICs.get(o));
for (int i=0;i<ics.size();i++)
addIC(ics.get(i));
}
public TableViewer getTableViewer()
{
return viewer;
}
/**
* Return the parent composite
*/
public Control getControl() {
return table.getParent();
}
public Table getTable() {
return table;
}
public void addIC(IC ic)
{
List<IC> content = getICs();
content.add(ic);
getTableViewer().getContentProvider().inputChanged(
getTableViewer(), null, content);
getTableViewer().add(ic);
refresh();
}
public void editIC(IC ic)
{
List<IC> content = getICs();
content.set(getTable().getSelectionIndex(), ic);
getTableViewer().replace(ic,getTable().getSelectionIndex());
getTableViewer().getContentProvider().inputChanged(
getTableViewer(), null, content);
refresh();
}
public void removeIC(IC ic)
{
List<IC> content = getICs();
content.remove(ic);
getTableViewer().getContentProvider().inputChanged(getTableViewer(), null, content);
getTableViewer().remove(ic);
refresh();
}
private void loadPreferences()
{
List<IC> ics = ICPreferences.getICs();
for (int i=0;i<ics.size();i++)
addIC(ics.get(i));
}
}