/******************************************************************************* | |
* 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)); | |
} | |
} |