Java tutorial
/******************************************************************************* * Copyright (c) 2012, 2014 Pivotal Software, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License, * Version 2.0 (the "License); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Pivotal Software, Inc. - initial API and implementation ********************************************************************************/ package cn.dockerfoundry.ide.eclipse.server.ui.internal.editor; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import cn.dockerfoundry.ide.eclipse.server.ui.internal.ColumnSortListener; import cn.dockerfoundry.ide.eclipse.server.ui.internal.editor.ServiceViewColumn.ServiceViewColumnDescriptor; /** * Configures the services viewer providers, sorters and columns. Must be called * before setting the viewer input. * */ public class ServiceViewerConfigurator { private boolean addAutomaticViewerResizing; public ServiceViewerConfigurator() { this.addAutomaticViewerResizing = false; } public ServiceViewerConfigurator enableAutomaticViewerResizing() { addAutomaticViewerResizing = true; return this; } /** * This must be called before setting the viewer input * @param tableViewer */ public void configureViewer(final TableViewer tableViewer) { final Table table = tableViewer.getTable(); table.setHeaderVisible(true); int columnIndex = 0; ServiceViewColumnDescriptor descriptor = ServiceViewColumn.getServiceViewColumnDescriptor(); ServiceViewColumn[] columns = descriptor != null ? descriptor.getServiceViewColumn() : null; if (columns == null) { return; } String[] columnProperties = new String[columns.length]; TableColumn sortColumn = null; for (ServiceViewColumn column : columns) { columnProperties[columnIndex] = column.name(); TableColumn tableColumn = new TableColumn(table, SWT.NONE, columnIndex++); tableColumn.setData(column); tableColumn.setText(column.name()); tableColumn.setWidth(column.getWidth()); tableColumn.addSelectionListener(new ColumnSortListener(tableViewer)); if (column == ServiceViewColumn.Alias) { sortColumn = tableColumn; } } // Add a control listener to resize the columns such that there is no // empty space // after the last column if (addAutomaticViewerResizing) { table.getParent().addControlListener(new ControlAdapter() { public void controlResized(ControlEvent e) { Composite tableComposite = tableViewer.getTable().getParent(); Rectangle tableCompositeArea = tableComposite.getClientArea(); int width = tableCompositeArea.width; resizeTableColumns(width, table); } }); } tableViewer.setColumnProperties(columnProperties); if (sortColumn != null) { table.setSortColumn(sortColumn); table.setSortDirection(SWT.UP); } } protected void resizeTableColumns(int tableWidth, Table table) { TableColumn[] tableColumns = table.getColumns(); if (tableColumns.length == 0) { return; } int total = 0; // resize only if there is empty space at the end of the table for (TableColumn column : tableColumns) { total += column.getWidth(); } if (total < tableWidth) { // resize the last one TableColumn lastColumn = tableColumns[tableColumns.length - 1]; int newWidth = (tableWidth - total) + lastColumn.getWidth(); lastColumn.setWidth(newWidth); } } }