/* * Copyright (c) 2004-2011 Marco Maccaferri 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: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.ui.internal.views; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.AbstractTableViewer; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Widget; public class BoxViewer extends AbstractTableViewer { private Composite control; private List<BoxViewerRow> rows = new ArrayList<BoxViewerRow>(); private BoxItem selection; public BoxViewer(Composite parent) { this(parent, SWT.NONE); } public BoxViewer(Composite parent, int style) { control = new Composite(parent, style); RowLayout layout = new RowLayout(SWT.HORIZONTAL); layout.wrap = true; control.setLayout(layout); control.addListener(SWT.MouseDown, new Listener() { @Override public void handleEvent(Event event) { if (selection != event.item) { selection = (BoxItem) event.item; control.notifyListeners(SWT.Selection, event); fireSelectionChanged(new SelectionChangedEvent(BoxViewer.this, selection != null ? new StructuredSelection(selection) : StructuredSelection.EMPTY)); } } }); } BoxItem getItem(int index) { return (BoxItem) rows.get(index).getItem(); } BoxViewerRow getRow(int index) { return rows.get(index); } int getRowCount() { return rows.size(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doClear(int) */ @Override protected void doClear(int index) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doClearAll() */ @Override protected void doClearAll() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doDeselectAll() */ @Override protected void doDeselectAll() { selection = null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doGetColumn(int) */ @Override protected Widget doGetColumn(int index) { return control; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doGetItem(int) */ @Override protected Item doGetItem(int index) { return (Item) rows.get(index).getItem(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doGetItemCount() */ @Override protected int doGetItemCount() { return rows.size(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doGetItems() */ @Override protected Item[] doGetItems() { Item[] items = new Item[rows.size()]; for (int i = 0; i < rows.size(); i++) { items[i] = (Item) rows.get(i).getItem(); } return items; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doGetSelection() */ @Override protected Item[] doGetSelection() { return selection != null ? new Item[] { selection } : new Item[0]; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doGetSelectionIndices() */ @Override protected int[] doGetSelectionIndices() { return new int[0]; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doIndexOf(org.eclipse.swt.widgets.Item) */ @Override protected int doIndexOf(Item item) { for (int i = 0; i < rows.size(); i++) { if (rows.get(i).getItem() == item) { return i; } } return -1; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doRemove(int, int) */ @Override protected void doRemove(int start, int end) { BoxViewerRow[] r = rows.toArray(new BoxViewerRow[rows.size()]); for (int i = start; i <= end; i++) { ((BoxItem) r[i].getItem()).setMenu(null); r[i].getItem().dispose(); rows.remove(r[i]); } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doRemove(int[]) */ @Override protected void doRemove(int[] indices) { BoxViewerRow[] r = rows.toArray(new BoxViewerRow[rows.size()]); for (int i = 0; i < indices.length; i++) { ((BoxItem) r[indices[i]].getItem()).setMenu(null); r[indices[i]].getItem().dispose(); rows.remove(r[indices[i]]); } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doRemoveAll() */ @Override protected void doRemoveAll() { for (int i = 0; i < rows.size(); i++) { ((BoxItem) rows.get(i).getItem()).setMenu(null); rows.get(i).getItem().dispose(); } rows.clear(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doResetItem(org.eclipse.swt.widgets.Item) */ @Override protected void doResetItem(Item item) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doSelect(int[]) */ @Override protected void doSelect(int[] indices) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doSetItemCount(int) */ @Override protected void doSetItemCount(int count) { while (rows.size() > count) { BoxViewerRow row = rows.get(rows.size() - 1); ((BoxItem) row.getItem()).setMenu(null); row.getItem().dispose(); rows.remove(rows.size() - 1); } int columns = doGetColumnCount(); while (rows.size() < count) { BoxItem item = new BoxItem(control, SWT.NONE); item.setMenu(control.getMenu()); BoxViewerRow viewerRow = new BoxViewerRow(item, columns); rows.add(viewerRow); } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doSetSelection(int[]) */ @Override protected void doSetSelection(int[] indices) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doSetSelection(org.eclipse.swt.widgets.Item[]) */ @Override protected void doSetSelection(Item[] items) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doShowItem(org.eclipse.swt.widgets.Item) */ @Override protected void doShowItem(Item item) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doShowSelection() */ @Override protected void doShowSelection() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#internalCreateNewRowPart(int, int) */ @Override protected ViewerRow internalCreateNewRowPart(int style, int rowIndex) { if (rowIndex >= rows.size()) { doSetItemCount(rowIndex + 1); } return rows.get(rowIndex); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ColumnViewer#createViewerEditor() */ @Override protected ColumnViewerEditor createViewerEditor() { return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ColumnViewer#doGetColumnCount() */ @Override protected int doGetColumnCount() { return 5; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ColumnViewer#getItemAt(org.eclipse.swt.graphics.Point) */ @Override protected Item getItemAt(Point point) { Point displayPoint = control.toDisplay(point); for (int i = 0; i < rows.size(); i++) { BoxItem item = (BoxItem) rows.get(i).getItem(); Point p = item.getCanvas().toControl(displayPoint); Rectangle bounds = item.getBounds(); if (p.x >= bounds.x && p.x < bounds.x + bounds.width && p.y >= bounds.y && p.y < bounds.y + bounds.height) { System.out.println("Item is " + item); return item; } } System.out.println("Item is null"); return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ColumnViewer#getViewerRowFromItem(org.eclipse.swt.widgets.Widget) */ @Override protected ViewerRow getViewerRowFromItem(Widget item) { for (int i = 0; i < rows.size(); i++) { if (rows.get(i).getItem() == item) { return rows.get(i); } } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.Viewer#getControl() */ @Override public Control getControl() { return control; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ColumnViewer#update(java.lang.Object, java.lang.String[]) */ @Override public void update(Object element, String[] properties) { super.update(element, properties); control.layout(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.AbstractTableViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean) */ @Override protected void doUpdateItem(Widget widget, Object element, boolean fullMap) { super.doUpdateItem(widget, element, fullMap); ((BoxItem) widget).getCanvas().layout(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.StructuredViewer#refresh() */ @Override public void refresh() { super.refresh(); control.layout(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.StructuredViewer#refresh(boolean) */ @Override public void refresh(boolean updateLabels) { super.refresh(updateLabels); control.layout(); } }