001    package de.deepamehta.plugins.boxrenderer.dom;
002    
003    import de.deepamehta.plugins.topicmaps.ViewmodelCustomizer;
004    import de.deepamehta.plugins.topicmaps.service.TopicmapsService;
005    
006    import de.deepamehta.core.Topic;
007    import de.deepamehta.core.model.CompositeValueModel;
008    import de.deepamehta.core.osgi.PluginActivator;
009    import de.deepamehta.core.service.PluginService;
010    import de.deepamehta.core.service.annotation.ConsumesService;
011    
012    import java.util.logging.Logger;
013    
014    
015    
016    public class BoxRendererPlugin extends PluginActivator implements ViewmodelCustomizer {
017    
018        // ------------------------------------------------------------------------------------------------------- Constants
019    
020        private static final String PROP_COLOR    = "dm4.boxrenderer.color";
021        private static final String PROP_EXPANDED = "dm4.boxrenderer.expanded";
022    
023        // ---------------------------------------------------------------------------------------------- Instance Variables
024    
025        private Logger logger = Logger.getLogger(getClass().getName());
026    
027        // -------------------------------------------------------------------------------------------------- Public Methods
028    
029        // *** Hook Implementations ***
030    
031        @Override
032        @ConsumesService("de.deepamehta.plugins.topicmaps.service.TopicmapsService")
033        public void serviceArrived(PluginService service) {
034            ((TopicmapsService) service).registerViewmodelCustomizer(this);
035        }
036    
037        @Override
038        public void serviceGone(PluginService service) {
039            // Note: unregistering is important. Otherwise the Topicmaps plugin would hold a viewmodel
040            // customizer with a stale dms instance as soon as the Box Renderer is redeployed.
041            // A subsequent storeViewProperties() call (see below) would fail.
042            ((TopicmapsService) service).unregisterViewmodelCustomizer(this);
043        }
044    
045        // *** ViewmodelCustomizer Implementation ***
046    
047        @Override
048        public void enrichViewProperties(Topic topic, CompositeValueModel viewProps) {
049            boolean expanded = _enrichViewProperties(topic, viewProps);
050            if (expanded) {
051                topic.loadChildTopics("dm4.notes.text");
052            }
053        }
054    
055        @Override
056        public void storeViewProperties(Topic topic, CompositeValueModel viewProps) {
057            storeColor(topic, viewProps);
058            storeExpanded(topic, viewProps);
059        }
060    
061        // ------------------------------------------------------------------------------------------------- Private Methods
062    
063        private boolean _enrichViewProperties(Topic topic, CompositeValueModel viewProps) {
064            // 1) color
065            if (topic.hasProperty(PROP_COLOR)) {
066                String color = (String) topic.getProperty(PROP_COLOR);
067                viewProps.put(PROP_COLOR, color);
068            }
069            // 2) expanded
070            boolean expanded = false;
071            if (topic.getTypeUri().equals("dm4.notes.note")) {
072                if (topic.hasProperty(PROP_EXPANDED)) {
073                    expanded = (Boolean) topic.getProperty(PROP_EXPANDED);
074                    viewProps.put(PROP_EXPANDED, expanded);
075                }
076            }
077            return expanded;
078        }
079    
080        // ---
081    
082        private void storeColor(Topic topic, CompositeValueModel viewProps) {
083            if (viewProps.has(PROP_COLOR)) {
084                String color = viewProps.getString(PROP_COLOR);
085                topic.setProperty(PROP_COLOR, color, false);        // addToIndex = false
086            }
087        }
088    
089        private void storeExpanded(Topic topic, CompositeValueModel viewProps) {
090            if (viewProps.has(PROP_EXPANDED)) {
091                boolean expanded = viewProps.getBoolean(PROP_EXPANDED);
092                topic.setProperty(PROP_EXPANDED, expanded, false);  // addToIndex = false
093                // ### TODO: store the expanded flag *per-topicmap*
094            }
095        }
096    }