alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.form.layoutsupport;

import java.awt.*;
import java.beans.*;
import org.openide.nodes.*;
import org.netbeans.modules.form.codestructure.*;

/**
 * Main interface for working with various layouts of visual containers
 * in Form Editor. An implementations of this interface should hold some
 * metadata representing the layout, be able to set up live components and
 * containers (according to the metadata), handle code generation and
 * persistence, provide drag&drop and resizing support, etc.
 * This interface is very general, it is not recommended to implement it
 * directly. There is a default implementation - AbstractLayoutSupport - which
 * provides most of the necessary functionality, assuming that the supported
 * layout works with certain patterns and rules.
 *
 * @see LayoutConstraints
 * @see LayoutSupportContext
 *
 * @author Tomas Pavek
 */

public interface LayoutSupportDelegate {

    /** Bit flag indicating possible component resizing in upper direction. */
    final int RESIZE_UP = 1;
    /** Bit flag indicating possible component resizing in down direction. */
    final int RESIZE_DOWN = 2;
    /** Bit flag indicating possible component resizing in left direction. */
    final int RESIZE_LEFT = 4;
    /** Bit flag indicating possible component resizing in right direction. */
    final int RESIZE_RIGHT = 8;

    /** Initialization of the layout delegate before the first use.
     * There are three types of initialization which must be supported:
     * (1) default initialization for an empty (newly created) layout
     *    (lmInstance == null, fromCode == false),
     * (2) initialization from an already existing instance of LayoutManager
     *    (lmInstance != null, fromCode == false),
     * (3) initialization from persistent code structure,
     *    (lmInstance == null, fromCode == true).
     * @param layoutContext provides a necessary context information for the
     *                      layout delegate
     * @param lmInstance LayoutManager instance for initialization (may be null)
     * @param fromCode indicates whether to initialize from code structure
     * @exception any Exception occurred during initialization
     */
    void initialize(LayoutSupportContext layoutContext,
                    LayoutManager lmInstance,
                    boolean fromCode)
        throws Exception;

    /** Gets the supported layout manager or container class. Container class
     * is returned if the delegate is "dedicated" to some special container
     * rather than to a layout manager used generally for any container.
     * @return the class supported by this delegate
     * @see isDedicated method
     */
    Class getSupportedClass();

    /** States whether this delegate class is dedicted to some special
     * container layout.
     * @return true if the delegates supports just certain container only,
     *         false if the delegates supports a layout manager for use in
     *               any container
     * @see getSupportedClass method
     */
    boolean isDedicated();

    /** Indicates whether the layout should be presented as a node in Component
     * Inspector (for setting properties). The node is provided for layout
     * managers typically (except null layou), and not for dedicated containers
     * support.
     * @return whether a node should be created for the layout
     */
    boolean shouldHaveNode();

    /** Provides a localized display name for the layout node (to be used in
     * Component Inspector and Palette).
     * @return display name of supported layout
     */
    String getDisplayName();

    /** Provides an icon to be used for the layout node in Component
     * Inspector. Only 16x16 color icon is required.
     * @param type is one of BeanInfo constants: ICON_COLOR_16x16,
     *        ICON_COLOR_32x32, ICON_MONO_16x16, ICON_MONO_32x32
     * @return icon to be displayed for node in Component Inspector,
     *         null if no icon is provided
     */
    Image getIcon(int type);

    /** This method returns properties of the supported layout (so of some
     * LayoutManager implementation class typically). These properties are
     * editable by the user in Component Inspector when layout node is
     * selected. These are not properties of individual component constraints
     * (see LayoutConstraints.getProperties() for that).
     * @return properties of supported layout
     */
    Node.PropertySet[] getPropertySets();

    /** Returns a class of a customizer for the layout manager being used as
     * a JavaBean. The class should be a java.awt.Component and
     * java.beans.Customizer. Such a customizer is usually provided with the
     * layout bean itself, specified in BeanInfo class. When the customizer is
     * to be used, it is instantiated and given the reference layout manager
     * instance (using Customizer.setObject(...) method).
     * Note: If the layout delegate provides special customizer from
     * getSupportCustomizer() method, it should still return its class here so
     * it is apparent that there is some customizer provided.
     * @return layout customizer class, null if no customizer is provided
     */
    Class getCustomizerClass();

    /** Returns an instance of a special customizer provided by the layout
     * delegate. This customizer need not implement java.beans.Customizer,
     * because its creation is under full control of the layout delegate - and
     * vice versa, the customizer can have full control over the layout
     * delegate (unlike the bean customizer which operates only with layout
     * manager bean instance).
     * Note: If the layout delegate provides the customizer here, the class of
     * the customizer should be also returned from getCustomizerClass() method.
     * @return instance of layout support customizer
     */
    Component getSupportCustomizer();

    /** Gets the complete code for setting up the layout (including adding
     * components).
     * @return whole container's layout code
     */
    CodeGroup getLayoutCode();

    /** Gets code for setting up one component's constraints and adding the
     * component to the layout (container).
     * @return one component's layout code
     */
    CodeGroup getComponentCode(int index);

