blob: 408c473ac30e18333f54f5e96c582274da720f49 [file] [log] [blame]
/**
* Copyright (c) 2011 Forschungszentrum Juelich GmbH
* 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:
* Claudia Knobloch, FZ Juelich
*/
package org.eclipse.ptp.rm.lml.ui.views;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.ptp.rm.lml.core.LMLManager;
import org.eclipse.ptp.rm.lml.core.events.ILguiAddedEvent;
import org.eclipse.ptp.rm.lml.core.events.ILguiRemovedEvent;
import org.eclipse.ptp.rm.lml.core.events.IMarkObjectEvent;
import org.eclipse.ptp.rm.lml.core.events.ISelectObjectEvent;
import org.eclipse.ptp.rm.lml.core.events.ITableSortedEvent;
import org.eclipse.ptp.rm.lml.core.events.IUnmarkObjectEvent;
import org.eclipse.ptp.rm.lml.core.events.IUnselectedObjectEvent;
import org.eclipse.ptp.rm.lml.core.events.IViewUpdateEvent;
import org.eclipse.ptp.rm.lml.core.listeners.ILMLListener;
import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
import org.eclipse.ptp.rm.lml.core.model.ITableColumnLayout;
import org.eclipse.ptp.rm.lml.internal.core.model.Cell;
import org.eclipse.ptp.rm.lml.internal.core.model.LMLColor;
import org.eclipse.ptp.rm.lml.internal.core.model.Row;
import org.eclipse.ptp.rm.lml.ui.UIUtils;
import org.eclipse.ptp.rm.lml.ui.messages.Messages;
import org.eclipse.ptp.rm.lml.ui.providers.EventForwarder;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.UIJob;
public class TableView extends ViewPart {
private final class LMLTableListListener implements ILMLListener {
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.ILguiAddedEvent)
*/
public void handleEvent(ILguiAddedEvent event) {
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
if (composite != null && !viewCreated) {
fLguiItem = lmlManager.getSelectedLguiItem();
if (fLguiItem != null) {
createTable();
viewCreated = true;
if (fLguiItem.getObjectStatus() != null) {
fLguiItem.getObjectStatus().addComponent(eventForwarder);
componentAdded = true;
}
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.ILguiRemovedEvent)
*/
public void handleEvent(ILguiRemovedEvent event) {
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
if (composite != null && fLguiItem != null && viewCreated) {
if (componentAdded) {
fLguiItem.getObjectStatus().removeComponent(eventForwarder);
componentAdded = false;
}
saveColumnLayout();
fLguiItem = null;
setViewerInput();
disposeTable();
viewCreated = false;
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.IMarkObjectEvent)
*/
public void handleEvent(IMarkObjectEvent event) {
selectedOid = event.getOid();
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
// if (composite != null && !composite.isDisposed()) {
// viewer.refresh();
// }
if (composite != null && !composite.isDisposed() && viewer.getInput() != null) {
tree.deselectAll();
Row[] rows = null;
if (viewer.getInput() instanceof Row[]) {
rows = (Row[]) viewer.getInput();
}
int index = -1;
if (rows != null) {
for (int i = 0; i < rows.length; i++) {
if (rows[i].oid != null && rows[i].oid.equals(selectedOid)) {
index = i;
break;
}
}
}
if (index > -1) {
tree.select(tree.getItem(index));
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.ISelectObjectEvent)
*/
public void handleEvent(ISelectObjectEvent event) {
final String oid = event.getOid();
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
if (composite != null && !composite.isDisposed() && viewer.getInput() != null) {
tree.deselectAll();
Row[] rows = null;
if (viewer.getInput() instanceof Row[]) {
rows = (Row[]) viewer.getInput();
}
int index = -1;
if (rows != null) {
for (int i = 0; i < rows.length; i++) {
if (rows[i].oid != null && rows[i].oid.equals(oid)) {
index = i;
break;
}
}
}
if (index > -1) {
tree.select(tree.getItem(index));
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.ITableSortedEvent)
*/
public void handleEvent(ITableSortedEvent e) {
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
if (fLguiItem != null && fLguiItem.getTableHandler() != null && tree.getSortDirection() != 0
&& tree.getSortColumn() != null) {
fLguiItem.getTableHandler().sort(gid, SWT.UP, getSortIndex(), tree.getSortDirection());
}
setViewerInput();
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.IUnmarkObjectEvent)
*/
public void handleEvent(IUnmarkObjectEvent event) {
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
selectedOid = null;
// if (composite != null && !composite.isDisposed()) {
// viewer.refresh();
// }
if (composite != null && !composite.isDisposed()) {
tree.deselectAll();
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.IUnselectedObjectEvent)
*/
public void handleEvent(IUnselectedObjectEvent event) {
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
if (composite != null && !composite.isDisposed()) {
tree.deselectAll();
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.rm.lml.core.listeners.ILMLListener# handleEvent (org.eclipse.ptp.core.events.IViewUpdateEvent)
*/
public void handleEvent(IViewUpdateEvent event) {
UIUtils.safeRunSyncInUIThread(new SafeRunnable() {
public void run() throws Exception {
if (composite != null && viewCreated) {
if (selectedItem != null && !selectedItem.isDisposed()) {
lmlManager.unmarkObject(selectedItem.getData().toString());
selectedItem = null;
}
if (componentAdded) {
if (fLguiItem != null && fLguiItem.getObjectStatus() != null) {
fLguiItem.getObjectStatus().removeComponent(eventForwarder);
}
componentAdded = false;
}
fLguiItem = lmlManager.getSelectedLguiItem();
if (fLguiItem != null && fLguiItem.getTableHandler() != null && tree.getSortColumn() != null) {
fLguiItem.getTableHandler().getSortProperties(gid);
fLguiItem.getTableHandler().sort(gid, SWT.UP, getSortIndex(), tree.getSortDirection());
}
setViewerInput();
if (fLguiItem != null && fLguiItem.getTableHandler() != null) {
fLguiItem.getObjectStatus().addComponent(eventForwarder);
componentAdded = true;
}
}
}
});
}
}
private Composite composite;
private Menu headerMenu;
private Tree tree;
private TreeColumn[] treeColumns;
private int[] savedColumnWidths;
private TreeColumnLayout treeColumnLayout;
private TreeViewer viewer;
private ILguiItem fLguiItem = null;
private String gid = null;
private final ILMLListener lmlListener = new LMLTableListListener();
private final LMLManager lmlManager = LMLManager.getInstance();
private TreeItem selectedItem = null;
private String selectedOid = null;
private boolean componentAdded = false;
private boolean viewCreated = false;
private boolean isMouseDown = false;
private final EventForwarder eventForwarder = new EventForwarder();
@Override
public void createPartControl(Composite parent) {
gid = getViewSite().getId();
composite = new Composite(parent, SWT.None);
treeColumnLayout = new TreeColumnLayout();
composite.setLayout(treeColumnLayout);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
viewer = new TreeViewer(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.VIRTUAL);
viewer.getTree().setLayout(new TableLayout());
viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
viewer.setContentProvider(new ILazyTreeContentProvider() {
private Row[] rows;
public void dispose() {
// Nothing
}
public Object getParent(Object element) {
if (element instanceof Cell) {
return ((Cell) element).row;
}
return rows;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.rows = (Row[]) newInput;
}
public void updateChildCount(Object element, int currentChildCount) {
// Nothing
}
public void updateElement(Object parent, int index) {
Object element;
if (parent instanceof Row) {
element = ((Row) parent).cells[index];
} else {
element = rows[index];
}
viewer.replace(parent, index, element);
updateChildCount(element, -1);
}
});
viewer.setUseHashlookup(true);
/*
* Must expand first level of table, otherwise it may not be redrawn.
*/
viewer.setAutoExpandLevel(2);
tree = viewer.getTree();
headerMenu = new Menu(composite);
// Part for the controlling Monitor - context menu
final MenuManager contextMenu = new MenuManager();
contextMenu.setRemoveAllWhenShown(true);
final Menu menu = contextMenu.createContextMenu(composite);
getSite().registerContextMenu(contextMenu, viewer);
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
tree.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) {
final Point pt = tree.getDisplay().map(null, tree, new Point(event.x, event.y));
final Rectangle clientArea = tree.getClientArea();
final boolean header = clientArea.y <= pt.y && pt.y < (clientArea.y + tree.getHeaderHeight());
tree.setMenu(header ? headerMenu : menu);
}
});
/*
* Get the selected LguiItem (if there is one) so that the table will be populated when the it is first created
*/
fLguiItem = lmlManager.getSelectedLguiItem();
createTable();
tree.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (fLguiItem != null) {
saveColumnLayout();
}
}
});
}
@Override
public void dispose() {
lmlManager.removeListener(lmlListener);
}
@Override
public void init(IViewSite site) {
try {
super.init(site);
} catch (final PartInitException e) {
e.printStackTrace();
}
lmlManager.addListener(lmlListener, this.getClass().getName());
}
/**
* Refresh the viewer.
*/
public void refresh() {
new UIJob(Messages.TableUpdate) {
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
if (viewer != null) {
setViewerInput();
viewer.refresh();
}
return Status.OK_STATUS;
}
}.schedule();
}
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
/**
*
* @param tableViewer
* @param fSelected
*/
private void createColumns() {
if (fLguiItem.isLayout() || fLguiItem.getTableHandler() == null) {
return;
}
final ITableColumnLayout[] tableColumnLayouts = fLguiItem.getTableHandler().getTableColumnLayout(gid);
if (tableColumnLayouts == null) {
return;
}
treeColumns = new TreeColumn[tableColumnLayouts.length];
savedColumnWidths = new int[tableColumnLayouts.length + 1];
// first column with color rectangle
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE);
treeViewerColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
final Display display = treeColumns[0].getDisplay();
final Image image = new Image(display, 12, 12);
final GC gc = new GC(image);
if (((Row) element).oid != null && (selectedOid == null || ((Row) element).oid.equals(selectedOid))) {
LMLColor color = ((Row) element).color;
if (color == null) {
color = LMLColor.LIGHT_GRAY;
}
gc.setBackground(new Color(display, color.getRed(), color.getGreen(), color.getBlue()));
} else {
gc.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
}
gc.fillRectangle(image.getBounds().x, image.getBounds().y, image.getBounds().width, image.getBounds().height);
gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
gc.drawRectangle(image.getBounds().x, image.getBounds().y, image.getBounds().width - 1,
image.getBounds().height - 1);
gc.dispose();
return image;
}
@Override
public String getText(Object element) {
return null;
}
});
TreeColumn treeColumn = treeViewerColumn.getColumn();
treeColumn.setMoveable(false);
treeColumn.setResizable(false);
treeColumn.setAlignment(SWT.LEFT);
createMenuItem(headerMenu, treeColumn, 0);
treeColumnLayout.setColumnData(treeColumn, new ColumnPixelData(40, true));
// the remaining columns
for (int i = 0; i < tableColumnLayouts.length; i++) {
treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE);
final int cellNumber = i;
treeViewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
cell.setText(((Row) cell.getElement()).cells[cellNumber].value);
}
});
treeColumn = treeViewerColumn.getColumn();
treeColumn.setMoveable(true);
treeColumn.setText(tableColumnLayouts[i].getTitle());
treeColumn.setAlignment(getColumnAlignment(tableColumnLayouts[i].getStyle()));
if (tableColumnLayouts[i].isActive()) {
final boolean resizable = true;
treeColumn.setResizable(resizable);
/*
* Create the header menu for this column
*/
createMenuItem(headerMenu, treeColumn, i + 1);
/*
* Set the column width
*/
treeColumnLayout.setColumnData(treeColumn,
new ColumnWeightData((int) (tableColumnLayouts[i].getWidth() * composite.getClientArea().width), 10,
resizable));
} else {
final boolean resizable = false;
treeColumn.setResizable(resizable);
/*
* Create the header menu for this column
*/
createMenuItem(headerMenu, treeColumn, i + 1);
/*
* Set the column width
*/
savedColumnWidths[i + 1] = 0;
treeColumnLayout.setColumnData(treeColumn, new ColumnWeightData(0, 0, resizable));
}
treeColumns[i] = treeColumn;
}
// just a default column
treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE);
treeViewerColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
}
});
treeColumn = treeViewerColumn.getColumn();
treeColumn.setMoveable(true);
treeColumn.setText(""); //$NON-NLS-1$
treeColumn.setAlignment(SWT.TRAIL);
treeColumn.setResizable(false);
treeColumnLayout.setColumnData(treeColumn, new ColumnWeightData(0, 0, false));
/*
* Sorting is done in the model as the table is virtual and has a lazy content provider.
*/
final Listener sortListener = new Listener() {
public void handleEvent(Event e) {
final TreeColumn currentColumn = (TreeColumn) e.widget;
if (tree.getSortColumn() == currentColumn) {
tree.setSortDirection(tree.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP);
} else {
tree.setSortColumn(currentColumn);
tree.setSortDirection(SWT.UP);
}
if (fLguiItem != null && fLguiItem.getTableHandler() != null) {
fLguiItem.getTableHandler().setSortProperties(gid, getSortIndex(), getSortDirectionString());
}
lmlManager.sortLgui();
}
};
for (final TreeColumn col : treeColumns) {
col.addListener(SWT.Selection, sortListener);
}
// Mouse action (in combination with nodedisplay)
if (gid.equals(ILguiItem.ACTIVE_JOB_TABLE)) {
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
if (e.button == 1) {
isMouseDown = true;
final TreeItem item = tree.getItem(new Point(e.x, e.y));
if (item != null && !composite.isDisposed()) {
lmlManager.selectObject(item.getData().toString());
lmlManager.markObject(item.getData().toString());
}
}
}
@Override
public void mouseUp(MouseEvent e) {
if (e.button == 1) {
final TreeItem item = tree.getItem(new Point(e.x, e.y));
if (item != null && !composite.isDisposed()) {
lmlManager.unmarkObject(item.getData().toString());
lmlManager.unselectObject(item.getData().toString());
}
isMouseDown = false;
}
}
});
}
/*
* tree.addMouseMoveListener(new MouseMoveListener() {
*
* public void mouseMove(MouseEvent e) { final TreeItem item = tree.getItem(new Point(e.x, e.y)); if (item == null) {
* return; } if (selectedItem != null && !selectedItem.equals(item)) { if (!selectedItem.isDisposed()) {
* lmlManager.unselectObject(selectedItem.getData().toString()); } } selectedItem = item; if (!selectedItem.isDisposed()) {
* lmlManager.selectObject(selectedItem.getData().toString()); } }
*
* }); tree.addMouseTrackListener(new MouseTrackListener() {
*
* public void mouseEnter(MouseEvent e) { // nothing }
*
* public void mouseExit(MouseEvent e) { if (selectedItem != null && !selectedItem.isDisposed()) {
* lmlManager.unselectObject(selectedItem.getData().toString()); selectedItem = null; } }
*
* public void mouseHover(MouseEvent e) { // nothing } });
*/
}
private void createMenuItem(Menu parent, final TreeColumn column, final int index) {
final MenuItem itemName = new MenuItem(parent, SWT.CHECK);
itemName.setText(column.getText());
itemName.setSelection(column.getResizable());
itemName.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
boolean active = true;
if (itemName.getSelection()) {
if (savedColumnWidths[index] <= 50) {
savedColumnWidths[index] = 50;
}
column.setWidth(savedColumnWidths[index]);
column.setResizable(true);
} else {
savedColumnWidths[index] = column.getWidth();
column.setWidth(0);
column.setResizable(false);
active = false;
}
if (fLguiItem != null) {
fLguiItem.getTableHandler().setTableColumnActive(gid, column.getText(), active);
}
}
});
}
private void createTable() {
if (fLguiItem != null) {
createColumns();
if (fLguiItem.getTableHandler() != null) {
final Object[] sortProperties = fLguiItem.getTableHandler().getSortProperties(gid);
if (!((String) sortProperties[1]).equals(ITableColumnLayout.SORT_DIRECTION_NONE)
&& ((Integer) sortProperties[0]) != -1) {
tree.setSortDirection(getSortDirectionInt((String) sortProperties[1]));
tree.setSortColumn(getSortColumn((Integer) sortProperties[0]));
fLguiItem.getTableHandler().sort(gid, SWT.UP, getSortIndex(), tree.getSortDirection());
}
}
}
// Insert the input
setViewerInput();
composite.layout();
}
/**
* Disposing the table.
*
* Setting defaults values to sort column and sort direction. Deleting for every TreeColumn corresponding listeners and the
* TreeColumn itself. All MenuItems from the headerMenu and the MenuManager of the View are also erased.
*/
private void disposeTable() {
tree.setSortColumn(null);
tree.setSortDirection(0);
/*
* Remove columns
*/
final TreeColumn[] oldColumns = tree.getColumns();
for (final TreeColumn oldColumn : oldColumns) {
final Listener[] oldListeners = oldColumn.getListeners(SWT.Selection);
for (final Listener oldListener : oldListeners) {
oldColumn.removeListener(SWT.Selection, oldListener);
}
oldColumn.dispose();
}
treeColumns = new TreeColumn[0];
/*
* Remove menu items
*/
for (final MenuItem item : headerMenu.getItems()) {
item.dispose();
}
getViewSite().getActionBars().getMenuManager().removeAll();
}
private int getColumnAlignment(String alignment) {
if (alignment.equals(ITableColumnLayout.COLUMN_STYLE_LEFT)) {
return SWT.LEAD;
}
if (alignment.equals(ITableColumnLayout.COLUMN_STYLE_RIGHT)) {
return SWT.TRAIL;
}
return SWT.LEAD;
}
private TreeColumn getSortColumn(Integer index) {
TreeColumn column = null;
if (index >= 0 && index < treeColumns.length) {
column = treeColumns[index];
}
return column;
}
private int getSortDirectionInt(String sortDirection) {
if (sortDirection.equals(ITableColumnLayout.SORT_DIRECTION_UP)) {
return SWT.UP;
} else if (sortDirection.equals(ITableColumnLayout.SORT_DIRECTION_DOWN)) {
return SWT.DOWN;
}
return -1;
}
/**
* Determines the sort direction and gives back the int value of the determined sort direction. Default value is "NONE".
*
* @return int value of the determined sort direction
*/
private String getSortDirectionString() {
if (tree.getSortDirection() == SWT.UP) {
return ITableColumnLayout.SORT_DIRECTION_UP;
} else if (tree.getSortDirection() == SWT.DOWN) {
return ITableColumnLayout.SORT_DIRECTION_DOWN;
}
return ITableColumnLayout.SORT_DIRECTION_NONE;
}
/**
* Determines the sort column and gives back the index of the determined sort column. Default value is -1.
*
* @return index value of the determined sort column
*/
private int getSortIndex() {
for (int i = 0; i < treeColumns.length; i++) {
if (treeColumns[i].equals(tree.getSortColumn())) {
return i;
}
}
return -1;
}
/**
*
*
* @return
*/
private Double[] getWidths() {
final TreeColumn[] columns = tree.getColumns();
int width = 0;
for (final TreeColumn column : columns) {
width += column.getWidth();
}
final Double[] widths = new Double[columns.length - 1];
for (int i = 0; i < columns.length - 2; i++) {
final TreeColumn column = columns[i + 1];
Double columnWidth = (double) 0;
if (column.getWidth() > 0) {
columnWidth = Integer.valueOf(column.getWidth()).doubleValue() / width;
}
widths[i] = columnWidth;
}
return widths;
}
/**
* Rearranging of the columns order.
*
* The table of the TableView has two additional columns (one visible, the other is hidden) than there are saved in the inner
* model. This methods eliminates these two columns and rewrite the numbers of the column order. The visible one should always
* be the first, but during moving other columns this fact can change. The hidden column is always the last one.
*
* @param order
* order at the beginning
* @return new column order array with two columns removed
*/
private int[] removeFirstColumn(int[] order) {
final int[] orderNew = new int[order.length - 2];
int dif = 0;
for (int i = 0; i < order.length - 1; i++) {
if (order[i] != 0) {
orderNew[i - dif] = order[i] - 1;
} else {
dif = 1;
}
}
return orderNew;
}
/**
* Determines the current Layout of the view and transmit it to the inner model.
*
* Sends first changes of the column order to the model side, then changes of the width. After that the sorting parameters are
* determined. There can be changes of the column order, so the position of the column is checked also.
*
* The default values of sortIndex and sortDirection are -1 and "NON".
*/
private void saveColumnLayout() {
if (fLguiItem != null && fLguiItem.getTableHandler() != null && tree.getColumnOrder().length != 0) {
final int[] indexe = removeFirstColumn(tree.getColumnOrder());
fLguiItem.getTableHandler().changeTableColumnsOrder(gid, indexe);
fLguiItem.getTableHandler().changeTableColumnsWidth(gid, getWidths());
final int sortIndex = getSortIndex();
final String sortDirection = getSortDirectionString();
int index = 0;
for (int i = 0; i < indexe.length; i++) {
if (indexe[i] == sortIndex) {
index = i;
}
}
fLguiItem.getTableHandler().setSortProperties(gid, index, sortDirection);
}
}
/**
*
*/
private void setViewerInput() {
/*
* Don't change input if mouse is down as this causes a SIGSEGV in SWT!
*/
if (!isMouseDown) {
Row[] input = new Row[0];
if (fLguiItem != null && fLguiItem.getTableHandler() != null) {
input = fLguiItem.getTableHandler().getTableDataWithColor(gid, gid.equals(ILguiItem.ACTIVE_JOB_TABLE));
}
if (!composite.isDisposed()) {
viewer.setInput(input);
viewer.setChildCount(input, input.length);
}
}
}
}