diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util')
13 files changed, 0 insertions, 3236 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlAligner.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlAligner.java deleted file mode 100644 index 5bbcb64b6a..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlAligner.java +++ /dev/null @@ -1,913 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.utility.internal.StringTools; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -/** - * This class is responsible to set a preferred width on the registered widgets - * (either <code>Control</code> or <code>ControlAligner</code>) based on the - * widest widget. - * <p> - * Important: The layout data has to be a <code>GridData</code>. If none is set, - * then a new <code>GridData</code> is automatically created. - * <p> - * Here an example of the result if this aligner is used to align controls - * within either one or two group boxes, the controls added are the labels in - * this case. It is also possible to align controls on the right side of the - * main component, a spacer can be used for extra space. - * <p> - * Here's an example: - * <pre> - * - Group Box 1 --------------------------------------------------------------- - * | -------------------------------------- -------------- | - * | Name: | I | | Browsse... | | - * | -------------------------------------- -------------- | - * | --------- | - * | Preallocation Size: | |I| | - * | --------- | - * | -------------------------------------- | - * | Descriptor: | |v| | - * | -------------------------------------- | - * ----------------------------------------------------------------------------- - * - * - Group Box 2 --------------------------------------------------------------- - * | -------------------------------------- | - * | Mapping Type: | |V| | - * | -------------------------------------- | - * | -------------------------------------- | - * | Check in Script: | I | | - * | -------------------------------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public final class ControlAligner -{ - /** - * Flag used to prevent a validation so it can be done after an operation - * completed. - */ - private boolean autoValidate; - - /** - * The utility class used to support bound properties. - */ - private Collection<Listener> changeSupport; - - /** - * The listener added to each of the controls that listens only to a text - * change. - */ - private Listener listener; - - /** - * Prevents infinite recursion when recalculating the preferred width. - * This happens in an hierarchy of <code>ControlAligner</code>s. The lock - * has to be placed here and not in the {@link ControlAlignerWrapper}. - */ - private boolean locked; - - /** - * The length of the widest control. If the length was not calculated, then - * this value is 0. - */ - private int maximumWidth; - - /** - * The collection of {@link Wrapper}s encapsulating either <code>Control</code>s - * or {@link ControlAligner}s. - */ - private Collection<Wrapper> wrappers; - - /** - * A null-<code>Point</code> object used to clear the preferred size. - */ - private static final Point DEFAULT_SIZE = new Point(SWT.DEFAULT, SWT.DEFAULT); - - /** - * The types of events to listen in order to properly adjust the size of all - * the widgets. - */ - private static final int[] EVENT_TYPES = { - SWT.Dispose, - SWT.Hide, - SWT.Resize, - SWT.Show - }; - - /** - * Creates a new <code>ControlAligner</code>. - */ - public ControlAligner() { - super(); - initialize(); - } - - /** - * Creates a new <code>ControlAligner</code>. - * - * @param controls The collection of <code>Control</code>s - */ - public ControlAligner(Collection<? extends Control> controls) { - this(); - addAllControls(controls); - } - - /** - * Adds the given control. Its width will be used along with the width of all - * the other registered controls in order to get the greater witdh and use - * it as the width for all the controls. - * - * @param control The <code>Control</code> to be added - */ - public void add(Control control) { - - Assert.isNotNull(control, "Can't add null to this ControlAligner"); - - Wrapper wrapper = buildWrapper(control); - wrapper.addListener(listener); - wrappers.add(wrapper); - - revalidate(false); - } - - /** - * Adds the given control. Its width will be used along with the width of all - * the other registered controls in order to get the greater witdh and use - * it as the width for all the controls. - * - * @param controlAligner The <code>ControlAligner</code> to be added - * @exception IllegalArgumentException Can't add the <code>ControlAligner</code> - * to itself - */ - public void add(ControlAligner controlAligner) { - - Assert.isNotNull(controlAligner, "Can't add null to this ControlAligner"); - Assert.isLegal(controlAligner != this, "Can't add the ControlAligner to itself"); - - Wrapper wrapper = buildWrapper(controlAligner); - wrapper.addListener(listener); - wrappers.add(wrapper); - - if (!controlAligner.wrappers.isEmpty()) { - revalidate(false); - } - } - - /** - * Adds the items contained in the given collection into this - * <code>ControlAligner</code>. The preferred width of each item will be - * used along with the width of all the other items in order to get the - * widest control and use its width as the width for all the controls. - * - * @param aligners The collection of <code>ControlAligner</code>s - */ - public void addAllControlAligners(Collection<ControlAligner> aligners) { - - // Deactivate the auto validation while adding all the Controls and/or - // ControlAligners in order to improve performance - boolean oldAutoValidate = autoValidate; - autoValidate = false; - - for (ControlAligner aligner : aligners) { - add(aligner); - } - - autoValidate = oldAutoValidate; - revalidate(false); - } - - /** - * Adds the items contained in the given collection into this - * <code>ControlAligner</code>. The preferred width of each item will be - * used along with the width of all the other items in order to get the - * widest control and use its width as the width for all the controls. - * - * @param controls The collection of <code>Control</code>s - */ - public void addAllControls(Collection<? extends Control> controls) { - - // Deactivate the auto validation while adding all the Controls and/or - // ControlAligners in order to improve performance - boolean oldAutoValidate = autoValidate; - autoValidate = false; - - for (Control control : controls) { - add(control); - } - - autoValidate = oldAutoValidate; - revalidate(false); - } - - /** - * Adds the given <code>ControListener</code>. - * - * @param listener The <code>Listener</code> to be added - */ - private void addListener(Listener listener) { - - if (changeSupport == null) { - changeSupport = new ArrayList<Listener>(); - } - - changeSupport.add(listener); - } - - /** - * Creates a new <code>Wrapper</code> that encapsulates the given source. - * - * @param control The control to be wrapped - * @return A new {@link Wrapper} - */ - private Wrapper buildWrapper(Control control) { - return new ControlWrapper(control); - } - - /** - * Creates a new <code>Wrapper</code> that encapsulates the given source. - * - * @param ControlAligner The <code>ControlAligner</code> to be wrapped - * @return A new {@link ControlAlignerWrapper} - */ - private Wrapper buildWrapper(ControlAligner ControlAligner) { - return new ControlAlignerWrapper(ControlAligner); - } - - /** - * Calculates the width taken by the widgets and returns the maximum width. - * - * @param recalculateSize <code>true</code> to recalculate the preferred size - * of all the wrappers contained within them rather than using the cached - * size; <code>false</code> to use the cached size - */ - private int calculateWidth(boolean recalculateSize) { - - int width = 0; - - for (Wrapper wrapper : wrappers) { - Point size = wrapper.cachedSize(); - - // The size has not been calculated yet - if (recalculateSize || (size.x == 0)) { - size = wrapper.calculateSize(); - } - - // Only keep the greatest width - width = Math.max(size.x, width); - } - - return width; - } - - /** - * Reports a bound property change. - * - * @param oldValue the old value of the property (as an int) - * @param newValue the new value of the property (as an int) - */ - private void controlResized(int oldValue, int newValue) { - - if ((changeSupport != null) && (oldValue != newValue)) { - Event event = new Event(); - event.widget = SWTUtil.getShell(); - event.data = this; - - for (Listener listener : changeSupport) { - listener.handleEvent(event); - } - } - } - - /** - * Disposes this <code>ControlAligner</code>, this can improve the speed of - * disposing a pane. When a pane is disposed, this aligner doesn't need to - * revalidate its size upon dispose of its widgets. - */ - public void dispose() { - - for (Iterator<Wrapper> iter = wrappers.iterator(); iter.hasNext(); ) { - Wrapper wrapper = iter.next(); - wrapper.removeListener(listener); - iter.remove(); - } - - this.wrappers.clear(); - } - - /** - * Returns the length of the widest control. If the length was not - * calculated, then this value is 0. - * - * @return The width of the widest control or 0 if the length has not been - * calculated yet - */ - public int getMaximumWidth() { - return maximumWidth; - } - - /** - * Initializes this <code>ControlAligner</code>. - */ - private void initialize() { - - this.autoValidate = true; - this.maximumWidth = 0; - this.listener = new ListenerHandler(); - this.wrappers = new ArrayList<Wrapper>(); - } - - /** - * Invalidates the size of the given object. - * - * @param source The source object to be invalidated - */ - private void invalidate(Object source) { - - Wrapper wrapper = retrieveWrapper(source); - - if (!wrapper.locked()) { - Point size = wrapper.cachedSize(); - size.x = size.y = 0; - wrapper.setSize(DEFAULT_SIZE); - } - } - - /** - * Updates the maximum length based on the widest control. This methods - * does not update the width of the controls. - * - * @param recalculateSize <code>true</code> to recalculate the preferred size - * of all the wrappers contained within them rather than using the cached - * size; <code>false</code> to use the cached size - */ - private void recalculateWidth(boolean recalculateSize) { - - int width = calculateWidth(recalculateSize); - - try { - locked = true; - setMaximumWidth(width); - } - finally { - locked = false; - } - } - - /** - * Removes the given control. Its preferred width will not be used when - * calculating the preferred width. - * - * @param control The control to be removed - * @exception AssertionFailedException If the given <code>Control</code> is - * <code>null</code> - */ - public void remove(Control control) { - - Assert.isNotNull(control, "The Control to remove cannot be null"); - - Wrapper wrapper = retrieveWrapper(control); - wrapper.removeListener(listener); - wrappers.remove(wrapper); - - revalidate(true); - } - - /** - * Removes the given <code>ControlAligner</code>. Its preferred width - * will not be used when calculating the preferred witdh. - * - * @param controlAligner The <code>ControlAligner</code> to be removed - * @exception AssertionFailedException If the given <code>ControlAligner</code> - * is <code>null</code> - */ - public void remove(ControlAligner controlAligner) { - - Assert.isNotNull(controlAligner, "The ControlAligner to remove cannot be null"); - - Wrapper wrapper = retrieveWrapper(controlAligner); - wrapper.removeListener(listener); - wrappers.remove(wrapper); - - revalidate(true); - } - - /** - * Removes the given <code>Listener</code>. - * - * @param listener The <code>Listener</code> to be removed - */ - private void removeListener(Listener listener) { - - changeSupport.remove(listener); - - if (changeSupport.isEmpty()) { - changeSupport = null; - } - } - - /** - * Retrieves the <code>Wrapper</code> that is encapsulating the given object. - * - * @param source Either a <code>Control</code> or a <code>ControlAligner</code> - * @return Its <code>Wrapper</code> - */ - private Wrapper retrieveWrapper(Object source) { - - for (Wrapper wrapper : wrappers) { - if (wrapper.source() == source) { - return wrapper; - } - } - - throw new IllegalArgumentException("Can't retrieve the Wrapper for " + source); - } - - /** - * If the count of control is greater than one and {@link #isAutoValidate()} - * returns <code>true</code>, then the size of all the registered - * <code>Control</code>s will be udpated. - * - * @param recalculateSize <code>true</code> to recalculate the preferred size - * of all the wrappers contained within them rather than using the cached - * size; <code>false</code> to use the cached size - */ - private void revalidate(boolean recalculateSize) { - - if (autoValidate) { - recalculateWidth(recalculateSize); - updateWrapperSize(recalculateSize); - } - } - - /** - * Bases on the information contained in the given <code>Event</code>, - * resize the controls. - * - * @param event The <code>Event</code> sent by the UI thread when the state - * of a widget changed - */ - private void revalidate(Event event) { - - // We don't need to revalidate during a revalidation process - if (locked) { - return; - } - - Object source; - - if (event.widget != SWTUtil.getShell()) { - source = event.widget; - Control control = (Control) source; - - // When a dialog is opened, we need to actually force a layout of - // the controls, this is required because the control is actually - // not visible when the preferred width is caculated - if (control == control.getShell()) { - if (event.type == SWT.Dispose) { - return; - } - - source = null; - } - } - else { - source = event.data; - } - - // Either remove the ControlWrapper if the widget was disposed or - // invalidate the widget in order to recalculate the preferred size - if (source != null) { - if (event.type == SWT.Dispose) { - Wrapper wrapper = retrieveWrapper(source); - wrappers.remove(wrapper); - } - else { - invalidate(source); - } - } - - // Now revalidate all the Controls and ControlAligners - revalidate(true); - } - - /** - * Sets the length of the widest control. If the length was not calulcated, - * then this value is 0. - * - * @param maximumWidth The width of the widest control - */ - private void setMaximumWidth(int maximumWidth) { - - int oldMaximumWidth = this.maximumWidth; - this.maximumWidth = maximumWidth; - controlResized(oldMaximumWidth, maximumWidth); - } - - /** - * Returns a string representation of this <code>ControlAligner</code>. - * - * @return Information about this object - */ - @Override - public String toString() { - - StringBuffer sb = new StringBuffer(); - sb.append("maximumWidth="); - sb.append(maximumWidth); - sb.append(", wrappers="); - sb.append(wrappers); - return StringTools.buildToStringFor(this, sb); - } - - /** - * Updates the size of every <code>Wrapper</code> based on the maximum width. - * - * @param forceRevalidate <code>true</code> to revalidate the wrapper's size - * even though its current size might be the same as the maximum width; - * <code>false</code> to only revalidate the wrappers with a different width - */ - private void updateWrapperSize(boolean forceRevalidate) { - - for (Wrapper wrapper : wrappers) { - Point cachedSize = wrapper.cachedSize(); - - // No need to change the size of the wrapper since it's always using - // the maximum width - if (forceRevalidate || (cachedSize.x != maximumWidth)) { - Point size = new Point(maximumWidth, cachedSize.y); - wrapper.setSize(size); - } - } - } - - /** - * This <code>Wrapper</code> encapsulates a {@link ControlAligner}. - */ - private class ControlAlignerWrapper implements Wrapper { - /** - * The cached size, which is {@link ControlAligner#maximumWidth}. - */ - private final Point cachedSize; - - /** - * The <code>ControlAligner</code> encapsulated by this - * <code>Wrapper</code>. - */ - private final ControlAligner controlAligner; - - /** - * Creates a new <code>ControlAlignerWrapper</code> that encapsulates - * the given <code>ControlAligner</code>. - * - * @param controlAligner The <code>ControlAligner</code> to be - * encapsulated by this <code>Wrapper</code> - */ - private ControlAlignerWrapper(ControlAligner controlAligner) { - super(); - this.controlAligner = controlAligner; - this.cachedSize = new Point(controlAligner.maximumWidth, 0); - } - - /* - * (non-Javadoc) - */ - public void addListener(Listener listener) { - controlAligner.addListener(listener); - } - - /* - * (non-Javadoc) - */ - public Point cachedSize() { - cachedSize.x = controlAligner.maximumWidth; - return cachedSize; - } - - /* - * (non-Javadoc) - */ - public Point calculateSize() { - - Point size = new Point(controlAligner.calculateWidth(false), 0); - - if (size.x != SWT.DEFAULT) { - cachedSize.x = size.x; - } - else { - cachedSize.x = 0; - } - - if (size.y != SWT.DEFAULT) { - cachedSize.y = size.y; - } - else { - cachedSize.y = 0; - } - - return size; - } - - /* - * (non-Javadoc) - */ - public boolean locked() { - return controlAligner.locked; - } - - /* - * (non-Javadoc) - */ - public void removeListener(Listener listener) { - controlAligner.removeListener(listener); - } - - /* - * (non-Javadoc) - */ - public void setSize(Point size) { - - if (size == DEFAULT_SIZE) { - controlAligner.maximumWidth = 0; - } - else if (controlAligner.maximumWidth != size.x) { - controlAligner.maximumWidth = size.x; - controlAligner.updateWrapperSize(true); - } - } - - /* - * (non-Javadoc) - */ - public Object source() { - return controlAligner; - } - - /* - * (non-Javadoc) - */ - @Override - public String toString() { - - StringBuffer sb = new StringBuffer(); - sb.append("Cached size="); - sb.append(cachedSize); - sb.append(", ControlAligner="); - sb.append(controlAligner); - return StringTools.buildToStringFor(this, sb); - } - } - - /** - * This <code>Wrapper</code> encapsulates a {@link Control}. - */ - private class ControlWrapper implements Wrapper { - /** - * The cached size, which is control's size. - */ - private Point cachedSize; - - /** - * The control to be encapsulated by this <code>Wrapper</code>. - */ - private final Control control; - - /** - * Creates a new <code>controlWrapper</code> that encapsulates the given - * control. - * - * @param control The control to be encapsulated by this <code>Wrapper</code> - */ - private ControlWrapper(Control control) { - super(); - - this.control = control; - this.cachedSize = new Point(0, 0); - } - - /* - * (non-Javadoc) - */ - public void addListener(Listener listener) { - - for (int eventType : EVENT_TYPES) { - control.addListener(eventType, listener); - } - } - - /* - * (non-Javadoc) - */ - public Point cachedSize() { - return cachedSize; - } - - /* - * (non-Javadoc) - */ - public Point calculateSize() { - - cachedSize = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); - - // Update right away the control's GridData - GridData gridData = (GridData) control.getLayoutData(); - - if (gridData == null) { - gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - control.setLayoutData(gridData); - } - - gridData.widthHint = cachedSize.x; - gridData.heightHint = cachedSize.y; - - // Make sure the size is not -1 - if (cachedSize.x == SWT.DEFAULT) { - cachedSize.x = 0; - } - - if (cachedSize.y == SWT.DEFAULT) { - cachedSize.y = 0; - } - - return cachedSize; - } - - /* - * (non-Javadoc) - */ - public boolean locked() { - return false; - } - - /* - * (non-Javadoc) - */ - public void removeListener(Listener listener) { - - for (int eventType : EVENT_TYPES) { - control.removeListener(eventType, listener); - } - } - - /* - * (non-Javadoc) - */ - public void setSize(Point size) { - - if (control.isDisposed()) { - return; - } - - // Update the GridData with the new size - GridData gridData = (GridData) control.getLayoutData(); - - if (gridData == null) { - gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - control.setLayoutData(gridData); - } - - gridData.widthHint = size.x; - gridData.heightHint = size.y; - - // Force the control to be resized, and tell its parent to layout - // its widgets - if (size.x > 0) { -// locked = true; -// try { -//// control.getParent().layout(new Control[] { control }); -// control.getParent().layout(true); -// } -// finally { -// locked = false; -// } - Rectangle bounds = control.getBounds(); - - // Only update the control's width if it's - // different from the current size - if (bounds.width != size.x) { - locked = true; - - try { -// control.setBounds(bounds.x, bounds.y, size.x, size.y); - control.getParent().layout(true); - } - finally - { - locked = false; - } - } - } - } - - /* - * (non-Javadoc) - */ - public Control source() { - return control; - } - - /* - * (non-Javadoc) - */ - @Override - public String toString() { - - StringBuffer sb = new StringBuffer(); - sb.append("Cached size="); - sb.append(cachedSize); - sb.append(", Control="); - sb.append(control); - return StringTools.buildToStringFor(this, sb); - } - } - - /** - * The listener added to each of the control that is notified in order to - * revalidate the preferred size. - */ - private class ListenerHandler implements Listener { - public void handleEvent(Event event) { - ControlAligner.this.revalidate(event); - } - } - - /** - * This <code>Wrapper</code> helps to encapsulate heterogeneous objects and - * apply the same behavior on them. - */ - private interface Wrapper { - /** - * Adds the given <code>Listener</code> to wrapped object in order to - * receive notification when its property changed. - * - * @param listener The <code>Listener</code> to be added - */ - void addListener(Listener listener); - - /** - * Returns the cached size of the encapsulated source. - * - * @return A non-<code>null</code> <code>Point</code> where the x is the - * width and the y is the height of the widget - */ - Point cachedSize(); - - /** - * Calculates the preferred size the wrapped object would take by itself. - * - * @return The calculated size - */ - Point calculateSize(); - - /** - * Prevents infinite recursion when recalculating the preferred width. - * This happens in an hierarchy of <code>ControlAligner</code>s. - * - * @return <code>true</code> to prevent this <code>Wrapper</code> from - * being invalidated; otherwise <code>false</code> - */ - boolean locked(); - - /** - * Removes the given <code>Listener</code>. - * - * @param listener The <code>Listener</code> to be removed - */ - void removeListener(Listener listener); - - /** - * Sets the size on the encapsulated source. - * - * @param size The new size - */ - void setSize(Point size); - - /** - * Returns the encapsulated object. - * - * @return The object that is been wrapped - */ - Object source(); - } -}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlEnabler.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlEnabler.java deleted file mode 100644 index b2d816e52a..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlEnabler.java +++ /dev/null @@ -1,175 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Control; - -/** - * This <code>ControlEnabler</code> keeps the "enabled" state of a collection of - * controls in synch with the provided boolean holder. - * - * @version 2.0 - * @since 2.0 - */ -public class ControlEnabler extends StateController -{ - /** - * Creates a new <code>ControlEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "enabled" state is - * kept in sync with the boolean holder's value - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Control> controls) { - - this(booleanHolder, controls, false); - } - - /** - * Creates a new <code>ControlEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "enabled" state is - * kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Control> controls, - boolean defaultValue) { - - this(booleanHolder, controls.iterator(), defaultValue); - } - - /** - * Creates a new <code>ControlEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param control The control whose "enabled" state is - * kept in sync with the boolean holder's value - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Control control) { - - this(booleanHolder, control, false); - } - - /** - * Creates a new <code>ControlEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "enabled" state is - * kept in sync with the boolean holder's value - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Control... controls) { - - this(booleanHolder, CollectionTools.iterator(controls), false); - } - - /** - * Creates a new <code>ControlEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param control The control whose "enabled" state is - * kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Control control, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.singletonIterator(control), false); - } - - /** - * Creates a new <code>ControlEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "enabled" state is - * kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Control[] controls, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.iterator(controls), defaultValue); - } - - /** - * Creates a new <code>ControlEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls An iterator on the collection of controls whose - * "enabled" state is kept in sync with the boolean holder's value - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Control> controls) { - - this(booleanHolder, controls, false); - } - - /** - * Creates a new <code>ControlEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls An iterator on the collection of controls whose - * "enabled" state is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Control> controls, - boolean defaultValue) { - - super(booleanHolder, wrap(controls), defaultValue); - } - - private static Collection<ControlHolder> wrap(Iterator<? extends Control> controls) { - return CollectionTools.collection(new TransformationIterator<Control, ControlHolder>(controls) { - @Override - protected ControlHolder transform(Control control) { - return new ControlEnablerHolder(control); - } - }); - } - - /** - * This holder holds onto a <code>Control</code> and update its enabled state. - */ - private static class ControlEnablerHolder implements ControlHolder { - - private final Control control; - - ControlEnablerHolder(Control control) { - super(); - this.control = control; - } - - public void updateState(boolean state) { - if (!this.control.isDisposed()) { - this.control.setEnabled(state); - } - } - } -}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlSwitcher.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlSwitcher.java deleted file mode 100644 index 1efb77d9f4..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlSwitcher.java +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import org.eclipse.jpt.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.utility.internal.Transformer; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.ui.part.PageBook; - -/** - * This controller is responsible to switch the active page based on a value. A - * <code>Transformer</code> is used to transformed that value into a - * <code>Control</code>. - * - * @version 2.0 - * @since 2.0 - */ -public final class ControlSwitcher -{ - /** - * The widget that is used to show the active <code>Control</code>. - */ - private PageBook pageBook; - - /** - * The <code>Transformer</code> used to transform the value into a - * <code>Control</code>. - */ - private Transformer<?, Control> paneTransformer; - - /** - * Creates a new <code>ControlSwitcher</code>. - * - * @param switchHolder The holder of the value that will be used to retrieve - * the right <code>Control</code> when passed to the given transformer - * @param paneTransformer The <code>Transformer</code> used to transform the value into a - * <code>Control</code> - * @param pageBook The <code>Transformer</code> used to transform the value - * into a <code>Control</code> - */ - public <T> ControlSwitcher(PropertyValueModel<? extends T> switchHolder, - Transformer<T, Control> paneTransformer, - PageBook pageBook) - { - super(); - initialize(switchHolder, paneTransformer, pageBook); - } - - private PropertyChangeListener buildPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper( - buildPropertyChangeListener_() - ); - } - - private PropertyChangeListener buildPropertyChangeListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent e) { - switchPanes(e.getNewValue()); - } - }; - } - - /** - * Initializes this <code>ControlSwitcher</code>. - * - * @param switchHolder The holder of the value that will be used to retrieve - * the right <code>Control</code> when passed to the given transformer - * @param paneTransformer The <code>Transformer</code> used to transform the value into a - * <code>Control</code> - * @param pageBook The <code>Transformer</code> used to transform the value - * into a <code>Control</code> - */ - private void initialize(PropertyValueModel<?> switchHolder, - Transformer<?, Control> paneTransformer, - PageBook pageBook) - { - this.pageBook = pageBook; - this.paneTransformer = paneTransformer; - - switchHolder.addPropertyChangeListener( - PropertyValueModel.VALUE, - buildPropertyChangeListener() - ); - - switchPanes(switchHolder.getValue()); - } - - /** - * Switches the active page by transforming the given value into its - * corresponding pane. - * - * @param value The state passed to the transformer in order to retrieve the - * new pane - */ - private void switchPanes(Object value) { - - if (pageBook.isDisposed()) { - return; - } - - // Retrieve the Control for the new value - Control pane = transform(value); - boolean visible = (pane != null); - - // Show the new page - if (visible) { - pageBook.showPage(pane); - } - else { - // Note: We can't null due to a bug in PageBook - pageBook.showPage(new Label(pageBook, SWT.SEPARATOR | SWT.HORIZONTAL)); - } - - if (pageBook.isVisible() != visible) { - pageBook.setVisible(visible); - } - - // Revalidate the parents in order to update the layout - SWTUtil.reflow(pageBook); - } - - @SuppressWarnings("unchecked") - private Control transform(Object value) { - return ((Transformer<Object, Control>) paneTransformer).transform(value); - } -}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlVisibilityEnabler.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlVisibilityEnabler.java deleted file mode 100644 index feadf63a7c..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/ControlVisibilityEnabler.java +++ /dev/null @@ -1,174 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Control; - -/** - * This <code>ControlVisibilityEnabler</code> keeps the "visible" state of a - * collection of controls in synch with the provided boolean holder. - * - * @version 2.0 - * @since 2.0 - */ -public class ControlVisibilityEnabler extends StateController -{ - /** - * Creates a new <code>ControlVisibilityEnabler</code> with a default value - * of <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "visible" state is - * kept in sync with the boolean holder's value - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Control> controls) { - - this(booleanHolder, controls, false); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "visible" state is - * kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Control> controls, - boolean defaultValue) { - - this(booleanHolder, controls.iterator(), defaultValue); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code> with a default value of - * <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param control The control whose "visible" state is - * kept in sync with the boolean holder's value - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Control control) { - - this(booleanHolder, control, false); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code> with a default value of - * <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "visible" state is - * kept in sync with the boolean holder's value - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Control... controls) { - - this(booleanHolder, CollectionTools.iterator(controls), false); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param control The control whose "visible" state is kept in sync with the - * boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Control control, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.singletonIterator(control), false); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls The collection of controls whose "visible" state is kept - * in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Control[] controls, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.iterator(controls), defaultValue); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code> with a default value - * of <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls An iterator on the collection of controls whose "visible" - * state is kept in sync with the boolean holder's value - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Control> controls) { - - this(booleanHolder, controls, false); - } - - /** - * Creates a new <code>ControlVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controls An iterator on the collection of controls whose "visible" - * state is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public ControlVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Control> controls, - boolean defaultValue) { - - super(booleanHolder, wrap(controls), defaultValue); - } - - private static Collection<ControlHolder> wrap(Iterator<? extends Control> controls) { - return CollectionTools.collection(new TransformationIterator<Control, ControlHolder>(controls) { - @Override - protected ControlHolder transform(Control control) { - return new ControlVisibilityHolder(control); - } - }); - } - - /** - * This holder holds onto a <code>Control</code> and update its visible state. - */ - private static class ControlVisibilityHolder implements ControlHolder { - private final Control control; - - ControlVisibilityHolder(Control control) { - super(); - this.control = control; - } - - public void updateState(boolean state) { - if (!this.control.isDisposed()) { - this.control.setVisible(state); - } - } - } -} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledButton.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledButton.java deleted file mode 100644 index 4febb30c35..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledButton.java +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: Oracle. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Button; - -/** - * A default implementation of <code>LabeledControl</code> that updates a - * <code>Button</code> when required. - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public final class LabeledButton implements LabeledControl -{ - /** - * The button to be updated with a different icon and text. - */ - private final Button button; - - /** - * Creates a new <code>LabeledButton</code>. - * - * @param button The button that will have its text and icon updated when - * required - * @exception AssertionFailedException If the given <code>Button</code> is - * <code>null</code> - */ - public LabeledButton(Button button) { - super(); - - Assert.isNotNull(button, "The button cannot be null"); - this.button = button; - } - - /* - * (non-Javadoc) - */ - public void setImage(Image image) { - if (!this.button.isDisposed()) { - this.button.setImage(image); - this.button.getParent().layout(true); - } - } - - /* - * (non-Javadoc) - */ - public void setText(String text) { - if (!this.button.isDisposed()) { - this.button.setText(text); - this.button.getParent().layout(true); - } - } -} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledControl.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledControl.java deleted file mode 100644 index 8a9716fa96..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledControl.java +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: Oracle. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import org.eclipse.swt.graphics.Image; - -/** - * This <code>LabeledControl</code> is used to encapsulate a widget and update - * its properties (icon and text). - * - * @see LabeledButton - * @see LabeledLabel - * - * @version 2.0 - * @since 2.0 - */ -public interface LabeledControl { - /** - * Passes the image so the wrapped component can receive it. - * - * @param image The new <code>Image</code> - */ - void setImage(Image image); - - /** - * Passes the text so the wrapped component can receive it. - * - * @param text The new text - */ - void setText(String text); -} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledControlUpdater.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledControlUpdater.java deleted file mode 100644 index e6333aaeb7..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledControlUpdater.java +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.graphics.Image; - -/** - * This updater is responsible to update the <code>LabeledControl</code> when - * the text and the icon need to change. - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public final class LabeledControlUpdater { - - /** - * The wrapper around a control that has text and icon. - */ - private LabeledControl labeledControl; - - /** - * Creates a new <code>LabeledControlUpdater</code>. - * - * @param labeledControl The wrapper around the control that needs to - * have its text updated - * @param textHolder The holder this class will listen for changes - */ - public LabeledControlUpdater(LabeledControl labeledControl, - PropertyValueModel<String> textHolder) - { - this(labeledControl, textHolder, null); - } - - /** - * Creates a new <code>LabeledControlUpdater</code>. - * - * @param labeledControl The wrapper around the control that needs to - * have its image and text updated - * @param imageHolder The holder this class will listen for changes or - * <code>null</code> if the text never changes - * @param textHolder The holder this class will listen for changes or - * <code>null</code> if the image never changes - */ - public LabeledControlUpdater(LabeledControl labeledControl, - PropertyValueModel<String> textHolder, - PropertyValueModel<Image> imageHolder) - { - super(); - initialize(labeledControl, textHolder, imageHolder); - } - - private PropertyChangeListener buildIconListener() { - return new SWTPropertyChangeListenerWrapper(buildIconListener_()); - } - - private PropertyChangeListener buildIconListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent e) { - LabeledControlUpdater.this.setImage((Image) e.getNewValue()); - } - - @Override - public String toString() { - return "LabeledControlUpdater.imageListener"; - } - }; - } - - private PropertyChangeListener buildTextListener() { - return new SWTPropertyChangeListenerWrapper(buildTextListener_()); - } - - private PropertyChangeListener buildTextListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent e) { - LabeledControlUpdater.this.setText((String) e.getNewValue()); - } - - @Override - public String toString() { - return "LabeledControlUpdater.textListener"; - } - }; - } - - private void initialize(LabeledControl labeledControl, - PropertyValueModel<String> textHolder, - PropertyValueModel<Image> imageHolder) - { - Assert.isNotNull(labeledControl, "The LabeledControl cannot be null"); - - this.labeledControl = labeledControl; - - if (textHolder != null) { - textHolder.addPropertyChangeListener(PropertyValueModel.VALUE, buildTextListener()); - setText(textHolder.getValue()); - } - - if (imageHolder != null) { - imageHolder.addPropertyChangeListener(PropertyValueModel.VALUE, buildIconListener()); - setImage(imageHolder.getValue()); - } - } - - private void setImage(Image icon) { - labeledControl.setImage(icon); - } - - private void setText(String text) { - - if (text == null) { - text = ""; - } - - labeledControl.setText(text); - } -}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledLabel.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledLabel.java deleted file mode 100644 index ad4030b9a5..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/LabeledLabel.java +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: Oracle. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Label; - -/** - * A default implementation of <code>LabeledControl</code> that updates an - * <code>Label</code> when required. - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public final class LabeledLabel implements LabeledControl -{ - /** - * The label to be updated with a different icon and text. - */ - private final Label label; - - /** - * Creates a new <code>LabeledButton</code>. - * - * @param label The label that will have its text and icon updated when - * required - * @exception AssertionFailedException If the given <code>Label</code> is - * <code>null</code> - */ - public LabeledLabel(Label label) { - super(); - - Assert.isNotNull(label, "The label cannot be null"); - this.label = label; - } - - /* - * (non-Javadoc) - */ - public void setImage(Image image) { - if (!this.label.isDisposed()) { - this.label.setImage(image); - this.label.getParent().layout(true); - } - } - - /* - * (non-Javadoc) - */ - public void setText(String text) { - if (!this.label.isDisposed()) { - this.label.setText(text); - this.label.getParent().layout(true); - } - } -} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/PaneEnabler.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/PaneEnabler.java deleted file mode 100644 index 6a12881bec..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/PaneEnabler.java +++ /dev/null @@ -1,175 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.jpt.ui.internal.widgets.Pane; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; - -/** - * This <code>PaneEnabler</code> keeps the "enabled" state of a collection of - * controls in synch with the provided boolean holder. - * - * @version 2.0 - * @since 2.0 - */ -public class PaneEnabler extends StateController -{ - /** - * Creates a new <code>PaneEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param pane The pane whose "enabled" state is kept in sync with the - * boolean holder's value - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?> pane) { - - this(booleanHolder, pane, false); - } - - /** - * Creates a new <code>PaneEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "enabled" state is kept in sync - * with the boolean holder's value - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?>... panes) { - - this(booleanHolder, CollectionTools.collection(panes), false); - } - - /** - * Creates a new <code>PaneEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param pane The pane whose "enabled" state is kept in sync with the - * boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?> pane, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.singletonIterator(pane), false); - } - - /** - * Creates a new <code>PaneEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "enabled" state is kept in sync - * with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?>[] panes, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.iterator(panes), defaultValue); - } - - /** - * Creates a new <code>BaseJpaControllerEnabler</code> with a default value - * of* <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "enabled" state is kept in sync - * with the boolean holder's value - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Pane<?>> panes) { - - this(booleanHolder, panes, false); - } - - /** - * Creates a new <code>BaseJpaControllerEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "enabled" state is kept in sync - * with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Pane<?>> panes, - boolean defaultValue) { - - this(booleanHolder, panes.iterator(), defaultValue); - } - - /** - * Creates a new <code>BaseJpaControllerEnabler</code> with a default value of - * <code>false</code> (i.e. disabled). - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes An iterator on the collection of panes whose "enabled" state - * is kept in sync with the boolean holder's value - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Pane<?>> panes) { - - this(booleanHolder, panes, false); - } - - /** - * Creates a new <code>BaseJpaControllerEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes An iterator on the collection of panes whose "enabled" state - * is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Pane<?>> panes, - boolean defaultValue) { - - super(booleanHolder, wrap(panes), defaultValue); - } - - private static Collection<ControlHolder> wrap(Iterator<? extends Pane<?>> panes) { - return CollectionTools.collection(new TransformationIterator<Pane<?>, ControlHolder>(panes) { - @Override - protected ControlHolder transform(Pane<?> pane) { - return new PaneHolder(pane); - } - }); - } - - /** - * This holder holds onto an <code>Pane</code> and update its enabled - * state. - */ - private static class PaneHolder implements ControlHolder { - private final Pane<?> pane; - - PaneHolder(Pane<?> pane) { - super(); - this.pane = pane; - } - - public void updateState(boolean state) { - if (!this.pane.getControl().isDisposed()) { - this.pane.enableWidgets(state); - } - } - } -}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/PaneVisibilityEnabler.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/PaneVisibilityEnabler.java deleted file mode 100644 index 7e6f03d5a0..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/PaneVisibilityEnabler.java +++ /dev/null @@ -1,173 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.jpt.ui.internal.widgets.Pane; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; - -/** - * This <code>PaneVisibilityEnabler</code> keeps the "visible" state of a - * collection of controls in synch with the provided boolean holder. - * - * @version 2.0 - * @since 2.0 - */ -public class PaneVisibilityEnabler extends StateController -{ - /** - * Creates a new <code>PaneVisibilityEnabler</code> with a default value of - * <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param pane The pane whose "visible" state is kept in sync with the - * boolean holder's value - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?> pane) { - - this(booleanHolder, pane, false); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code> with a default value of - * <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "visible" state is kept in sync - * with the boolean holder's value - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?>... panes) { - - this(booleanHolder, CollectionTools.collection(panes), false); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param pane The pane whose "visible" state is kept in sync with the - * boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?> pane, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.singletonIterator(pane), false); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "visible" state is kept in sync - * with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Pane<?>[] panes, - boolean defaultValue) { - - this(booleanHolder, CollectionTools.iterator(panes), defaultValue); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code> with a default value of - * <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "visible" state is kept in sync - * with the boolean holder's value - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Pane<?>> panes) { - - this(booleanHolder, panes, false); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes The collection of panes whose "visible" state is kept in sync - * with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Collection<? extends Pane<?>> panes, - boolean defaultValue) { - - this(booleanHolder, panes.iterator(), defaultValue); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code> with a default value of - * <code>false</code> (i.e. not visible). - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes An iterator on the collection of panes whose "visible" state - * is kept in sync with the boolean holder's value - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Pane<?>> panes) { - - this(booleanHolder, panes, false); - } - - /** - * Creates a new <code>PaneVisibilityEnabler</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param panes An iterator on the collection of panes whose "visible" state - * is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - public PaneVisibilityEnabler(PropertyValueModel<Boolean> booleanHolder, - Iterator<? extends Pane<?>> panes, - boolean defaultValue) { - - super(booleanHolder, wrap(panes), defaultValue); - } - - private static Collection<ControlHolder> wrap(Iterator<? extends Pane<?>> panes) { - return CollectionTools.collection(new TransformationIterator<Pane<?>, ControlHolder>(panes) { - @Override - protected ControlHolder transform(Pane<?> pane) { - return new PaneHolder(pane); - } - }); - } - - /** - * This holder holds onto an <code>Pane</code> and update its visible - * state. - */ - private static class PaneHolder implements ControlHolder { - private final Pane<?> pane; - - PaneHolder(Pane<?> pane) { - super(); - this.pane = pane; - } - - public void updateState(boolean state) { - this.pane.setVisible(state); - } - } -} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/SWTUtil.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/SWTUtil.java deleted file mode 100644 index 741fa067af..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/SWTUtil.java +++ /dev/null @@ -1,684 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.Locale; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.AssertionFailedException; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jpt.ui.internal.widgets.NullPostExecution; -import org.eclipse.jpt.ui.internal.widgets.PostExecution; -import org.eclipse.jpt.utility.internal.ClassTools; -import org.eclipse.swt.custom.CCombo; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Widget; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -/** - * A suite of utility methods related to the user interface. - * - * @version 2.0 - * @since 1.0 - */ -@SuppressWarnings("nls") -public class SWTUtil { - - /** - * Causes the <code>run()</code> method of the given runnable to be invoked - * by the user-interface thread at the next reasonable opportunity. The caller - * of this method continues to run in parallel, and is not notified when the - * runnable has completed. - * - * @param runnable Code to run on the user-interface thread - * @exception org.eclipse.swt.SWTException - * <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @see #syncExec - */ - public static void asyncExec(Runnable runnable) { - getStandardDisplay().asyncExec(runnable); - } - - /** - * Tweaks the given <code>CCombo</code> to remove the default value when the - * widget receives the focus and to show the default when the widget loses - * the focus. - * - * @param combo The widget having a default value that is always at the - * beginning of the list - */ - public static void attachDefaultValueHandler(CCombo combo) { - CComboHandler handler = new CComboHandler(); - combo.addFocusListener(handler); - combo.addModifyListener(handler); - } - - /** - * Tweaks the given <code>Combo</code> to remove the default value when the - * widget receives the focus and to show the default when the widget loses - * the focus. - * - * @param combo The widget having a default value that is always at the - * beginning of the list - */ - public static void attachDefaultValueHandler(Combo combo) { - ComboHandler handler = new ComboHandler(); - combo.addFocusListener(handler); - combo.addModifyListener(handler); - } - - /** - * Retrieves the localized string from the given NLS class by creating the - * key. That key is the concatenation of the composite's short class name - * with the toString() of the given value separated by an underscore. - * - * @param nlsClass The NLS class used to retrieve the localized text - * @param compositeClass The class used for creating the key, its short class - * name is the beginning of the key - * @param value The value used to append its toString() to the generated key - * @return The localized text associated with the value - */ - public static String buildDisplayString(Class<?> nlsClass, - Class<?> compositeClass, - Object value) { - - StringBuilder sb = new StringBuilder(); - sb.append(ClassTools.shortNameFor(compositeClass)); - sb.append("_"); - sb.append(value.toString().toLowerCase(Locale.ENGLISH));//bug 234953 - //TODO in a future release we should not be converting the key using toLowerCase() - - return (String) ClassTools.staticFieldValue(nlsClass, sb.toString()); - } - - /** - * Retrieves the localized string from the given NLS class by creating the - * key. That key is the concatenation of the composite's short class name - * with the toString() of the given value separated by an underscore. - * - * @param nlsClass The NLS class used to retrieve the localized text - * @param composite The object used to retrieve the short class name that is - * the beginning of the key - * @param value The value used to append its toString() to the generated key - * @return The localized text associated with the value - */ - public static final String buildDisplayString(Class<?> nlsClass, - Object composite, - Object value) { - - return buildDisplayString(nlsClass, composite.getClass(), value); - } - - /** - * Creates the <code>Runnable</code> that will invoke the given - * <code>PostExecution</code> in order to its execution to be done in the - * UI thread. - * - * @param dialog The dialog that was just diposed - * @param postExecution The post execution once the dialog is disposed - * @return The <code>Runnable</code> that will invoke - * {@link PostExecution#execute(Dialog)} - */ - @SuppressWarnings("unchecked") - private static <D1 extends Dialog, D2 extends D1> - Runnable buildPostExecutionRunnable( - final D1 dialog, - final PostExecution<D2> postExecution) { - - return new Runnable() { - public void run() { - setUserInterfaceActive(false); - try { - postExecution.execute((D2) dialog); - } - finally { - setUserInterfaceActive(true); - } - } - }; - } - - /** - * Convenience method for getting the current shell. If the current thread is - * not the UI thread, then an invalid thread access exception will be thrown. - * - * @return The shell, never <code>null</code> - */ - public static Shell getShell() { - - // Retrieve the active shell, which can be the shell from any window - Shell shell = getStandardDisplay().getActiveShell(); - - // No shell could be found, revert back to the active workbench window - if (shell == null) { - shell = getWorkbench().getActiveWorkbenchWindow().getShell(); - } - - // Make sure it's never null - if (shell == null) { - shell = new Shell(getStandardDisplay().getActiveShell()); - } - - return shell; - } - - /** - * Returns the standard display to be used. The method first checks, if the - * thread calling this method has an associated display. If so, this display - * is returned. Otherwise the method returns the default display. - * - * @return The current display if not <code>null</code> otherwise the default - * display is returned - */ - public static Display getStandardDisplay() - { - Display display = Display.getCurrent(); - - if (display == null) { - display = Display.getDefault(); - } - - return display; - } - - public static int getTableHeightHint(Table table, int rows) { - if (table.getFont().equals(JFaceResources.getDefaultFont())) - table.setFont(JFaceResources.getDialogFont()); - int result= table.getItemHeight() * rows + table.getHeaderHeight(); - if (table.getLinesVisible()) - result+= table.getGridLineWidth() * (rows - 1); - return result; - } - - /** - * Returns the Platform UI workbench. - * - * @return The workbench for this plug-in - */ - public static IWorkbench getWorkbench() { - return PlatformUI.getWorkbench(); - } - - /** - * Relays out the parents of the <code>Control</code>. This was taken from - * the widget <code>Section</code>. - * - * @param pane The pane to revalidate as well as its parents - */ - public static void reflow(Composite pane) { - - for (Composite composite = pane; composite != null; ) { - composite.setRedraw(false); - composite = composite.getParent(); - - if (composite instanceof ScrolledForm) { - break; - } - } - - for (Composite composite = pane; composite != null; ) { - composite.layout(true); - composite = composite.getParent(); - - if (composite instanceof ScrolledForm) { - ((ScrolledForm) composite).reflow(true); - break; - } - } - - for (Composite composite = pane; composite != null; ) { - composite.setRedraw(true); - composite = composite.getParent(); - - if (composite instanceof ScrolledForm) { - break; - } - } - } - - /** - * Sets whether the entire shell and its widgets should be enabled or - * everything should be unaccessible. - * - * @param active <code>true</code> to make all the UI active otherwise - * <code>false</code> to deactivate it - */ - public static void setUserInterfaceActive(boolean active) { - Shell[] shells = getStandardDisplay().getShells(); - - for (Shell shell : shells) { - shell.setEnabled(active); - } - } - - /** - * Asynchronously launches the specified dialog in the UI thread. - * - * @param dialog The dialog to show on screen - * @param postExecution This interface let the caller to invoke a piece of - * code once the dialog is disposed - */ - public static <D1 extends Dialog, D2 extends D1> - void show(final D1 dialog, final PostExecution<D2> postExecution) { - - try { - Assert.isNotNull(dialog, "The dialog cannot be null"); - Assert.isNotNull(postExecution, "The PostExecution cannot be null"); - } - catch (AssertionFailedException e) { - // Make sure the UI is interactive - setUserInterfaceActive(true); - throw e; - } - - new Thread() { - @Override - public void run() { - asyncExec( - new Runnable() { public void run() { - showImp(dialog, postExecution); - } - } - ); - }}.start(); - } - - /** - * Asynchronously launches the specified dialog in the UI thread. - * - * @param dialog The dialog to show on screen - */ - public static void show(Dialog dialog) { - show(dialog, NullPostExecution.<Dialog>instance()); - } - - /** - * Asynchronously launches the specified dialog in the UI thread. - * - * @param dialog The dialog to show on screen - * @param postExecution This interface let the caller to invoke a piece of - * code once the dialog is disposed - */ - private static <D1 extends Dialog, D2 extends D1> - void showImp(D1 dialog, PostExecution<D2> postExecution) { - - setUserInterfaceActive(true); - dialog.open(); - - if (postExecution != NullPostExecution.<D2>instance()) { - asyncExec(buildPostExecutionRunnable(dialog, postExecution)); - } - } - - /** - * Causes the <code>run()</code> method of the given runnable to be invoked - * by the user-interface thread at the next reasonable opportunity. The - * thread which calls this method is suspended until the runnable completes. - * - * @param runnable code to run on the user-interface thread. - * @see #asyncExec - */ - public static void syncExec(Runnable runnable) { - getStandardDisplay().syncExec(runnable); - } - - /** - * Determines if the current thread is the UI event thread. - * - * @return <code>true</code> if it's the UI event thread, <code>false</code> - * otherwise - */ - public static boolean uiThread() { - return getStandardDisplay().getThread() == Thread.currentThread(); - } - - /** - * Determines if the current thread is the UI event thread by using the - * thread from which the given viewer's display was instantiated. - * - * @param viewer The viewer used to determine if the current thread - * is the UI event thread - * @return <code>true</code> if the current thread is the UI event thread; - * <code>false</code> otherwise - */ - public static boolean uiThread(Viewer viewer) { - return uiThread(viewer.getControl()); - } - - /** - * Determines if the current thread is the UI event thread by using the - * thread from which the given widget's display was instantiated. - * - * @param widget The widget used to determine if the current thread - * is the UI event thread - * @return <code>true</code> if the current thread is the UI event thread; - * <code>false</code> otherwise - */ - public static boolean uiThread(Widget widget) { - return widget.getDisplay().getThread() == Thread.currentThread(); - } - - /** - * This handler is responsible for removing the default value when the combo - * has the focus or when the selected item is the default value and to select - * it when the combo loses the focus. - */ - private static class CComboHandler implements ModifyListener, - FocusListener { - - /** - * This flag is used to prevent the methods of this handler from - * interacting with each other. - */ - private boolean locked; - - /* - * (non-Javadoc) - */ - public void focusGained(FocusEvent e) { - - if (locked) { - return; - } - - CCombo combo = (CCombo) e.widget; - - if (combo.getSelectionIndex() == 0) { - combo.setData("populating", Boolean.TRUE); - locked = true; - - // The text has to be changed outside of the context of this - // listener otherwise the combo won't update because it's currently - // notifying its listeners - asyncExec(new RemoveDefault(combo, Boolean.FALSE)); - } - } - - /* - * (non-Javadoc) - */ - public void focusLost(FocusEvent e) { - - if (locked) { - return; - } - - CCombo combo = (CCombo) e.widget; - - if (combo.getText().length() == 0) { - combo.setData("populating", Boolean.TRUE); - locked = true; - - try { - combo.setText(combo.getItem(0)); - } - finally { - combo.setData("populating", Boolean.FALSE); - locked = false; - } - } - } - - /* - * (non-Javadoc) - */ - public void modifyText(ModifyEvent e) { - - if (locked) { - return; - } - - CCombo combo = (CCombo) e.widget; - - if (combo.isFocusControl() && - combo.getSelectionIndex() <= 0) { - - // Make sure the current text is the default value - String currentValue = combo.getText(); - - if (currentValue.length() > 0 && - combo.getItemCount() > 0 && - !currentValue.equals(combo.getItem(0))) { - - return; - } - - // Remove the default value - Object populating = combo.getData("populating"); - combo.setData("populating", Boolean.TRUE); - locked = true; - - // The text has to be changed outside of the context of this - // listener otherwise the combo won't update because it's currently - // notifying its listeners - asyncExec(new ModifyText(combo, populating)); - } - } - - private class ModifyText implements Runnable { - private final CCombo combo; - private final Object populating; - - public ModifyText(CCombo combo, Object populating) { - super(); - this.combo = combo; - this.populating = populating; - } - - public void run() { - if (this.combo.isDisposed()) { - CComboHandler.this.locked = false; - } - else { - try { - String text = this.combo.getText(); - - if (text.length() == 0) { - text = this.combo.getItem(0); - this.combo.setText(text); - } - - this.combo.setSelection(new Point(0, text.length())); - } - finally { - this.combo.setData("populating", this.populating); - CComboHandler.this.locked = false; - } - } - } - } - - private class RemoveDefault implements Runnable { - private final CCombo combo; - private final Object populating; - - public RemoveDefault(CCombo combo, Object populating) { - super(); - this.combo = combo; - this.populating = populating; - } - - public void run() { - if (this.combo.isDisposed()) { - CComboHandler.this.locked = false; - } - else { - try { - this.combo.setText(""); - } - finally { - this.combo.setData("populating", this.populating); - CComboHandler.this.locked = false; - } - } - } - } - } - - /** - * This handler is responsible for removing the default value when the combo - * has the focus or when the selected item is the default value and to select - * it when the combo loses the focus. - */ - private static class ComboHandler implements ModifyListener, - FocusListener { - - /** - * This flag is used to prevent the methods of this handler from - * interacting with each other. - */ - private boolean locked; - - /* - * (non-Javadoc) - */ - public void focusGained(FocusEvent e) { - - if (locked) { - return; - } - - Combo combo = (Combo) e.widget; - - if (combo.getSelectionIndex() == 0) { - combo.setData("populating", Boolean.TRUE); - locked = true; - - // The text has to be changed outside of the context of this - // listener otherwise the combo won't update because it's currently - // notifying its listeners - asyncExec(new RemoveDefault(combo, Boolean.FALSE)); - } - } - - /* - * (non-Javadoc) - */ - public void focusLost(FocusEvent e) { - - if (locked) { - return; - } - - Combo combo = (Combo) e.widget; - - if (combo.getText().length() == 0) { - combo.setData("populating", Boolean.TRUE); - locked = true; - - try { - combo.select(0); - } - finally { - combo.setData("populating", Boolean.FALSE); - locked = false; - } - } - } - - /* - * (non-Javadoc) - */ - public void modifyText(ModifyEvent e) { - - if (locked) { - return; - } - - Combo combo = (Combo) e.widget; - - if (combo.isFocusControl() && - combo.getSelectionIndex() == 0) { - - Object populating = combo.getData("populating"); - combo.setData("populating", Boolean.TRUE); - locked = true; - - // The text has to be changed outside of the context of this - // listener otherwise the combo won't update because it's currently - // notifying its listeners - asyncExec(new ModifyText(combo, populating)); - } - } - - private class ModifyText implements Runnable { - private final Combo combo; - private final Object populating; - - public ModifyText(Combo combo, Object populating) { - super(); - this.combo = combo; - this.populating = populating; - } - - public void run() { - if (this.combo.isDisposed()) { - ComboHandler.this.locked = false; - } - else { - try { - String text = this.combo.getText(); - - if (text.length() == 0) { - text = this.combo.getItem(0); - this.combo.setText(text); - } - - this.combo.setSelection(new Point(0, text.length())); - } - finally { - this.combo.setData("populating", this.populating); - ComboHandler.this.locked = false; - } - } - } - } - - private class RemoveDefault implements Runnable { - private final Combo combo; - private final Object populating; - - public RemoveDefault(Combo combo, Object populating) { - super(); - this.combo = combo; - this.populating = populating; - } - - public void run() { - if (this.combo.isDisposed()) { - ComboHandler.this.locked = false; - } - else { - try { - this.combo.setText(""); - } - finally { - this.combo.setData("populating", this.populating); - ComboHandler.this.locked = false; - } - } - } - } - } -}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/StateController.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/StateController.java deleted file mode 100644 index f2e051ab3c..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/StateController.java +++ /dev/null @@ -1,320 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.ui.internal.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.iterators.CloneIterator; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; - -/** - * A <code>StateController</code> keeps the state of a collection of widgets in - * synch with the provided boolean holder. - * - * @see ControlEnabler - * @see ControlVisibilityEnabler - * @see PaneEnabler - * @see PaneVisibilityEnabler - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -abstract class StateController -{ - /** - * A listener that allows us to synchronize the controlHolders with changes - * made to the underlying boolean model. - */ - private PropertyChangeListener booleanChangeListener; - - /** - * A value model on the underlying boolean model - */ - private PropertyValueModel<Boolean> booleanHolder; - - /** - * The collection of <code>ControlHolder</code>s whose state is kept in sync - * with the boolean holder's value. - */ - private Collection<ControlHolder> controlHolders; - - /** - * The default setting for the state; for when the underlying model is - * <code>null</code>. The default [default value] is <code>false<code>. - */ - private boolean defaultValue; - - /** - * Creates a new <code>StateController</code>. - */ - StateController() { - super(); - initialize(); - } - - /** - * Creates a new <code>StateController</code> with a default value of - * <code>false</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders The collection of <code>ControlHolder</code>s whose - * state is kept in sync with the boolean holder's value - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - Collection<ControlHolder> controlHolders) { - - this(booleanHolder, controlHolders, false); - } - - /** - * Creates a new <code>StateController</code> with a default value of - * <code>false</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders The collection of <code>ControlHolder</code>s whose - * state is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - Collection<ControlHolder> controlHolders, - boolean defaultValue) { - - this(); - initialize(booleanHolder, controlHolders, defaultValue); - } - - /** - * Creates a new <code>StateController</code> with a default value of - * <code>false</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolder The <code>ControlHolder</code> whose state is kept - * in sync with the boolean holder's value - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - ControlHolder controlHolder) { - - this(booleanHolder, controlHolder, false); - } - - /** - * Creates a new <code>StateController</code> with a default value of - * <code>false</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders The collection of <code>ControlHolder</code>s whose - * state is kept in sync with the boolean holder's value - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - ControlHolder... controlHolders) { - - this(booleanHolder, CollectionTools.collection(controlHolders), false); - } - - /** - * Creates a new <code>StateController</code> with a default value of - * <code>false</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolder The <code>ControlHolder</code> whose state is kept - * in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - ControlHolder controlHolder, - boolean defaultValue) { - - this(booleanHolder, new ControlHolder[] { controlHolder }, false); - } - - /** - * Creates a new <code>StateController</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders The collection of <code>ControlHolder</code>s whose - * state is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - ControlHolder[] controlHolders, - boolean defaultValue) { - - this(); - this.initialize(booleanHolder, CollectionTools.collection(controlHolders), defaultValue); - } - - /** - * Creates a new <code>StateController</code> with a default value of - * <code>false</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders An iterator on the collection of - * <code>ControlHolder</code>s whose state is kept in sync with the boolean - * holder's value - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - Iterator<ControlHolder> controlHolders) { - - this(booleanHolder, CollectionTools.collection(controlHolders), false); - } - - /** - * Creates a new <code>StateController</code>. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders An iterator on the collection of - * <code>ControlHolder</code>s whose state is kept in sync with the boolean - * holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - StateController(PropertyValueModel<Boolean> booleanHolder, - Iterator<ControlHolder> controlHolders, - boolean defaultValue) { - - this(); - initialize(booleanHolder, CollectionTools.collection(controlHolders), defaultValue); - } - - /** - * Returns the boolean primitive of the given <code>Boolean</code> value but - * also checks for <code>null</code>, if that is the case, then - * {@link #defaultValue} is returned. - * - * @param value The <code>Boolean</code> value to be returned as a primitive - * @return The primitive of the given value or {@link #defaultValue}when the - * value is <code>null</code> - */ - protected boolean booleanValue(Boolean value) { - return (value == null) ? this.defaultValue : value; - } - - /** - * Creates a listener for the boolean holder. - * - * @return A new <code>PropertyChangeListener</code> - */ - private PropertyChangeListener buildBooleanChangeListener() { - return new SWTPropertyChangeListenerWrapper( - buildBooleanChangeListener_() - ) - { - @Override - public String toString() { - return "StateController.SWTPropertyChangeListenerWrapper"; - } - }; - } - - /** - * Creates a listener for the boolean holder. - * - * @return A new <code>PropertyChangeListener</code> - */ - private PropertyChangeListener buildBooleanChangeListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent event) { - updateState(); - } - - @Override - public String toString() { - return "StateController.PropertyChangeListener"; - } - }; - } - - /** - * Returns an <code>Iterator</code> over the collection of - * <code>ControlHolder</code>s. - * - * @return The iteration of <code>ControlHolder</code>s - */ - protected final Iterator<ControlHolder> controlHolders() { - return new CloneIterator<ControlHolder>(this.controlHolders); - } - - /** - * Initializes this <code>StateController</code> by building the appropriate - * listeners. - */ - protected void initialize() { - this.booleanChangeListener = this.buildBooleanChangeListener(); - } - - /** - * Initializes this <code>StateController</code> with the given state. - * - * @param booleanHolder A value model on the underlying boolean model - * @param controlHolders A <code>ControlHolder</code>s whose enablement state - * is kept in sync with the boolean holder's value - * @param defaultValue The value to use when the underlying model is - * <code>null</code> - */ - protected void initialize(PropertyValueModel<Boolean> booleanHolder, - Collection<ControlHolder> controlHolders, - boolean defaultValue) { - - Assert.isNotNull(booleanHolder, "The holder of the boolean value cannot be null"); - Assert.isNotNull(controlHolders, "The collection of ControlHolders cannot be null"); - - this.controlHolders = new ArrayList<ControlHolder>(controlHolders); - this.defaultValue = defaultValue; - this.booleanHolder = booleanHolder; - - this.booleanHolder.addPropertyChangeListener( - PropertyValueModel.VALUE, - this.booleanChangeListener - ); - - this.updateState(); - } - - /** - * Updates the state of the control holders. - */ - protected void updateState() { - this.updateState(booleanValue(this.booleanHolder.getValue())); - } - - /** - * Updates the state of the <code>Control</code>s. - * - * @param state The new state the widgets need to have - */ - protected void updateState(boolean state) { - for (ControlHolder controlHolder : this.controlHolders) { - controlHolder.updateState(state); - } - } - - /** - * The holder of the actual widget. - */ - static interface ControlHolder { - - /** - * Updates the state of the wrapped control. - * - * @param state The new state the control should have - */ - void updateState(boolean state); - } -} diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/TableLayoutComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/TableLayoutComposite.java deleted file mode 100644 index a037b12bd1..0000000000 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/util/TableLayoutComposite.java +++ /dev/null @@ -1,189 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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 - *******************************************************************************/ - -package org.eclipse.jpt.ui.internal.util; - -import java.util.ArrayList; -import java.util.List; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.viewers.ColumnLayoutData; -import org.eclipse.jface.viewers.ColumnPixelData; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; - -/** - * A special composite to layout columns inside a table. The composite is needed since we have - * to layout the columns "before" the actual table gets layouted. Hence we can't use a normal - * layout manager. - * - * copied from jdt.internal.ui.util - */ -public class TableLayoutComposite extends Composite { - - /** - * The number of extra pixels taken as horizontal trim by the table column. - * To ensure there are N pixels available for the content of the column, - * assign N+COLUMN_TRIM for the column width. - * - * @since 3.1 - */ - private static int COLUMN_TRIM = "carbon".equals(SWT.getPlatform()) ? 24 : 3; //$NON-NLS-1$ - - private List<ColumnLayoutData> columns= new ArrayList<ColumnLayoutData>(); - - /** - * Creates a new <code>TableLayoutComposite</code>. - */ - public TableLayoutComposite(Composite parent, int style) { - super(parent, style); - addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - Rectangle area= getClientArea(); - Table table= (Table)getChildren()[0]; - Point preferredSize= computeTableSize(table); - int width= area.width - 2 * table.getBorderWidth(); - if (preferredSize.y > area.height) { - // Subtract the scrollbar width from the total column width - // if a vertical scrollbar will be required - Point vBarSize = table.getVerticalBar().getSize(); - width -= vBarSize.x; - } - layoutTable(table, width, area, table.getSize().x < area.width); - } - }); - } - - /** - * Adds a new column of data to this table layout. - * - * @param data the column layout data - */ - public void addColumnData(ColumnLayoutData data) { - columns.add(data); - } - - //---- Helpers ------------------------------------------------------------------------------------- - - private Point computeTableSize(Table table) { - Point result= table.computeSize(SWT.DEFAULT, SWT.DEFAULT); - - int width= 0; - int size= columns.size(); - for (int i= 0; i < size; ++i) { - ColumnLayoutData layoutData= columns.get(i); - if (layoutData instanceof ColumnPixelData) { - ColumnPixelData col= (ColumnPixelData) layoutData; - width += col.width; - if (col.addTrim) { - width += COLUMN_TRIM; - } - } else if (layoutData instanceof ColumnWeightData) { - ColumnWeightData col= (ColumnWeightData) layoutData; - width += col.minimumWidth; - } else { - Assert.isTrue(false, "Unknown column layout data"); //$NON-NLS-1$ - } - } - if (width > result.x) - result.x= width; - return result; - } - - private void layoutTable(Table table, int width, Rectangle area, boolean increase) { - // XXX: Layout is being called with an invalid value the first time - // it is being called on Linux. This method resets the - // Layout to null so we make sure we run it only when - // the value is OK. - if (width <= 1) - return; - - TableColumn[] tableColumns= table.getColumns(); - int size= Math.min(columns.size(), tableColumns.length); - int[] widths= new int[size]; - int fixedWidth= 0; - int numberOfWeightColumns= 0; - int totalWeight= 0; - - // First calc space occupied by fixed columns - for (int i= 0; i < size; i++) { - ColumnLayoutData col= columns.get(i); - if (col instanceof ColumnPixelData) { - ColumnPixelData cpd= (ColumnPixelData) col; - int pixels= cpd.width; - if (cpd.addTrim) { - pixels += COLUMN_TRIM; - } - widths[i]= pixels; - fixedWidth += pixels; - } else if (col instanceof ColumnWeightData) { - ColumnWeightData cw= (ColumnWeightData) col; - numberOfWeightColumns++; - // first time, use the weight specified by the column data, otherwise use the actual width as the weight - // int weight = firstTime ? cw.weight : tableColumns[i].getWidth(); - int weight= cw.weight; - totalWeight += weight; - } else { - Assert.isTrue(false, "Unknown column layout data"); //$NON-NLS-1$ - } - } - - // Do we have columns that have a weight - if (numberOfWeightColumns > 0) { - // Now distribute the rest to the columns with weight. - int rest= width - fixedWidth; - int totalDistributed= 0; - for (int i= 0; i < size; ++i) { - ColumnLayoutData col= columns.get(i); - if (col instanceof ColumnWeightData) { - ColumnWeightData cw= (ColumnWeightData) col; - // calculate weight as above - // int weight = firstTime ? cw.weight : tableColumns[i].getWidth(); - int weight= cw.weight; - int pixels= totalWeight == 0 ? 0 : weight * rest / totalWeight; - if (pixels < cw.minimumWidth) - pixels= cw.minimumWidth; - totalDistributed += pixels; - widths[i]= pixels; - } - } - - // Distribute any remaining pixels to columns with weight. - int diff= rest - totalDistributed; - for (int i= 0; diff > 0; ++i) { - if (i == size) - i= 0; - ColumnLayoutData col= columns.get(i); - if (col instanceof ColumnWeightData) { - ++widths[i]; - --diff; - } - } - } - - if (increase) { - table.setSize(area.width, area.height); - } - for (int i= 0; i < size; i++) { - tableColumns[i].setWidth(widths[i]); - } - if (!increase) { - table.setSize(area.width, area.height); - } - } -} |