package org.eclipse.swt.widgets; import java.util.Arrays; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.control.ListView; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.internal.TypedListener; import org.eclipse.swt.internal.Util; public class List extends Scrollable { private ListView<String> control; private ObservableList<String> items; public List(Composite parent, int style) { super(parent, style); } @Override public Node internal_getNativeObject() { return control; } @Override public Point computeSize(int wHint, int hHint, boolean flushCache) { int width = (int) control.prefWidth(javafx.scene.control.Control.USE_COMPUTED_SIZE); int height = (int) control.prefHeight(javafx.scene.control.Control.USE_COMPUTED_SIZE); if (wHint != SWT.DEFAULT) width = wHint; if (hHint != SWT.DEFAULT) height = hHint; return new Point(width, height); } @Override public Point getSize() { return new Point((int)control.getWidth(), (int)control.getHeight()); } @Override protected void createWidget() { control = new ListView<String>(); items = FXCollections.observableArrayList(); control.setItems(items); } public void add (String string) { checkWidget (); if (string == null) error (SWT.ERROR_NULL_ARGUMENT); items.add(string); } public void add (String string, int index) { checkWidget (); if (string == null) error (SWT.ERROR_NULL_ARGUMENT); items.add(index, string); } public void addSelectionListener(SelectionListener listener) { checkWidget (); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); TypedListener typedListener = new TypedListener (listener); addListener (SWT.Selection,typedListener); addListener (SWT.DefaultSelection,typedListener); } public void deselect (int index) { checkWidget (); control.getSelectionModel().clearSelection(index); } public void deselect (int start, int end) { checkWidget (); for( ; start <= end; start++ ) { control.getSelectionModel().clearSelection(start); } } public void deselect (int [] indices) { checkWidget (); for( int i : indices ) { control.getSelectionModel().clearSelection(i); } } public void deselectAll () { checkWidget (); control.getSelectionModel().clearSelection(); } public int getFocusIndex () { checkWidget (); return control.getFocusModel().getFocusedIndex(); } public String getItem (int index) { checkWidget (); return items.get(index); } public int getItemCount () { checkWidget (); return items.size(); } public int getItemHeight () { //TODO Not implemented Util.logNotImplemented(); return -1; } public String [] getItems () { checkWidget (); return items.toArray(new String[0]); } public String [] getSelection () { checkWidget (); return control.getSelectionModel().getSelectedItems().toArray(new String[0]); } public int getSelectionCount () { checkWidget (); return control.getSelectionModel().getSelectedIndices().size(); } public int getSelectionIndex () { checkWidget (); return control.getSelectionModel().getSelectedIndex(); } public int [] getSelectionIndices () { checkWidget (); ObservableList<Integer> l = control.getSelectionModel().getSelectedIndices(); int[] rv = new int[l.size()]; for( int i = 0; i < l.size(); i++ ) { rv[i] = l.get(i).intValue(); } return rv; } public int getTopIndex () { //TODO Not implemented Util.logNotImplemented(); return -1; } public int indexOf (String string) { checkWidget (); return items.indexOf(string); } public int indexOf (String string, int start) { checkWidget (); return items.subList(start, items.size()-1).indexOf(string); } public boolean isSelected (int index) { checkWidget (); return control.getSelectionModel().isSelected(index); } public void remove (int index) { checkWidget (); items.remove(index); } public void remove (int start, int end) { checkWidget (); items.remove(start, end); } public void remove (int [] indices) { checkWidget (); Util.removeListIndices(items, indices); } public void remove (String string) { checkWidget (); items.remove(string); } public void removeAll () { checkWidget (); items.clear(); } public void removeSelectionListener(SelectionListener listener) { //TODO Not implemented Util.logNotImplemented(); } public void select (int index) { checkWidget (); control.getSelectionModel().select(index); } public void select (int start, int end) { checkWidget (); control.getSelectionModel().selectRange(start, end); } public void select (int [] indices) { checkWidget (); if( indices.length == 0 ) { control.getSelectionModel().clearSelection(); } else if( indices.length == 1 ) { control.getSelectionModel().selectIndices(indices[0]); } else { int idx = indices[0]; int[] rest = new int[indices.length-1]; System.arraycopy(indices, 1, rest, 0, indices.length-1); control.getSelectionModel().selectIndices(idx,rest); } } public void selectAll () { checkWidget (); control.getSelectionModel().selectAll(); } public void setItem (int index, String string) { checkWidget (); items.set(index, string); } public void setItems (String [] items) { checkWidget (); this.items.setAll(items); } public void setSelection (int index) { checkWidget (); control.getSelectionModel().clearAndSelect(index); control.getFocusModel().focus(index); } public void setSelection (int start, int end) { checkWidget (); control.getSelectionModel().clearSelection(); select(start, end); control.getFocusModel().focus(end); } public void setSelection(int [] indices) { checkWidget (); control.getSelectionModel().clearSelection(); select(indices); if( indices.length > 0 ) { int[] sorted = new int[indices.length]; System.arraycopy(indices, 0, sorted, 0, indices.length); Arrays.sort(sorted); control.getFocusModel().focus(sorted[sorted.length-1]); } } public void setSelection (String [] items) { checkWidget (); for( String i : items ) { control.getSelectionModel().select(i); } } public void setTopIndex (int index) { //TODO Not implemented Util.logNotImplemented(); } public void showSelection () { checkWidget (); int indices[] = getSelectionIndices(); if( indices.length > 0 ) { int[] sorted = new int[indices.length]; System.arraycopy(indices, 0, sorted, 0, indices.length); Arrays.sort(sorted); control.getFocusModel().focus(sorted[sorted.length-1]); } } }