LINKS_HUD_UI_MANAGING_LINKS: linksHud.patch

File linksHud.patch, 16.7 KB (added by pap, 15 years ago)

Design patch

  • modules/org.sophie2.main.func.links/src/main/java/org/sophie2/main/func/links/LinksHudLogic.java

    ### Eclipse Workspace Patch 1.0
    #P sophie2
     
    4949 
    5050                        LinksHud hud = control.findParentElement(LinksHud.class); 
    5151 
    52                         if (input.getSelectedItem() != null &&  
    53                                         hud != null &&  
    54                                         input.getSelectedItem() != null) { 
    55                                 hud.currentRule().set(input.getSelectedItem()); 
     52                        if (hud != null ) { 
     53                                if (input.getSelectedItem() == CurrentRule.NEW_RULE_ITEM) { 
     54                                        hud.wantedRule().set(LinksHud.EMPTY_RULE); 
     55                                } else { 
     56                                        hud.wantedRule().set(input.getSelectedItem()); 
     57                                } 
    5658                        } 
    5759 
    5860                        return true; 
     
    7880                                        BoundControl.EventIds.INPUT_PARAM_INDEX, ComboInput.class); 
    7981 
    8082                        LinksHud hud = control.findParentElement(LinksHud.class); 
    81                         if (hud != null && hud.currentRule().get() != null && input.getSelectedItem() != null) { 
    82  
     83                        if (hud != null) { 
    8384                                LinkHolder holder = hud.holder().get(); 
    8485 
     86                                if (hud.currentRule().get() == LinksHud.EMPTY_RULE) { 
     87                                        LinkRule newRule = new LinkRule(null, null); 
     88                                        ImmList<LinkRule> rules = holder.getLink().getRules(); 
     89                                        final Link newLink = new Link(rules.add(newRule)); 
     90                                         
     91                                        LogicR3.fire(hud, control, null, event, EventIds.SET_LINK,  
     92                                                        newLink, "Add link rule"); 
     93                                         
     94                                        assert holder.getLink().getRules().asList().indexOf(newRule) >= 0 : 
     95                                                "The rule could not be added!";  
     96                                        hud.wantedRule().set(newRule); 
     97                                } 
     98 
     99                                 
     100 
    85101                                LinkTrigger newTrigger = input.getSelectedItem(); 
    86102 
    87103                                LinkRule newRule = new LinkRule(newTrigger,  
     
    102118                                LogicR3.fire(hud, control, null, event, EventIds.SET_LINK,  
    103119                                                newLink, "Change link trigger"); 
    104120 
    105                                 hud.currentRule().set(newRule); 
     121                                hud.wantedRule().set(newRule); 
    106122                        } 
    107123                        return true; 
    108124                } 
     
    149165                                LogicR3.fire(hud, control, null, event, EventIds.SET_LINK,  
    150166                                                newLink, "Change link action"); 
    151167                                 
    152                                 hud.currentRule().set(newRule); 
     168                                hud.wantedRule().set(newRule); 
    153169                        } 
    154170                        return true; 
    155171                } 
     
    188204                        LogicR3.fire(hud, control, null, event, EventIds.SET_LINK,  
    189205                                        newLink, "Remove link rule"); 
    190206                         
    191                         if (newLink.getRules().size() > 0) { 
    192                                 hud.currentRule().set(newLink.getRules().get(0)); 
    193                         } else { 
    194                                 hud.currentRule().set(null); 
    195                         } 
     207                        hud.wantedRule().set(null); 
    196208                        return true; 
    197209                } 
    198210        },  
     
    226238                        assert holder.getLink().getRules().asList().indexOf(newRule) >= 0 : 
    227239                                "The rule could not be added!";  
    228240                         
    229                         hud.currentRule().set(newRule); 
     241                        hud.wantedRule().set(newRule); 
    230242                        return true; 
    231243                } 
    232244        },  
  • modules/org.sophie2.main.func.links/src/main/java/org/sophie2/main/func/links/LinksHud.java

     
    22 
    33import java.awt.Font; 
    44import java.util.ArrayList; 
    5 import java.util.Collections; 
     5import java.util.LinkedList; 
    66import java.util.List; 
    77 
    88import javax.swing.JPanel; 
     
    2626import org.sophie2.base.model.book.links.LinkActionProvider; 
    2727import org.sophie2.base.model.book.links.LinkRule; 
    2828import org.sophie2.base.model.book.links.LinkTrigger; 
     29import org.sophie2.base.skins.Skin; 
    2930import org.sophie2.base.skins.SkinElementId; 
     31import org.sophie2.base.skins.SkinManager; 
     32import org.sophie2.base.skins.SkinUtil; 
    3033import org.sophie2.base.visual.BaseSwingVisualElement; 
    3134import org.sophie2.base.visual.skins.ElementSkinPart; 
    3235import org.sophie2.base.visual.skins.RelatedChildren; 
     
    3740import org.sophie2.core.mvc.events.EventR3; 
    3841import org.sophie2.core.prolib.annot.Own; 
    3942import org.sophie2.core.prolib.impl.AutoListProperty; 
     43import org.sophie2.core.prolib.impl.AutoProperty; 
    4044import org.sophie2.core.prolib.impl.ResourceProperty; 
    4145import org.sophie2.core.prolib.interfaces.ListProp; 
    4246import org.sophie2.core.prolib.interfaces.Prop; 
     
    7680                        part.add(FONT_ID, new Font("Arial", Font.BOLD, 12)); 
    7781                        part.add(FONT_COLOR_ID, new ImmColor(0.17578125f, 0.26171875f, 0.6875f)); 
    7882                } 
    79                  
     83 
    8084                /** 
    8185                 * The button that closes the links hud. 
    8286                 *  
     
    9599                } 
    96100 
    97101        } 
    98          
    99          
     102 
     103 
    100104        /** 
    101105         * The "current rule" comboBox. 
     106         *  
     107         * @author pap 
    102108         */ 
    103109        @VisualElementDef(parent = LinksHud.class, sortKey = "aaa-current-rule") 
    104110        public static class CurrentRule extends BoundComboBox<LinkRule> { 
    105111 
     112                /** 
     113                 * A special {@link LinkRule} to denote a "New rule" item in the combo. 
     114                 */ 
     115                public static final LinkRule NEW_RULE_ITEM = new LinkRule(null, null) { 
     116 
     117                        @Override 
     118                        public String toString() { 
     119                                return "New Rule"; 
     120                        } 
     121                }; 
     122 
    106123                @SuppressWarnings("unused") 
    107124                @SkinPartDef 
    108125                private static void fillSkinParts(ElementSkinPart part) { 
     
    118135                protected ComboState<LinkRule> computeModelData() { 
    119136                        LinksHud hud = this.findParentElement(LinksHud.class); 
    120137                        if (hud != null && hud.holder().get() != null) { 
    121                                 return new ComboState<LinkRule>("",  
    122                                                 hud.holder().get().getLink().getRules().asList(), hud.currentRule().get()); 
     138                                List<LinkRule> rules = new ArrayList<LinkRule>(); 
     139                                rules.add(EMPTY_RULE); 
     140                                rules.addAll(hud.holder().get().getLink().getRules().asList()); 
     141                                LinkRule rule = hud.currentRule().get(); 
     142                                rule = rule == null ? EMPTY_RULE : rule ; 
    123143 
     144                                return new ComboState<LinkRule>("", rules, rule); 
    124145                        } 
    125146                        // else, return empty DropDownList 
    126                         return new ComboState<LinkRule>("", Collections.<LinkRule> emptyList(), null); 
     147                        return ComboState.<LinkRule>empty(); 
    127148                } 
    128149 
    129150                @Override 
    130151                protected BoundValidation validate(ComboInput<LinkRule> inputData) { 
    131152                        return BoundValidation.SUCCESS; 
    132153                } 
    133                  
     154 
    134155        } 
    135156 
    136157        /** 
     
    139160        @VisualElementDef(parent = LinksHud.class, sortKey = "ddd-available-triggers") 
    140161        public static class AvailableTriggers extends BoundComboBox<LinkTrigger> { 
    141162 
     163                /** 
     164                 * A special {@link LinkTrigger} to denote a "New rule" item in the combo. 
     165                 */ 
     166                public static final LinkTrigger SELECT_TRIGGER_ITEM = new LinkTrigger() { 
     167 
     168                        public String getDescription() { 
     169                                return "choose trigger"; 
     170                        } 
     171 
     172                        @Override 
     173                        public String toString() { 
     174                                return "choose trigger"; 
     175                        } 
     176                }; 
     177 
    142178                @SuppressWarnings("unused") 
    143179                @SkinPartDef 
    144180                private static void fillSkinParts(ElementSkinPart part) { 
     
    158194                        if (hud != null && hud.holder().get() != null) { 
    159195 
    160196                                // if the holder is a page, get the rule's set trigger. 
    161                                         if (hud.currentRule().get() != null) { 
    162                                                 trigger = hud.currentRule().get().getTrigger(); 
    163                                         } else { 
    164                                                 trigger = null; 
    165                                         } 
    166                                         return new ComboState<LinkTrigger>("",  
    167                                                         hud.holder().get().getTriggers(), trigger); 
     197                                LinkRule currentRule = hud.currentRule().get(); 
     198                                if (currentRule != null && currentRule != EMPTY_RULE) { 
     199                                        trigger = currentRule.getTrigger(); 
     200                                } else { 
     201                                        trigger = SELECT_TRIGGER_ITEM; 
     202                                } 
     203                                return new ComboState<LinkTrigger>("",  
     204                                                hud.holder().get().getTriggers(), trigger); 
    168205                        } 
    169206                        // else, return empty DropDownList 
    170                         return new ComboState<LinkTrigger>("", Collections.<LinkTrigger> emptyList(), null); 
     207                        return ComboState.<LinkTrigger>empty(); 
    171208                } 
    172209 
    173210                @Override 
    174211                protected BoundValidation validate(ComboInput<LinkTrigger> inputData) { 
    175212                        return BoundValidation.SUCCESS; 
    176213                } 
    177                  
    178                 @Override 
    179                 public boolean computeEnabled() { 
    180                         LinksHud hud = findParentElement(LinksHud.class); 
    181                         return hud != null && hud.currentRule().get() != null; 
    182                 } 
     214 
    183215        } 
    184216 
    185217        /** 
     
    187219         */ 
    188220        @VisualElementDef(parent = LinksHud.class, sortKey = "eee-available-actions") 
    189221        public static class AvailableActions extends BoundComboBox<LinkActionProvider> { 
     222                 
     223                /** 
     224                 * The {@link Skin} property id of the title of the {@link #SELECT_ACTION_ITEM}. 
     225                 */ 
     226                public static final String SELECT_ACTION_TITLE_PROP_ID = "select-action-item"; 
     227 
     228                /** 
     229                 * A special item which purpose is to prompt the user to select an action for the link. 
     230                 */ 
     231                public static final LinkActionProvider SELECT_ACTION_ITEM = new LinkActionProvider() { 
     232 
     233                        public Class<? extends LinkAction> getProvidedClass() { 
     234                                return null; 
     235                        } 
     236 
     237                        public String getDescription() { 
     238                                String elemId = SkinUtil.getElementId(AvailableActions.class); 
     239                                return SkinManager.get().currentSkin().get().getValue(elemId, SELECT_ACTION_TITLE_PROP_ID, String.class); 
     240                        } 
     241 
     242                        @Override 
     243                        public String toString() { 
     244                                return getDescription(); 
     245                        } 
     246 
     247                        public LinkAction create() { 
     248                                return null; 
     249                        } 
     250                };  
    190251 
    191252                @SuppressWarnings("unused") 
    192253                @SkinPartDef 
     
    197258                        part.add(FIELD_EDITABLE_PROP_ID, Boolean.FALSE); 
    198259                        part.add(COMBO_SIZE_PROP_ID, new ImmSize(220, 20)); 
    199260                        part.add(VALIDATION_VISIBLE_ID, false); 
     261                        part.add(SELECT_ACTION_TITLE_PROP_ID, "choose action"); 
    200262                } 
    201263 
    202264                private ListProp<LinkActionProvider> actionProviders() { 
     
    208270 
    209271                                                @Override 
    210272                                                protected List<? extends LinkActionProvider> computeData() { 
     273                                                        List<LinkActionProvider> res = new ArrayList<LinkActionProvider>(); 
    211274                                                        ProList<SophieExtension<LinkActionProvider>> extensions =  
    212275                                                                BaseModelBookModule.get().getLinkActionPoint().extensions().get(); 
    213                                                         List<LinkActionProvider> res = new ArrayList<LinkActionProvider>(); 
    214276                                                        for (int i = 0; i < extensions.size(); i++) { 
    215277                                                                res.add(extensions.get(i).getObject()); 
    216278                                                        } 
     
    224286 
    225287                @Override 
    226288                protected ComboState<LinkActionProvider> computeModelData() { 
    227                         LinksHud hud = this.findParentElement(LinksHud.class); 
     289                        LinksHud hud = findParentElement(LinksHud.class); 
    228290                        LinkActionProvider selectedProvider = null; 
     291                        List<LinkActionProvider> items = new LinkedList<LinkActionProvider>(actionProviders().get());  
    229292 
    230                         if (hud != null && hud.currentRule().get() != null) { 
    231                                 LinkAction action = hud.currentRule().get().getAction(); 
    232                                 for (LinkActionProvider prov : actionProviders().get()) { 
    233                                         if (action != null && prov.getProvidedClass().equals(action.getClass())) { 
    234                                                 selectedProvider = prov; 
    235                                                 break; 
     293                        if (hud != null) { 
     294                                LinkRule currentRule = hud.currentRule().get(); 
     295                                if (currentRule == null || currentRule == EMPTY_RULE || currentRule.getAction() == null) { 
     296                                        items.add(0, SELECT_ACTION_ITEM); 
     297                                        selectedProvider = SELECT_ACTION_ITEM; 
     298                                } else { 
     299                                        LinkAction action = hud.currentRule().get().getAction(); 
     300                                        for (LinkActionProvider prov : actionProviders().get()) { 
     301                                                if (action != null && prov.getProvidedClass().equals(action.getClass())) { 
     302                                                        selectedProvider = prov; 
     303                                                        break; 
     304                                                } 
    236305                                        } 
    237                                 } 
    238306 
     307                                }  
    239308                        } 
    240                                 return new ComboState<LinkActionProvider>("", actionProviders().get(), 
    241                                                 selectedProvider); 
     309                        return new ComboState<LinkActionProvider>("", items, selectedProvider); 
    242310                } 
    243311 
    244312                @Override 
    245313                protected BoundValidation validate(ComboInput<LinkActionProvider> inputData) { 
    246314                        return BoundValidation.SUCCESS; 
    247315                } 
    248                  
     316 
    249317                @Override 
    250318                public boolean computeEnabled() { 
    251319                        LinksHud hud = findParentElement(LinksHud.class); 
    252320                        return hud != null &&  
    253                                 hud.currentRule().get() != null &&  
    254                                 hud.currentRule().get().getTrigger() != null; 
     321                        hud.currentRule().get() != null &&  
     322                        hud.currentRule().get().getTrigger() != null; 
    255323                } 
    256324        } 
    257325 
    258326        /** 
    259327         * The "add rule" button. 
    260328         */ 
    261         @VisualElementDef(parent = LinksHud.class, sortKey = "bbb-add-rule") 
     329        //      @VisualElementDef(parent = LinksHud.class, sortKey = "bbb-add-rule") 
    262330        public static class AddRule extends LogicR3Button { 
    263331 
    264332                @SuppressWarnings("unused") 
     
    268336                        part.add(SIZE_PROP_ID, new ImmSize(26, 26)); 
    269337                        part.add(ICON_PROP_ID, ImageUtil.loadIcon("plus.png")); 
    270338                } 
    271                  
     339 
    272340                @Override 
    273341                protected ImmList<EventR3> computeEvents() { 
    274342                        return ImmTreeList.<EventR3>create(new EventR3(this, null, null,null, LinkActionIds.ADD_RULE)); 
    275343                } 
    276344 
    277 //              public Prop<JButton> swingComponent() { 
    278 //                      class swingComponent extends ResourceProperty<JButton> { 
    279 // 
    280 //                              @Override 
    281 //                              protected JButton create() { 
    282 //                                      JButton res =null; 
    283 //                                      res.setName("emptyBackgroundButton"); 
    284 //                                       
    285 //                                      return res; 
    286 //                              } 
    287 // 
    288 //                              @Override 
    289 //                              protected void destroy(JButton res) { 
    290 //                                      // nothing 
    291 //                              } 
    292 // 
    293 //                              @Override 
    294 //                              protected void setup(JButton res) { 
    295 //                                      res.setMargin(new Insets(0, 0, 0, 0)); 
    296 //                              } 
    297 //                      } 
    298 //                      return getBean().makeProp(swingComponent.class); 
    299 //              } 
    300345        } 
    301346 
    302347        /** 
     
    312357                        part.add(SIZE_PROP_ID, new ImmSize(26, 26)); 
    313358                        part.add(ICON_PROP_ID, ImageUtil.loadIcon("minus.png")); 
    314359                } 
    315                  
     360 
    316361                @Override 
    317362                protected ImmList<EventR3> computeEvents() { 
    318363                        return ImmTreeList.create(new EventR3(this, null, null,null, LinkActionIds.REMOVE_RULE)); 
    319364                } 
    320  
    321 //              public Prop<JButton> swingComponent() { 
    322 //                      class swingComponent extends ResourceProperty<JButton> { 
    323 // 
    324 //                              @Override 
    325 //                              protected JButton create() { 
    326 //                                      JButton res =  
    327 //                                              new LogicR3Button("",  
    328 //                                                      ); 
    329 //                                      res.setName("emptyBackgroundButton"); 
    330 //                                       
    331 //                                      return res; 
    332 //                              } 
    333 // 
    334 //                              @Override 
    335 //                              protected void destroy(JButton res) { 
    336 //                                      // nothing 
    337 //                              } 
    338 // 
    339 //                              @Override 
    340 //                              protected void setup(JButton res) { 
    341 //                                       
    342 //                                      res.setToolTipText("Remove currently selected rule"); 
    343 //                                      res.setMargin(new Insets(0, 0, 0, 0)); 
    344 //                              } 
    345 //                      } 
    346 //                      return getBean().makeProp(swingComponent.class); 
    347 //              } 
    348365        } 
    349366 
    350367        /** 
     
    352369         */ 
    353370        @VisualElementDef(parent = LinksHud.class, sortKey = "fff-configuration-panel") 
    354371        public static class ConfigPanel extends BaseSwingVisualElement { 
    355                  
     372 
    356373                @SkinPartDef 
    357374                @SuppressWarnings("unused") 
    358375                private static void initSkin(ElementSkinPart part) { 
     
    380397 
    381398                public Prop<JPanel> swingComponent() { 
    382399                        class swingComponent extends ResourceProperty<JPanel> { 
    383                                  
     400 
    384401                                private ActionConfigurationPanel currentPanel = null; 
    385402 
    386403                                @Override 
     
    455472                        @Override 
    456473                        protected void setup(Object res) { 
    457474                                holder().get(); 
    458                                 currentRule().set(null); 
     475                                wantedRule().set(null); 
    459476                        } 
    460477                } 
    461478                return getBean().makeProp(currentRuleSync.class); 
    462479        } 
    463480 
    464481        /** 
     482         * A special {@link LinkRule} denoting that a new rule should be created when the user selects a trigger. 
     483         */ 
     484        public static final LinkRule EMPTY_RULE = new LinkRule(null, null) { 
     485 
     486                @Override 
     487                public String toString() { 
     488                        return "New Rule"; 
     489                } 
     490        };  
     491 
     492        /** 
     493         * The rule that the user has explicitly set as the one to be edited. 
     494         *  
     495         * @return 
     496         *                      Property. 
     497         */ 
     498        public RwProp<LinkRule> wantedRule() { 
     499                return getBean().makeValueProp("wantedRule", LinkRule.class, null); 
     500        }  
     501 
     502        /** 
    465503         * The rule which is currently selected in the hud. 
    466504         *  
    467505         * @return the property 
    468506         */ 
    469         public RwProp<LinkRule> currentRule() { 
    470                 return getBean().makeValueProp("currentRule", LinkRule.class, null); 
     507        public Prop<LinkRule> currentRule() { 
     508                class currentRule extends AutoProperty<LinkRule> { 
     509 
     510                        @Override 
     511                        protected LinkRule compute() { 
     512                                if (wantedRule().get() != null) { 
     513                                        return wantedRule().get(); 
     514                                } 
     515 
     516                                LinkRule selected = null; 
     517                                if (holder().get() != null && holder().get().getLink() != null) { 
     518                                        ImmList<LinkRule> rules = holder().get().getLink().getRules(); 
     519                                        if (!rules.isEmpty()) { 
     520                                                selected = rules.get(rules.size() - 1); 
     521                                        } else { 
     522                                                selected = EMPTY_RULE; 
     523                                        } 
     524                                } 
     525                                return selected; 
     526                        } 
     527 
     528                } 
     529                return getBean().makeProp(currentRule.class); 
    471530        } 
    472531 
    473532        /** 
     
    477536         *              The {@link LinkHolder} to use. 
    478537         */ 
    479538        public abstract Prop<? extends LinkHolder> holder(); 
    480          
     539 
    481540        /** 
    482541         *      The Ids of the events, fired by the "add" and "remove" buttons. 
    483542         */ 
    484543        public enum LinkActionIds { 
    485544                /** 
    486                  * A bew {@link LinkRule} should be added to the current link. 
     545                 * A new {@link LinkRule} should be added to the current link. 
    487546                 */ 
    488547                @EventParams({}) 
    489548                ADD_RULE, 
    490                  
     549 
    491550                /** 
    492551                 * The currently selected {@link LinkRule} should be removed from the model.  
    493552                 */ 
  • modules/org.sophie2.main.func.links/src/main/java/org/sophie2/main/func/links/LinksUtil.java

     
    4545                LogicR3.fire(hud, null, null, null, EventIds.SET_LINK,  
    4646                                newLink, "Change link action settings"); 
    4747                 
    48                 hud.currentRule().set(newRule); 
     48                hud.wantedRule().set(newRule); 
    4949        } 
    5050 
    5151        /**