/*
* Copyright 2011 JBoss Inc
*
* 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 org.jbpm.formapi.client.effect;
import org.jbpm.formapi.client.form.FBFormItem;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Base class for right click actions. These effects add
* special characteristics and settings to a given form item
*/
public abstract class FBFormEffect {
private FBFormItem item;
private Widget widget;
private PopupPanel parent;
private final String name;
private final boolean hasSubMenu;
/**
* @param name Name of the effect for the drop menu
* @param hasSubMenu if this effect, on selection, opens a new popup menu
*/
public FBFormEffect(String name, boolean hasSubMenu) {
this.name = name;
this.hasSubMenu = hasSubMenu;
}
public String getName() {
return name;
}
public void apply(FBFormItem item, PopupPanel panel) {
item.addEffect(this);
setParent(panel);
this.item = item;
if (!hasSubMenu) {
createStyles();
}
}
public void remove(FBFormItem item) {
item.removeEffect(this);
}
/**
* Classes that implement {@link FBFormEffect} must write
* this method, and make all actions of the effect in it
*/
protected abstract void createStyles();
/**
* If your instance of {@link FBFormEffect} happens to need
* a popup menu, override this method and create that menu
* here
* @return the popup needed for the given effect
*/
public PopupPanel createPanel() {
return null;
}
/**
* Use this method to obtain the {@link FBFormItem}
* this {@link FBFormEffect} is related to
* @return the related {@link FBFormItem}
*/
protected FBFormItem getItem() {
return this.item;
}
public void setWidget(Widget widget) {
this.widget = widget;
}
public PopupPanel getParent() {
return parent;
}
public void setParent(PopupPanel parent) {
this.parent = parent;
}
/**
* Use this method to obtain the UI GWT component
* represented by the {@link FBFormItem} this
* {@link FBFormEffect} is related to
* @param widget the UI GWT component of the related {@link FBFormItem}
*/
public Widget getWidget() {
return widget;
}
/**
* Override this method as a safety switch.
* If your {@link FBFormEffect} only works for
* a given set of components, or for components
* with a given characteristic, and you want to check
* it, you can override this method to say when it the
* makes sense to have this {@link FBFormEffect} related to
* a given {@link FBFormItem}
*
* Default implementation always returns true
*
* @param item the related {@link FBFormItem} to validate
* @return wether its a valid effect for the given item or not
*/
public boolean isValidForItem(FBFormItem item) {
return item != null;
}
}