package org.emdev.ui.actions;
import org.sufficientlysecure.viewer.R;
import android.view.View;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.emdev.common.log.LogContext;
import org.emdev.common.log.LogManager;
/**
* This class defines base features for action controller.
*
* @param <ManagedComponent>
* manager GUI component class
*/
public abstract class AbstractComponentController<ManagedComponent> implements IActionController<ManagedComponent> {
protected static final LogContext LCTX = LogManager.root().lctx("Actions");
protected final Map<Integer, ActionEx> m_actions = new LinkedHashMap<Integer, ActionEx>();
protected final ReentrantReadWriteLock m_actionsLock = new ReentrantReadWriteLock();
protected final IActionController<?> m_parent;
protected ManagedComponent m_managedComponent;
/**
* Constructor
*
* @param managedComponent
* managed component
*/
protected AbstractComponentController(final ManagedComponent managedComponent) {
this(null, managedComponent);
}
/**
* Constructor.
*
* @param parent
* the parent controller
* @param managedComponent
* managed component
*/
protected AbstractComponentController(final IActionController<?> parent, final ManagedComponent managedComponent) {
m_parent = parent;
m_managedComponent = managedComponent;
}
/**
* @return the parent controller
* @see IActionController#getParent()
*/
@Override
public IActionController<?> getParent() {
return m_parent;
}
/**
* @return the managed component
* @see IActionController#getManagedComponent()
*/
@Override
public ManagedComponent getManagedComponent() {
return m_managedComponent;
}
/**
* {@inheritDoc}
*
* @see org.emdev.ui.actions.IActionController#setManagedComponent(java.lang.Object)
*/
@Override
public void setManagedComponent(final ManagedComponent component) {
m_actionsLock.writeLock().lock();
try {
m_managedComponent = component;
for (final ActionEx action : m_actions.values()) {
action.putValue(MANAGED_COMPONENT_PROPERTY, component);
}
} finally {
m_actionsLock.writeLock().unlock();
}
}
/**
* Searches for an action by the given id
*
* @param id
* action id
* @return an instance of {@link ActionEx} object or <code>null</code>
* @see IActionController#getAction(java.lang.String)
*/
@Override
public ActionEx getAction(final int id) {
m_actionsLock.readLock().lock();
try {
ActionEx actionEx = m_actions.get(id);
if (actionEx == null && m_parent != null) {
actionEx = m_parent.getAction(id);
}
if (actionEx != null) {
actionEx.putValue(DIALOG_PROPERTY, null);
actionEx.putValue(DIALOG_ITEM_PROPERTY, null);
actionEx.putValue(DIALOG_SELECTED_ITEMS_PROPERTY, null);
actionEx.putValue(VIEW_PROPERTY, null);
}
return actionEx;
} finally {
m_actionsLock.readLock().unlock();
}
}
/**
* Creates and register a global action
*
* @param id
* action id
* @return an instance of {@link ActionEx} object
* @see IActionController#getOrCreateAction(String, String, IActionParameter[])
*/
@Override
public ActionEx getOrCreateAction(final int id) {
ActionEx result = null;
m_actionsLock.writeLock().lock();
try {
result = getAction(id);
if (result == null) {
result = createAction(id);
}
} finally {
m_actionsLock.writeLock().unlock();
}
return result;
}
/**
* Creates an action
*
* @param id
* action id
* @param parameters
* action parameters
* @return an instance of {@link ActionEx} object
* @see IActionController#createAction(String, String, IActionParameter[])
*/
@Override
public ActionEx createAction(final int id, final IActionParameter... parameters) {
final ActionEx result = new ActionEx(this, id);
result.putValue(MANAGED_COMPONENT_PROPERTY, m_managedComponent);
result.putValue(COMPONENT_CONTROLLER_PROPERTY, this);
for (final IActionParameter actionParameter : parameters) {
result.addParameter(actionParameter);
}
m_actionsLock.writeLock().lock();
try {
m_actions.put(result.id, result);
} finally {
m_actionsLock.writeLock().unlock();
}
return result;
}
@ActionMethod(ids = R.id.actions_no_action)
public void noAction(final ActionEx action) {
}
public final ActionEx setActionForView(final View view) {
final ActionEx action = getOrCreateAction(view.getId());
view.setOnClickListener(action);
return action;
}
}