Coverage Report - org.jtheque.core.managers.feature.FeatureManager
 
Classes in this File Line Coverage Branch Coverage Complexity
FeatureManager
0 %
0/65
0 %
0/18
1.571
FeatureManager$ManagedFeature
0 %
0/17
0 %
0/4
1.571
 
 1  
 package org.jtheque.core.managers.feature;
 2  
 
 3  
 /*
 4  
  * This file is part of JTheque.
 5  
  *
 6  
  * JTheque is free software: you can redistribute it and/or modify
 7  
  * it under the terms of the GNU General Public License as published by
 8  
  * the Free Software Foundation, either version 3 of the License.
 9  
  *
 10  
  * JTheque is distributed in the hope that it will be useful,
 11  
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13  
  * GNU General Public License for more details.
 14  
  *
 15  
  * You should have received a copy of the GNU General Public License
 16  
  * along with JTheque.  If not, see <http://www.gnu.org/licenses/>.
 17  
  */
 18  
 
 19  
 import org.jtheque.core.managers.AbstractManager;
 20  
 import org.jtheque.core.managers.Managers;
 21  
 import org.jtheque.core.managers.feature.Feature.FeatureType;
 22  
 import org.jtheque.core.managers.resource.IResourceManager;
 23  
 import org.jtheque.core.managers.resource.ImageType;
 24  
 import org.jtheque.utils.collections.CollectionUtils;
 25  
 
 26  
 import javax.swing.Action;
 27  
 import java.util.ArrayList;
 28  
 import java.util.Collection;
 29  
 import java.util.EnumMap;
 30  
 import java.util.Map;
 31  
 
 32  
 /**
 33  
  * A Feature manager.
 34  
  *
 35  
  * @author Baptiste Wicht
 36  
  */
 37  0
 public final class FeatureManager extends AbstractManager implements IFeatureManager {
 38  
     private final Collection<Feature> features;
 39  
 
 40  
     private final Map<CoreFeature, Feature> coreFeatures;
 41  
 
 42  
     /**
 43  
      * Construct a new FeatureManager.
 44  
      */
 45  
     public FeatureManager() {
 46  0
         super();
 47  
 
 48  0
         features = new ArrayList<Feature>(10);
 49  0
         coreFeatures = new EnumMap<CoreFeature, Feature>(CoreFeature.class);
 50  0
     }
 51  
 
 52  
     @Override
 53  
     public void init(){
 54  0
         coreFeatures.put(CoreFeature.FILE, createAndAddFeature(0, "menu.file"));
 55  0
         coreFeatures.put(CoreFeature.EDIT, createAndAddFeature(1, "menu.edit"));
 56  0
         coreFeatures.put(CoreFeature.ADVANCED, createAndAddFeature(990, "menu.advanced"));
 57  0
         coreFeatures.put(CoreFeature.HELP, createAndAddFeature(1000, "menu.help"));
 58  
 
 59  0
         addMenu(new CoreMenu());
 60  0
     }
 61  
 
 62  
     @Override
 63  
     public void addMenu(Menu menu){
 64  0
         for(CoreFeature feature : CoreFeature.values()){
 65  0
             for(Feature f : menu.getSubFeatures(feature)){
 66  0
                 getFeature(feature).addSubFeature(f);
 67  
             }
 68  
         }
 69  
 
 70  0
         for(Feature f : menu.getMainFeatures()){
 71  0
             addFeature(f);
 72  
         }
 73  0
     }
 74  
 
 75  
     @Override
 76  
     public void removeMenu(Menu menu){
 77  0
         for(CoreFeature feature : CoreFeature.values()){
 78  0
             for(Feature f : menu.getSubFeatures(feature)){
 79  0
                 getFeature(feature).removeSubFeature(f);
 80  
             }
 81  
         }
 82  
 
 83  0
         for(Feature f : menu.getMainFeatures()){
 84  0
             removeFeature(f);
 85  
         }
 86  0
     }
 87  
 
 88  
     @Override
 89  
     public Feature createFeature(int position, FeatureType type, String key) {
 90  0
         Feature feature = new ManagedFeature();
 91  0
         feature.setPosition(position);
 92  0
         feature.setType(type);
 93  0
         feature.setTitleKey(key);
 94  
 
 95  0
         return feature;
 96  
     }
 97  
 
 98  
     /**
 99  
      * Create and add the feature.
 100  
      *
 101  
      * @param position The position of the feature.
 102  
      * @param key      The i18n key of the feature.
 103  
      * @return The added feature.
 104  
      */
 105  
     private Feature createAndAddFeature(int position, String key) {
 106  0
         Feature feature = createFeature(position, FeatureType.PACK, key);
 107  
 
 108  0
         features.add(feature);
 109  
 
 110  0
         return feature;
 111  
     }
 112  
 
 113  
     @Override
 114  
     public Feature addSubFeature(Feature parent, String actionName, FeatureType type, int position, String baseName, String icon) {
 115  0
         Action action = Managers.getManager(IResourceManager.class).getAction(actionName);
 116  
 
 117  0
         action.putValue(Action.SMALL_ICON, Managers.getManager(IResourceManager.class).getIcon(
 118  
                 baseName,
 119  
                 icon, ImageType.PNG));
 120  
 
 121  0
         return addSubFeature(parent, action, type, position);
 122  
     }
 123  
 
 124  
     @Override
 125  
     public Feature addSubFeature(Feature parent, String action, FeatureType type, int position) {
 126  0
         return addSubFeature(parent, Managers.getManager(IResourceManager.class).getAction(action), type, position);
 127  
     }
 128  
 
 129  
     /**
 130  
      * Add a sub feature to the parent feature.
 131  
      *
 132  
      * @param action   The <code>Action</code> to use.
 133  
      * @param parent   The parent feature.
 134  
      * @param type     The type of feature.
 135  
      * @param position The position in the parent feature.
 136  
      * @return The <code>Feature</code>.
 137  
      */
 138  
     private static Feature addSubFeature(Feature parent, Action action, FeatureType type, int position) {
 139  0
         Feature feature = new Feature();
 140  0
         feature.setType(type);
 141  0
         feature.setAction(action);
 142  0
         feature.setPosition(position);
 143  
 
 144  0
         parent.addSubFeature(feature);
 145  
 
 146  0
         return feature;
 147  
     }
 148  
 
 149  
     @Override
 150  
     public void addFeature(Feature feature) {
 151  0
         if (feature.getType() != FeatureType.PACK) {
 152  0
             throw new IllegalArgumentException("Can only add feature of type pack directly. ");
 153  
         }
 154  
 
 155  0
         features.add(feature);
 156  
 
 157  0
         fireFeatureAdded(feature);
 158  0
     }
 159  
 
 160  
     @Override
 161  
     public void removeFeature(Feature feature) {
 162  0
         features.remove(feature);
 163  
 
 164  0
         fireFeatureRemoved(feature);
 165  0
     }
 166  
 
 167  
     @Override
 168  
     public Collection<Feature> getFeatures() {
 169  0
         return CollectionUtils.copyOf(features);
 170  
     }
 171  
 
 172  
     @Override
 173  
     public Feature getFeature(CoreFeature feature) {
 174  0
         return coreFeatures.get(feature);
 175  
     }
 176  
 
 177  
     @Override
 178  
     public void addFeatureListener(FeatureListener listener) {
 179  0
         getListeners().add(FeatureListener.class, listener);
 180  0
     }
 181  
 
 182  
     @Override
 183  
     public void removeFeatureListener(FeatureListener listener) {
 184  0
         getListeners().add(FeatureListener.class, listener);
 185  0
     }
 186  
 
 187  
     /**
 188  
      * Avert the listeners thant a feature has been added.
 189  
      *
 190  
      * @param feature The feature who's been added.
 191  
      */
 192  
     private void fireFeatureAdded(Feature feature) {
 193  0
         FeatureListener[] l = getListeners().getListeners(FeatureListener.class);
 194  
 
 195  0
         FeatureEvent event = new FeatureEvent(this, feature);
 196  
 
 197  0
         for (FeatureListener listener : l) {
 198  0
             listener.featureAdded(event);
 199  
         }
 200  0
     }
 201  
 
 202  
     /**
 203  
      * Avert the listeners thant a feature has been removed.
 204  
      *
 205  
      * @param feature The feature who's been removed.
 206  
      */
 207  
     private void fireFeatureRemoved(Feature feature) {
 208  0
         FeatureListener[] l = getListeners().getListeners(FeatureListener.class);
 209  
 
 210  0
         FeatureEvent event = new FeatureEvent(this, feature);
 211  
 
 212  0
         for (FeatureListener listener : l) {
 213  0
             listener.featureRemoved(event);
 214  
         }
 215  0
     }
 216  
 
 217  
     /**
 218  
      * A managed feature.
 219  
      *
 220  
      * @author Baptiste Wicht
 221  
      */
 222  0
     protected static final class ManagedFeature extends Feature {
 223  
         @Override
 224  
         public void addSubFeature(Feature feature) {
 225  0
             super.addSubFeature(feature);
 226  
 
 227  0
             fireSubFeatureAdded(this, feature);
 228  0
         }
 229  
 
 230  
         @Override
 231  
         public void removeSubFeature(Feature feature) {
 232  0
             super.removeSubFeature(feature);
 233  
 
 234  0
             fireSubFeatureRemoved(this, feature);
 235  0
         }
 236  
 
 237  
         /**
 238  
          * Avert the listeners thant a sub feature has been added in a specific feature.
 239  
          *
 240  
          * @param feature    The feature in which the sub feature has been added.
 241  
          * @param subFeature The subFeature who's been added.
 242  
          */
 243  
         private void fireSubFeatureAdded(Feature feature, Feature subFeature) {
 244  0
             FeatureListener[] l = getListeners().getListeners(FeatureListener.class);
 245  
 
 246  0
             FeatureEvent event = new FeatureEvent(this, feature, subFeature);
 247  
 
 248  0
             for (FeatureListener listener : l) {
 249  0
                 listener.subFeatureAdded(event);
 250  
             }
 251  0
         }
 252  
 
 253  
         /**
 254  
          * Avert the listeners thant a sub feature has been removed in a specific feature.
 255  
          *
 256  
          * @param feature    The feature in which the sub feature has been removed.
 257  
          * @param subFeature The subFeature who's been removed.
 258  
          */
 259  
         private void fireSubFeatureRemoved(Feature feature, Feature subFeature) {
 260  0
             FeatureListener[] l = getListeners().getListeners(FeatureListener.class);
 261  
 
 262  0
             FeatureEvent event = new FeatureEvent(this, feature, subFeature);
 263  
 
 264  0
             for (FeatureListener listener : l) {
 265  0
                 listener.subFeatureRemoved(event);
 266  
             }
 267  0
         }
 268  
     }
 269  
 }