Mercurial > projects > dwt2
diff org.eclipse.jface/src/org/eclipse/jface/viewers/Viewer.d @ 12:bc29606a740c
Added dwt-addons in original directory structure of eclipse.org
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 14 Mar 2009 18:23:29 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.eclipse.jface/src/org/eclipse/jface/viewers/Viewer.d Sat Mar 14 18:23:29 2009 +0100 @@ -0,0 +1,424 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation 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: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module org.eclipse.jface.viewers.Viewer; + +import org.eclipse.jface.viewers.IInputSelectionProvider; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.ISelection; + +import org.eclipse.swt.events.HelpEvent; +import org.eclipse.swt.events.HelpListener; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Item; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.ListenerList; +import org.eclipse.jface.util.SafeRunnable; + +import java.lang.all; +import java.util.List; +import java.util.Set; + +/** + * A viewer is a model-based adapter on a widget. + * <p> + * A viewer can be created as an adapter on a pre-existing control (e.g., + * creating a <code>ListViewer</code> on an existing <code>List</code> control). + * All viewers also provide a convenience constructor for creating the control. + * </p> + * <p> + * Implementing a concrete viewer typically involves the following steps: + * <ul> + * <li> + * create SWT controls for viewer (in constructor) (optional) + * </li> + * <li> + * initialize SWT controls from input (inputChanged) + * </li> + * <li> + * define viewer-specific update methods + * </li> + * <li> + * support selections (<code>setSelection</code>, <code>getSelection</code>) + * </li> + * </ul> + * </p> + */ +public abstract class Viewer : IInputSelectionProvider { + + /** + * List of selection change listeners (element type: <code>ISelectionChangedListener</code>). + * + * @see #fireSelectionChanged + */ + private ListenerList selectionChangedListeners; + + /** + * List of help request listeners (element type: <code>org.eclipse.swt.events.HelpListener</code>). + * Help request listeners. + * + * @see #handleHelpRequest + */ + private ListenerList helpListeners; + + /** + * The names of this viewer's properties. + * <code>null</code> if this viewer has no properties. + * + * @see #setData + */ + private String[] keys; + + /** + * The values of this viewer's properties. + * <code>null</code> if this viewer has no properties. + * This array parallels the value of the <code>keys</code> field. + * + * @see #setData + */ + private Object[] values; + + /** + * Remembers whether we've hooked the help listener on the control or not. + */ + private bool helpHooked = false; + + /** + * Help listener for the control, created lazily when client's first help listener is added. + */ + private HelpListener helpListener = null; + + /** + * Unique key for associating element data with widgets. + * @see org.eclipse.swt.widgets.Widget#setData(String, Object) + */ + protected static const String WIDGET_DATA_KEY = "org.eclipse.jface.viewers.WIDGET_DATA";//$NON-NLS-1$ + + /** + * Creates a new viewer. + */ + protected this() { + selectionChangedListeners = new ListenerList(); + helpListeners = new ListenerList(); + } + + /** + * Adds a listener for help requests in this viewer. + * Has no effect if an identical listener is already registered. + * + * @param listener a help listener + */ + public void addHelpListener(HelpListener listener) { + helpListeners.add(cast(Object)listener); + if (!helpHooked) { + Control control = getControl(); + if (control !is null && !control.isDisposed()) { + if (this.helpListener is null) { + this.helpListener = new class HelpListener { + public void helpRequested(HelpEvent event) { + handleHelpRequest(event); + } + }; + } + control.addHelpListener(this.helpListener); + helpHooked = true; + } + } + } + + /* (non-Javadoc) + * Method declared on ISelectionProvider. + */ + public void addSelectionChangedListener(ISelectionChangedListener listener) { + selectionChangedListeners.add(cast(Object)listener); + } + + /** + * Notifies any help listeners that help has been requested. + * Only listeners registered at the time this method is called are notified. + * + * @param event a help event + * + * @see HelpListener#helpRequested(org.eclipse.swt.events.HelpEvent) + */ + protected void fireHelpRequested(HelpEvent event) { + Object[] listeners = helpListeners.getListeners(); + for (int i = 0; i < listeners.length; ++i) { + (cast(HelpListener) listeners[i]).helpRequested(event); + } + } + + /** + * Notifies any selection changed listeners that the viewer's selection has changed. + * Only listeners registered at the time this method is called are notified. + * + * @param event a selection changed event + * + * @see ISelectionChangedListener#selectionChanged + */ + protected void fireSelectionChanged(SelectionChangedEvent event) { + Object[] listeners = selectionChangedListeners.getListeners(); + for (int i = 0; i < listeners.length; ++i) { + SafeRunnable.run(new class(event,cast(ISelectionChangedListener) listeners[i]) SafeRunnable { + ISelectionChangedListener l; + SelectionChangedEvent event_; + this(SelectionChangedEvent a,ISelectionChangedListener b){ + event_=a; + l = b; + } + public void run() { + l.selectionChanged(event_); + } + }); + } + } + + /** + * Returns the primary control associated with this viewer. + * + * @return the SWT control which displays this viewer's content + */ + public abstract Control getControl(); + + /** + * Returns the value of the property with the given name, + * or <code>null</code> if the property is not found. + * <p> + * The default implementation performs a (linear) search of + * an internal table. Overriding this method is generally not + * required if the number of different keys is small. If a more + * efficient representation of a viewer's properties is required, + * override both <code>getData</code> and <code>setData</code>. + * </p> + * + * @param key the property name + * @return the property value, or <code>null</code> if + * the property is not found + */ + public Object getData(String key) { + Assert.isNotNull(key); + if (keys is null) { + return null; + } + for (int i = 0; i < keys.length; i++) { + if (keys[i].equals(key)) { + return values[i]; + } + } + return null; + } + + /* (non-Javadoc) + * Copy-down of method declared on <code>IInputProvider</code>. + */ + public abstract Object getInput(); + + /* (non-Javadoc) + * Copy-down of method declared on <code>ISelectionProvider</code>. + */ + public abstract ISelection getSelection(); + + /** + * Handles a help request from the underlying SWT control. + * The default behavior is to fire a help request, + * with the event's data modified to hold this viewer. + * @param event the event + * + */ + protected void handleHelpRequest(HelpEvent event) { + Object oldData = event.data; + event.data = this; + fireHelpRequested(event); + event.data = oldData; + } + + /** + * Internal hook method called when the input to this viewer is + * initially set or subsequently changed. + * <p> + * The default implementation does nothing. Subclassers may override + * this method to do something when a viewer's input is set. + * A typical use is populate the viewer. + * </p> + * + * @param input the new input of this viewer, or <code>null</code> if none + * @param oldInput the old input element or <code>null</code> if there + * was previously no input + */ + protected void inputChanged(Object input, Object oldInput) { + } + + /** + * Refreshes this viewer completely with information freshly obtained from this + * viewer's model. + */ + public abstract void refresh(); + + /** + * Removes the given help listener from this viewer. + * Has no affect if an identical listener is not registered. + * + * @param listener a help listener + */ + public void removeHelpListener(HelpListener listener) { + helpListeners.remove(cast(Object)listener); + if (helpListeners.size() is 0) { + Control control = getControl(); + if (control !is null && !control.isDisposed()) { + control.removeHelpListener(this.helpListener); + helpHooked = false; + } + } + } + + /* (non-Javadoc) + * Method declared on ISelectionProvider. + */ + public void removeSelectionChangedListener( + ISelectionChangedListener listener) { + selectionChangedListeners.remove(cast(Object)listener); + } + + /** + * Scrolls the viewer's control down by one item from the given + * display-relative coordinates. Returns the newly revealed Item, + * or <code>null</code> if no scrolling occurred or if the viewer + * doesn't represent an item-based widget. + * + * @param x horizontal coordinate + * @param y vertical coordinate + * @return the item scrolled down to + */ + public Item scrollDown(int x, int y) { + return null; + } + + /** + * Scrolls the viewer's control up by one item from the given + * display-relative coordinates. Returns the newly revealed Item, + * or <code>null</code> if no scrolling occurred or if the viewer + * doesn't represent an item-based widget. + * + * @param x horizontal coordinate + * @param y vertical coordinate + * @return the item scrolled up to + */ + public Item scrollUp(int x, int y) { + return null; + } + + /** + * Sets the value of the property with the given name to the + * given value, or to <code>null</code> if the property is to be + * removed. If this viewer has such a property, its value is + * replaced; otherwise a new property is added. + * <p> + * The default implementation records properties in an internal + * table which is searched linearly. Overriding this method is generally not + * required if the number of different keys is small. If a more + * efficient representation of a viewer's properties is required, + * override both <code>getData</code> and <code>setData</code>. + * </p> + * + * @param key the property name + * @param value the property value, or <code>null</code> if + * the property is not found + */ + public void setData(String key, Object value) { + Assert.isNotNull(key); + /* Remove the key/value pair */ + if (value is null) { + if (keys is null) { + return; + } + int index = 0; + while (index < keys.length && !keys[index].equals(key)) { + index++; + } + if (index is keys.length) { + return; + } + if (keys.length is 1) { + keys = null; + values = null; + } else { + String[] newKeys = new String[keys.length - 1]; + Object[] newValues = new Object[values.length - 1]; + System.arraycopy(keys, 0, newKeys, 0, index); + System.arraycopy(keys, index + 1, newKeys, index, + newKeys.length - index); + System.arraycopy(values, 0, newValues, 0, index); + System.arraycopy(values, index + 1, newValues, index, + newValues.length - index); + keys = newKeys; + values = newValues; + } + return; + } + + /* Add the key/value pair */ + if (keys is null) { + keys = [ key ]; + values = [ value ]; + return; + } + for (int i = 0; i < keys.length; i++) { + if (keys[i].equals(key)) { + values[i] = value; + return; + } + } + String[] newKeys = new String[](keys.length + 1); + Object[] newValues = new Object[](values.length + 1); + System.arraycopy(keys, 0, newKeys, 0, keys.length); + System.arraycopy(values, 0, newValues, 0, values.length); + newKeys[keys.length] = key; + newValues[values.length] = value; + keys = newKeys; + values = newValues; + } + + /** + * Sets or clears the input for this viewer. + * + * @param input the input of this viewer, or <code>null</code> if none + */ + public abstract void setInput(Object input); + + /** + * The viewer implementation of this <code>ISelectionProvider</code> + * method make the new selection for this viewer without making it visible. + * <p> + * This method is equivalent to <code>setSelection(selection,false)</code>. + * </p> + * <p> + * Note that some implementations may not be able to set the selection + * without also revealing it, for example (as of 3.3) TreeViewer. + * </p> + */ + public void setSelection(ISelection selection) { + setSelection(selection, false); + } + + /** + * Sets a new selection for this viewer and optionally makes it visible. + * <p> + * Subclasses must implement this method. + * </p> + * + * @param selection the new selection + * @param reveal <code>true</code> if the selection is to be made + * visible, and <code>false</code> otherwise + */ + public abstract void setSelection(ISelection selection, bool reveal); +}