    /** Gets CodeExpression object representing one component.
     * @param index index of the component in the layout
     * @return CodeExpression for a component
     */
    CodeExpression getComponentCodeExpression(int index);

    /** Gets number of components in the layout.
     * @return number of components in the layout
     */
    int getComponentCount();

    /** This method is called to accept new components before they are added
     * to the layout (by calling addComponents method). It may adjust the
     * constraints, or refuse the components by throwing a RuntimeException
     * (e.g. IllegalArgumentException). It's up to the delagate to display an
     * error or warning message, the exception is not reported outside.
     * To accept any components simply do nothing here.
     * @param compExpressions array of CodeExpression objects representing the
     *        components to be accepted
     * @param constraints array of layout constraints of the components, may
     *        contain nulls
     * @param index position at which the components are to be added (inserted);
     *        -1 means that the components will be added at the end
     * @exception RunTimeException to refuse components
     */
    void acceptNewComponents(CodeExpression[] compExpressions,
                             LayoutConstraints[] constraints,
                             int index);

    /** This method is called after a property of the layout is changed by
     * the user. The delagate implementation may check whether the layout is
     * valid after the change and throw PropertyVetoException if the change
     * should be reverted. It's up to the delagate to display an error or
     * warning message, the exception is not reported outside. To accept any
     * changes simply do nothing here.
     * @param ev PropertyChangeEvent object describing the change
     */
    void acceptContainerLayoutChange(PropertyChangeEvent ev)
        throws PropertyVetoException;

    /** This method is called after a constraint property of some component
     * is changed by the user. The delegate implementation may check if the
     * layout is valid after the change and throw PropertyVetoException if the
     * change should be reverted. It's up to the delagate to display an error
     * or warning message, the exception is not reported outside. To accept
     * any changes simply do nothing here.
     * @param index index of the component in the layout
     * @param ev PropertyChangeEvent object describing the change
     */
    void acceptComponentLayoutChange(int index, PropertyChangeEvent ev)
        throws PropertyVetoException;

    /** Adds new components to the layout. (This is intended just at the
     * metadata level, no real components are added in fact.)
     * @param compExpressions array of CodeExpression objects representing the
     *        components to be added
     * @param constraints array of layout constraints of the components, may
     *        contain nulls
     * @param index position at which the components should be added (inserted);
     *        if -1, the components should be added at the end
     */
    void addComponents(CodeExpression[] compExpressions,
                       LayoutConstraints[] constraints,
                       int index);

    /** Removes one component from the layout (at metadata level).
     * @param index index of the component in the layout
     */
    void removeComponent(int index);

    /** Removes all components from the layout (at metadata level).
     */
    void removeAll();

    /** Indicates whether there's some change in the layout in comparison
     * with the default layout of given container. If there's no change, no
     * code needs to be delegate (e.g. default FlowLayout in JPanel).
     * Note this is related to the container layout only, not to components.
     * @param defaultContainer instance of the default container to compare with
     * @param defaultContainerDelegate effective container delegate of the
     *        default container (e.g. like content pane of JFrame)
     * @return whether the current layout is different from the default one
     */
    boolean isLayoutChanged(Container defaultContainer,
                            Container defaultContainerDelegate);

    /** Gets layout constraints for a component at the given index.
     * @param index index of the component in the layout
     * @return layout constraints of given component
     */
    LayoutConstraints getConstraints(int index);

    /** This method is called when switching layout - giving an opportunity to
     * convert the previous constrainst of components to constraints of the new
     * layout (this layout). This method needs to do nothing if there's no
     * reasonable conversion possible (addComponents method receives null
     * constraints then).
     * @param previousConstraints [input] layout constraints of components in
     *                                    the previous layout
     * @param currentConstraints [output] array of converted constraints for
     *                                    the new layout - to be filled
     * @param components [input] real components in a real container having the
     *                           previous layout
     */
    void convertConstraints(LayoutConstraints[] previousConstraints,
                            LayoutConstraints[] currentConstraints,
                            Component[] components);

    /** Sets up the layout (without adding components) on a real container,
     * according to the internal metadata representation.
     * @param container instance of a real container to be set
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     */
    void setLayoutToContainer(Container container,
                              Container containerDelegate);

    /** Adds real components to given container (according to layout
     * constraints stored for the components).
     * @param container instance of a real container to be added to
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @param components components to be added
     * @param index position at which to add the components to container
     */
    void addComponentsToContainer(Container container,
                                  Container containerDelegate,
                                  Component[] components,
                                  int index);

    /** Removes a real component from a real container.
     * @param container instance of a real container
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @param component component to be removed
     * @return whether it was possible to remove the component (some containers
     *         may not support removing individual components reasonably)
     */
    boolean removeComponentFromContainer(Container container,
                                         Container containerDelegate,
                                         Component component);

    /** Removes all components from given real container.
     * @param container instance of a real container to be cleared
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @return whether it was possible to clear the container (some containers
     *         may not support this)
     */
    boolean clearContainer(Container container, Container containerDelegate);

