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