/* | |
* Copyright (C) 2012 The Android Open Source Project | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.motorola.studio.android.wizards.monkey; | |
import java.util.Collection; | |
import java.util.EventListener; | |
import java.util.EventObject; | |
import java.util.LinkedHashSet; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.layout.GridLayout; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Control; | |
/** | |
* DESCRIPTION: | |
* <br> | |
* This class is an abstract implementation of a Composite extension that specific composites | |
* for making Composites listeners. | |
* <br> | |
* It provides common functionalities to those subclasses which assist content validation, | |
* layout, etc. | |
* <br> | |
* RESPONSIBILITY: | |
* <br> | |
* - Provide common functionalities to classes implementing Composites | |
* <br> | |
* COLABORATORS: | |
* <br> | |
* Composite: extends this class | |
* <br> | |
* MagxPropertyCompositeChangeListener: declares this interface for other classes to be able to | |
* listen to change events on the content | |
* <br> | |
* MagxPropertyCompositeChangeEvent: declares the class and uses this kind of event for | |
* notifying content change to listeners | |
* <br> | |
* USAGE: | |
* <br> | |
* This class should be extended by UI classes implementing Composites (property pages, wizards, etc). | |
*/ | |
public abstract class AbstractPropertiesComposite extends Composite | |
{ | |
/** | |
* | |
* This class represents events for notifying content change on AbstractPropertiesComposite | |
* extending classes to registered listeners. | |
* | |
*/ | |
@SuppressWarnings("serial") | |
public class PropertyCompositeChangeEvent extends EventObject | |
{ | |
/** | |
* Creates a new MagxPropertyCompositeChangeEvent object with the composite | |
* that changed as its data. | |
* | |
* @param composite the composite that changed | |
*/ | |
PropertyCompositeChangeEvent(AbstractPropertiesComposite composite) | |
{ | |
super(composite); | |
} | |
} | |
/** | |
* | |
* This interface must be implemented by classes that wish to listen to | |
* changes on AbstractPropertiesComposite extending classes. | |
* | |
*/ | |
public interface PropertyCompositeChangeListener extends EventListener | |
{ | |
/** | |
* Notifies the event of change on AbstractPropertiesComposite extending classes. | |
* | |
* @param e the change event | |
*/ | |
public void compositeChanged(PropertyCompositeChangeEvent e); | |
} | |
// The default value to use for margins, both vertical and horizontal | |
private static final int DEFAULT_MARGIN_SIZE = 20; | |
// collection of registered listeners to this composite | |
private static final Collection<PropertyCompositeChangeListener> listeners = | |
new LinkedHashSet<PropertyCompositeChangeListener>(); | |
public AbstractPropertiesComposite(Composite parent) | |
{ | |
super(parent, SWT.NONE); | |
} | |
/** | |
* Adds the given listener to the list of registered listeners of this composite's changes. | |
* | |
* @param listener the listener to be registered | |
*/ | |
public static void addCompositeChangeListener(PropertyCompositeChangeListener listener) | |
{ | |
listeners.add(listener); | |
} | |
/** | |
* Removes the given listener from the list of registered listeners of this composite's changes. | |
* | |
* @param listener the listener to be unregistered | |
*/ | |
public static void removeCompositeChangeListener(PropertyCompositeChangeListener listener) | |
{ | |
listeners.remove(listener); | |
} | |
/** | |
* Notifies an event of change on the composite to all registered listeners. | |
* | |
* This method must be called by extending classes whenever a change is made to them | |
* that registered listeners should be aware of (examples: typed text, button press, etc) | |
*/ | |
protected void notifyCompositeChangeListeners() | |
{ | |
PropertyCompositeChangeEvent event = new PropertyCompositeChangeEvent(this); | |
for (PropertyCompositeChangeListener listener : listeners) | |
{ | |
listener.compositeChanged(event); | |
} | |
} | |
/** | |
* Given a collection of controls, turn all their enabled status to | |
* the one provided | |
* | |
* @param enabled True to enable all controls in the collection | |
* @param controlsToUpdate A collection of all controls to apply the state provided by enabled parameter | |
*/ | |
protected void updateWidgetEnableStatus(boolean enabled, Collection<Control> controlsToUpdate) | |
{ | |
for (Control control : controlsToUpdate) | |
{ | |
if (!control.isDisposed()) | |
{ | |
control.setEnabled(enabled); | |
} | |
} | |
} | |
/** | |
* Sets the main layout to this composite as a GridLayout with the | |
* given number of columns and with columns not the same width. | |
* | |
* @param numColumns the number of columns for the GridLayout | |
*/ | |
protected final void setMainLayout(int numColumns) | |
{ | |
GridLayout mainLayout = new GridLayout(numColumns, false); | |
mainLayout.marginWidth = DEFAULT_MARGIN_SIZE; | |
mainLayout.marginHeight = DEFAULT_MARGIN_SIZE; | |
this.setLayout(mainLayout); | |
} | |
/** | |
* Declaration of the abstract getErrorMessage() method. | |
* Retrieves the error message associated with the current extending composite | |
* state. | |
* If no error is found with the current state, <code>null</code> <b>must</b> | |
* be returned by the extending composite. | |
* | |
* @return the error message, or <code>null</code> if there are no errors | |
*/ | |
public abstract String getErrorMessage(); | |
} |