1 /******************************************************************************* 2 * Copyright (c) 2011, 2016 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 15 package org.eclipse.help.ui.internal.preferences; 16 17 import java.util.ArrayList; 18 import java.util.Arrays; 19 import java.util.Collections; 20 import java.util.List; 21 22 import org.eclipse.help.ui.internal.Messages; 23 import org.eclipse.jface.dialogs.IDialogConstants; 24 import org.eclipse.jface.viewers.ColumnLayoutData; 25 import org.eclipse.jface.viewers.ColumnWeightData; 26 import org.eclipse.jface.viewers.ISelection; 27 import org.eclipse.jface.viewers.IStructuredContentProvider; 28 import org.eclipse.jface.viewers.ITableLabelProvider; 29 import org.eclipse.jface.viewers.LabelProvider; 30 import org.eclipse.jface.viewers.TableLayout; 31 import org.eclipse.jface.viewers.TableViewer; 32 import org.eclipse.jface.viewers.Viewer; 33 import org.eclipse.swt.SWT; 34 import org.eclipse.swt.graphics.Image; 35 import org.eclipse.swt.layout.GridData; 36 import org.eclipse.swt.widgets.Composite; 37 import org.eclipse.swt.widgets.Control; 38 import org.eclipse.swt.widgets.Table; 39 import org.eclipse.swt.widgets.TableColumn; 40 41 public class ICTable { 42 43 private Table table; 44 private TableViewer viewer; 45 46 private final String NAME_COLUMN = Messages.RemoteICViewer_Name; 47 private final String LOCATION_COLUMN = Messages.RemoteICViewer_URL; 48 private final String STATUS_COLUMN = Messages.RemoteICViewer_Enabled; 49 50 // Set column names 51 private String[] columnNames = new String[] {NAME_COLUMN, 52 LOCATION_COLUMN, STATUS_COLUMN}; 53 54 ICTable(Composite parent)55 public ICTable(Composite parent) { 56 57 // Create the table 58 table = createTable(parent); 59 // Create and setup the TableViewer 60 viewer = createTableViewer(); 61 62 loadPreferences(); 63 } 64 65 /** 66 * Release resources 67 */ dispose()68 public void dispose() { 69 // Tell the label provider to release its resources 70 viewer.getLabelProvider().dispose(); 71 } 72 73 /** 74 * Create the Table 75 */ createTable(Composite parent)76 private Table createTable(Composite parent) { 77 int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION; 78 79 TableLayout tableLayout = new TableLayout(); 80 Table table = new Table(parent, style); 81 table.setLayout(tableLayout); 82 table.setHeaderVisible(true); 83 table.setLinesVisible(true); 84 table.setFont(parent.getFont()); 85 86 GridData gridData = new GridData(GridData.FILL_BOTH); 87 gridData.grabExcessVerticalSpace = true; 88 gridData.grabExcessHorizontalSpace = true; 89 gridData.verticalAlignment = GridData.FILL; 90 gridData.horizontalAlignment = GridData.FILL; 91 gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; 92 gridData.heightHint = table.getItemHeight(); 93 gridData.horizontalSpan = 1; 94 table.setLayoutData(gridData); 95 96 97 98 ColumnLayoutData[] fTableColumnLayouts= { 99 new ColumnWeightData(85), 100 new ColumnWeightData(165), 101 new ColumnWeightData(60) 102 }; 103 104 TableColumn column; 105 106 tableLayout.addColumnData(fTableColumnLayouts[0]); 107 column = new TableColumn(table, SWT.NONE, 0); 108 column.setResizable(fTableColumnLayouts[0].resizable); 109 column.setText(NAME_COLUMN); 110 111 tableLayout.addColumnData(fTableColumnLayouts[1]); 112 column = new TableColumn(table, SWT.NONE, 1); 113 column.setResizable(fTableColumnLayouts[1].resizable); 114 column.setText(LOCATION_COLUMN); 115 116 tableLayout.addColumnData(fTableColumnLayouts[2]); 117 column = new TableColumn(table, SWT.NONE, 2); 118 column.setResizable(fTableColumnLayouts[2].resizable); 119 column.setText(STATUS_COLUMN); 120 121 return table; 122 } 123 124 /** 125 * Create the TableViewer 126 */ createTableViewer()127 private TableViewer createTableViewer() { 128 129 TableViewer viewer = new TableViewer(table); 130 viewer.setUseHashlookup(true); 131 viewer.setColumnProperties(columnNames); 132 viewer.setContentProvider(new ICContentProvider()); 133 viewer.setLabelProvider(new ICLabelProvider()); 134 return viewer; 135 } 136 137 /** 138 * Proxy for the the RemoteICList which provides content 139 * for the Table. This class implements IRemoteHelpListViewer interface an 140 * registers itself with RemoteICList 141 */ 142 class ICContentProvider implements IStructuredContentProvider 143 { 144 private List<IC> content = new ArrayList<>(); 145 146 @Override dispose()147 public void dispose() { 148 content = null; 149 } 150 151 @Override 152 @SuppressWarnings("unchecked") inputChanged(Viewer viewer, Object oldInput, Object newInput)153 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 154 content = (List<IC>)newInput; 155 } 156 157 @Override getElements(Object inputElement)158 public IC[] getElements(Object inputElement) { 159 return content.toArray(new IC[content.size()]); 160 } 161 162 } 163 164 public class ICLabelProvider extends LabelProvider implements ITableLabelProvider { 165 166 @Override getColumnImage(Object element, int columnIndex)167 public Image getColumnImage(Object element, int columnIndex) { 168 return null; 169 } 170 171 @Override getColumnText(Object element, int columnIndex)172 public String getColumnText(Object element, int columnIndex) { 173 switch (columnIndex) { 174 case 0: 175 return ((IC)element).getName(); 176 case 1: 177 return ((IC)element).getHref(); 178 case 2: 179 return ((IC)element).isEnabled() ? Messages.RemoteICLabelProvider_4 : Messages.RemoteICLabelProvider_5; 180 default: 181 return null; 182 } 183 } 184 185 } 186 187 188 189 190 /** 191 * @param ics the ordered remote InfoCenters 192 */ update(List<IC> ics)193 public void update(List<IC> ics) { 194 viewer.getContentProvider().inputChanged(viewer, null, ics); 195 refresh(); 196 } 197 198 /** 199 * Make sure the table viewer shows the latest copy of the ordered InfoCenters 200 */ refresh()201 public void refresh() { 202 viewer.refresh(getICs()); 203 } 204 205 /** 206 * Return the column names in a collection 207 * 208 * @return List containing column names 209 */ getColumnNames()210 public List<String> getColumnNames() { 211 return Arrays.asList(columnNames); 212 } 213 214 /** 215 * @return currently selected item 216 */ getSelection()217 public ISelection getSelection() { 218 return viewer.getSelection(); 219 } 220 221 /** 222 * Return the RemoteICList 223 */ getICs()224 public List<IC> getICs() { 225 ICContentProvider p = (ICContentProvider)viewer.getContentProvider(); 226 IC objs[] = p.getElements(null); 227 List<IC> content = new ArrayList<>(); 228 Collections.addAll(content, objs); 229 return content; 230 } 231 setICs(List<IC> ics)232 public void setICs(List<IC> ics) 233 { 234 List<IC> oldICs = getICs(); 235 for (int o=0;o<oldICs.size();o++) 236 removeIC(oldICs.get(o)); 237 238 for (int i=0;i<ics.size();i++) 239 addIC(ics.get(i)); 240 } 241 getTableViewer()242 public TableViewer getTableViewer() 243 { 244 return viewer; 245 } 246 /** 247 * Return the parent composite 248 */ getControl()249 public Control getControl() { 250 return table.getParent(); 251 } 252 getTable()253 public Table getTable() { 254 return table; 255 } 256 addIC(IC ic)257 public void addIC(IC ic) 258 { 259 List<IC> content = getICs(); 260 content.add(ic); 261 getTableViewer().getContentProvider().inputChanged( 262 getTableViewer(), null, content); 263 getTableViewer().add(ic); 264 refresh(); 265 } 266 editIC(IC ic)267 public void editIC(IC ic) 268 { 269 List<IC> content = getICs(); 270 content.set(getTable().getSelectionIndex(), ic); 271 getTableViewer().replace(ic,getTable().getSelectionIndex()); 272 getTableViewer().getContentProvider().inputChanged( 273 getTableViewer(), null, content); 274 refresh(); 275 } 276 removeIC(IC ic)277 public void removeIC(IC ic) 278 { 279 List<IC> content = getICs(); 280 content.remove(ic); 281 getTableViewer().getContentProvider().inputChanged(getTableViewer(), null, content); 282 getTableViewer().remove(ic); 283 refresh(); 284 } 285 loadPreferences()286 private void loadPreferences() 287 { 288 List<IC> ics = ICPreferences.getICs(); 289 for (int i=0;i<ics.size();i++) 290 addIC(ics.get(i)); 291 } 292 293 } 294