/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   copyright (C) 2004-2006                                               *
 *   Umbrello UML Modeller Authors <uml-devel@ uml.sf.net>                 *
 ***************************************************************************/

#ifndef TOOLBARSTATEOTHER_H
#define TOOLBARSTATEOTHER_H

#include "toolbarstatepool.h"

/**
 * Other tool creates almost all the objects (except associations and messages).
 * Objects are created when left button is released, no matter if it was
 * released on an association, on a widget or on an empty space.
 *
 * Associations and widgets aren't taken into account, and are treated as empty
 * spaces.
 */
class ToolBarStateOther : public ToolBarStatePool {
    Q_OBJECT
public:

    /**
     * Creates a new ToolBarStateOther.
     *
     * @param umlView The UMLView to use.
     */
    ToolBarStateOther(UMLView *umlView);

    /**
     * Destroys this ToolBarStateOther.
     */
    virtual ~ToolBarStateOther();

private:

    /**
     * Sets nothing.
     * Overriden from base class to ignore associations and widgets and treat
     * them as empty spaces to create widgets on it.
     */
    virtual void setCurrentElement();

    /**
     * Called when the release event happened on an empty space.
     * Associations, widgets and actual empty spaces are all treated as empty
     * spaces. It creates a new widget if the left button was released.
     * The widget to create depends on the type of the toolbar button selected.
     * If the widget is the visual representation of an UMLObject, the object
     * factory handles its creation. Otherwise, the widget is created using
     * newWidget().
     * The UMLView is resized to fit on all the items.
     */
    virtual void mouseReleaseEmpty();

    /**
     * Returns the object type of this tool.
     *
     * @return The object type of this tool.
     */
    Uml::Object_Type getObjectType();

    /**
     * Creates and adds a new widget to the UMLView (if widgets of that type
     * don't have an associated UMLObject).
     * If the type of the widget doesn't use an UMLObject (for example, a note
     * or a box), it creates the widget, adds it to the view and returns true.
     * Otherwise, it returns false.
     *
     * @return True if the widget was created, false otherwise.
     * @todo rename to something more clear
     */
    bool newWidget();

};

#endif //TOOLBARSTATEOTHER_H