    /** This method is called when user clicks on the container in form
     * designer. The layout delegate may do something with the container,
     * e.g. for JTabbedPane it might switch the selected TAB.
     * @param p Point of click in the container
     * @param real instance of the container when the click occurred
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     */
    void processMouseClick(Point p,
                           Container container,
                           Container containerDelegate);

    /** This method is called when a component is selected in Component
     * Inspector. If the layout delegate is interested in such information,
     * it should store it and use it e.g. in arrangeContainer method.
     * @param index position (index) of the selected component in container
     */
    void selectComponent(int index);

    /** In this method, the layout delegate has a chance to "arrange" real
     * container instance additionally - some other way that cannot be
     * done through layout properties and added components. For example, the
     * selected component index can be applied here (see delegates for
     * CardLayout and JTabbedPane).
     * @param container instance of a real container to be arranged
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     */
    void arrangeContainer(Container container, Container containerDelegate);

    /** This method should calculate layout constraints for a component dragged
     * over a container (or just for mouse cursor being moved over container,
     * without any component). This method is useful for "constraints oriented"
     * layout managers (like e.g. BorderLayout or GridBagLayout).
     * @param container instance of a real container over/in which the
     *        component is dragged
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @param component the real component being dragged, can be null
     * @param index position (index) of the component in its container;
     *        -1 if there's no dragged component
     * @param posInCont position of mouse in the container delegate
     * @param posInComp position of mouse in the dragged component; null if
     *        there's no dragged component
     * @return new LayoutConstraints object corresponding to the position of
     *         the component in the container; may return null if the layout
     *         does not use component constraints, or if default constraints
     *         should be used
     */
    LayoutConstraints getNewConstraints(Container container,
                                        Container containerDelegate,
                                        Component component,
                                        int index,
                                        Point posInCont,
                                        Point posInComp);

    /** This method should calculate position (index) for a component dragged
     * over a container (or just for mouse cursor being moved over container,
     * without any component). This method is useful for layout managers that
     * don't use component constraints (like e.g. FlowLayout or GridLayout)
     * @param container instance of a real container over/in which the
     *        component is dragged
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @param component the real component being dragged, can be null
     * @param index position (index) of the component in its container;
     *        -1 if there's no dragged component
     * @param posInCont position of mouse in the container delegate
     * @param posInComp position of mouse in the dragged component; null if
     *        there's no dragged component
     * @return index corresponding to the position of the component in the
     *         container; may return -1 if the layout rather uses component
     *         constraints, or if a default index should be used
     */
    int getNewIndex(Container container,
                    Container containerDelegate,
                    Component component,
                    int index,
                    Point posInCont,
                    Point posInComp);

    /** This method should paint a feedback for a component dragged over
     * a container (or just for mouse cursor being moved over container,
     * without any component). In principle, it should present given component
     * layout constraints or index graphically.
     * @param container instance of a real container over/in which the
     *        component is dragged
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame) - here the feedback is painted
     * @param component the real component being dragged, can be null
     * @param newConstraints component layout constraints to be presented
     * @param newIndex component's index position to be presented
     *        (if newConstraints == null)
     * @param g Graphics object for painting (with color and line style set)
     * @return whether any feedback was painted (may return false if the
     *         constraints or index are invalid, or if the painting is not
     *         implemented)
     */
    boolean paintDragFeedback(Container container, 
                              Container containerDelegate,
                              Component component,
                              LayoutConstraints newConstraints,
                              int newIndex,
                              Graphics g);

    /** Provides resizing options for given component. It can combine the
     * bit-flag constants RESIZE_UP, RESIZE_DOWN, RESIZE_LEFT, RESIZE_RIGHT.
     * @param container instance of a real container in which the
     *        component is to be resized
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @param component real component to be resized
     * @param index position of the component in its container
     * @return resizing options for the component; 0 if no resizing is possible
     */
    int getResizableDirections(Container container,
                               Container containerDelegate,
                               Component component,
                               int index);

    /** This method should calculate layout constraints for a component being
     * resized.
     * @param container instance of a real container in which the
     *        component is resized
     * @param containerDelegate effective container delegate of the container
     *        (e.g. like content pane of JFrame)
     * @param component real component being resized
     * @param index position of the component in its container
     * @param sizeChanges Insets object with size differences
     * @param posInCont position of mouse in the container delegate
     * @return component layout constraints for resized component; null if
     *         resizing is not possible or not implemented
     */
    LayoutConstraints getResizedConstraints(Container container,
                                            Container containerDelegate,
                                            Component component,
                                            int index,
                                            Insets sizeChanges,
                                            Point posInCont);

    /** Cloning method - creates a copy of the layout delegate.
     * @param targetContext LayoutSupportContext for the new layout delegate
     * @param compExpressions array of CodeExpression objects representing the
     *        components for the new layout delegate (corresponding to the
     *        current ones)
     * @return cloned layout delegate instance
     */
    LayoutSupportDelegate cloneLayoutSupport(LayoutSupportContext targetContext,
                                             CodeExpression[] targetComponents);
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.