/**
*
*/
package org.concord.otrunk.view;
import java.util.HashMap;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JLabel;
import org.concord.framework.otrunk.OTObject;
import org.concord.framework.otrunk.view.OTJComponentService;
import org.concord.framework.otrunk.view.OTJComponentView;
import org.concord.framework.otrunk.view.OTJComponentViewContext;
import org.concord.framework.otrunk.view.OTJComponentViewContextAware;
import org.concord.framework.otrunk.view.OTView;
import org.concord.framework.otrunk.view.OTViewContainer;
import org.concord.framework.otrunk.view.OTViewContainerAware;
import org.concord.framework.otrunk.view.OTViewContext;
import org.concord.framework.otrunk.view.OTViewContextAware;
import org.concord.framework.otrunk.view.OTViewConversionService;
import org.concord.framework.otrunk.view.OTViewEntry;
import org.concord.framework.otrunk.view.OTViewFactory;
/**
* @author scott
*
*/
public class OTJComponentServiceImpl implements OTJComponentService
{
private static final Logger logger =
Logger.getLogger(OTJComponentServiceImpl.class.getCanonicalName());
OTViewFactory viewFactory;
// For now we'll keep these in a regular hashtable we might need to do
// some weak referencing here
HashMap<OTObject, OTJComponentView> objToView = new HashMap<OTObject, OTJComponentView>();
HashMap<OTObject, JComponent> objToComponent = new HashMap<OTObject, JComponent>();
private boolean maintainViewMap;
public OTJComponentServiceImpl(OTViewFactory viewFactory, boolean maintainViewMap)
{
this.viewFactory = viewFactory;
this.maintainViewMap = maintainViewMap;
}
public JComponent getComponent(OTObject otObject,
OTViewContainer container)
{
OTJComponentView view = getObjectView(otObject, container);
if(view == null) {
return new JLabel("No view for object: " + otObject);
}
return getComponent(otObject, view);
}
public JComponent getComponent(OTObject otObject, OTJComponentView view)
{
JComponent component = view.getComponent(otObject);
if(maintainViewMap){
objToComponent.put(otObject, component);
}
return component;
}
public OTJComponentView getObjectView(OTObject otObject,
OTViewContainer container)
{
return getObjectView(otObject, container, null, null);
}
public OTJComponentView getObjectView(OTObject otObject, OTViewContainer container,
String mode)
{
return getObjectView(otObject, container, mode, null);
}
public OTJComponentView getObjectView(OTObject otObject, OTViewContainer container,
String mode, OTViewEntry viewEntry)
{
return getObjectView(otObject, container, mode, viewEntry, null, null);
}
/* (non-Javadoc)
* @see org.concord.framework.otrunk.view.OTJComponentService#getObjectView(org.concord.framework.otrunk.OTObject, org.concord.framework.otrunk.view.OTViewContainer, java.lang.String, org.concord.framework.otrunk.view.OTViewEntry)
*/
public OTJComponentView getObjectView(OTObject otObject, OTViewContainer container,
String mode, OTViewEntry viewEntry, OTViewContext passedViewContext,
OTJComponentViewContext passedJComponentViewContext)
{
OTView genericView = null;
if(viewEntry != null) {
genericView = viewFactory.getView(otObject, viewEntry, mode);
} else {
genericView = viewFactory.getView(otObject, OTJComponentView.class, mode);
if(genericView == null) {
genericView = viewFactory.getView(otObject, OTView.class, mode);
OTViewContext viewContext2 = viewFactory.getViewContext();
OTViewConversionService conversionService =
viewContext2.getViewService(OTViewConversionService.class);
// check if we can handle translating this to a OTJComponentView
// currently only OTXHTMLViews can be translated
if(conversionService == null ||
(conversionService != null &&
!conversionService.canConvert(genericView, OTJComponentView.class))){
if(conversionService == null){
logger.warning("No OTViewConversionService available");
}
logger.warning("No OTJComponentView or compatible view for the object\n" +
" obj: " + otObject + "\n" +
" mode: " + mode);
}
}
}
if(genericView == null) {
logger.warning("Cannot find view for object\n" +
" obj: " + otObject + "\n" +
" mode: " + mode + "\n" +
" viewEntry: " + viewEntry);
return null;
}
OTJComponentView view = null;
if(genericView instanceof OTJComponentView){
view = (OTJComponentView) genericView;
} else {
OTViewContext viewContext2 = viewFactory.getViewContext();
OTViewConversionService conversionService =
viewContext2.getViewService(OTViewConversionService.class);
if(conversionService == null){
logger.warning("No OTViewConversionService available");
} else {
view = conversionService.convert(genericView, OTJComponentView.class,
viewFactory, viewEntry);
}
}
if(view == null){
// We could not translate the genericView to a OTJComponentView
logger.warning("Could not convert genericView to OTJComponentView\n" +
" obj: " + otObject + "\n" +
" genericView: " + genericView + "\n" +
" mode: " + mode + "\n" +
" viewEntry: " + viewEntry);
return null;
}
if(view instanceof OTViewContainerAware){
((OTViewContainerAware)view).setViewContainer(container);
}
if(view instanceof OTJComponentViewContextAware){
if (passedJComponentViewContext == null){
((OTJComponentViewContextAware)view).setOTJComponentViewContext(viewContext);
} else {
((OTJComponentViewContextAware)view).setOTJComponentViewContext(passedJComponentViewContext);
}
}
// This will actually override the viewContext that was set by the view factory.
if (view instanceof OTViewContextAware){
if (passedViewContext != null){
((OTViewContextAware)view).setViewContext(passedViewContext);
}
}
if(maintainViewMap){
objToView.put(otObject, view);
}
return view;
}
OTJComponentViewContext viewContext = new OTJComponentViewContext()
{
public JComponent getComponentByObject(OTObject obj)
{
return objToComponent.get(obj);
}
public OTJComponentView getViewByObject(OTObject obj)
{
return objToView.get(obj);
}
public Object[] getAllObjects()
{
return objToView.keySet().toArray();
}
};
/**
* @see org.concord.framework.otrunk.view.OTJComponentService#getJComponentViewContext()
*/
public OTJComponentViewContext getJComponentViewContext()
{
return viewContext;
}
public OTViewFactory getViewFactory(){
return viewFactory;
}
}