LINKS_HUD_UI_MANAGING_LINKS: linksHud.patch
File linksHud.patch, 16.7 KB (added by pap, 15 years ago) |
---|
-
modules/org.sophie2.main.func.links/src/main/java/org/sophie2/main/func/links/LinksHudLogic.java
### Eclipse Workspace Patch 1.0 #P sophie2
49 49 50 50 LinksHud hud = control.findParentElement(LinksHud.class); 51 51 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 } 56 58 } 57 59 58 60 return true; … … 78 80 BoundControl.EventIds.INPUT_PARAM_INDEX, ComboInput.class); 79 81 80 82 LinksHud hud = control.findParentElement(LinksHud.class); 81 if (hud != null && hud.currentRule().get() != null && input.getSelectedItem() != null) { 82 83 if (hud != null) { 83 84 LinkHolder holder = hud.holder().get(); 84 85 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 85 101 LinkTrigger newTrigger = input.getSelectedItem(); 86 102 87 103 LinkRule newRule = new LinkRule(newTrigger, … … 102 118 LogicR3.fire(hud, control, null, event, EventIds.SET_LINK, 103 119 newLink, "Change link trigger"); 104 120 105 hud. currentRule().set(newRule);121 hud.wantedRule().set(newRule); 106 122 } 107 123 return true; 108 124 } … … 149 165 LogicR3.fire(hud, control, null, event, EventIds.SET_LINK, 150 166 newLink, "Change link action"); 151 167 152 hud. currentRule().set(newRule);168 hud.wantedRule().set(newRule); 153 169 } 154 170 return true; 155 171 } … … 188 204 LogicR3.fire(hud, control, null, event, EventIds.SET_LINK, 189 205 newLink, "Remove link rule"); 190 206 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); 196 208 return true; 197 209 } 198 210 }, … … 226 238 assert holder.getLink().getRules().asList().indexOf(newRule) >= 0 : 227 239 "The rule could not be added!"; 228 240 229 hud. currentRule().set(newRule);241 hud.wantedRule().set(newRule); 230 242 return true; 231 243 } 232 244 }, -
modules/org.sophie2.main.func.links/src/main/java/org/sophie2/main/func/links/LinksHud.java
2 2 3 3 import java.awt.Font; 4 4 import java.util.ArrayList; 5 import java.util. Collections;5 import java.util.LinkedList; 6 6 import java.util.List; 7 7 8 8 import javax.swing.JPanel; … … 26 26 import org.sophie2.base.model.book.links.LinkActionProvider; 27 27 import org.sophie2.base.model.book.links.LinkRule; 28 28 import org.sophie2.base.model.book.links.LinkTrigger; 29 import org.sophie2.base.skins.Skin; 29 30 import org.sophie2.base.skins.SkinElementId; 31 import org.sophie2.base.skins.SkinManager; 32 import org.sophie2.base.skins.SkinUtil; 30 33 import org.sophie2.base.visual.BaseSwingVisualElement; 31 34 import org.sophie2.base.visual.skins.ElementSkinPart; 32 35 import org.sophie2.base.visual.skins.RelatedChildren; … … 37 40 import org.sophie2.core.mvc.events.EventR3; 38 41 import org.sophie2.core.prolib.annot.Own; 39 42 import org.sophie2.core.prolib.impl.AutoListProperty; 43 import org.sophie2.core.prolib.impl.AutoProperty; 40 44 import org.sophie2.core.prolib.impl.ResourceProperty; 41 45 import org.sophie2.core.prolib.interfaces.ListProp; 42 46 import org.sophie2.core.prolib.interfaces.Prop; … … 76 80 part.add(FONT_ID, new Font("Arial", Font.BOLD, 12)); 77 81 part.add(FONT_COLOR_ID, new ImmColor(0.17578125f, 0.26171875f, 0.6875f)); 78 82 } 79 83 80 84 /** 81 85 * The button that closes the links hud. 82 86 * … … 95 99 } 96 100 97 101 } 98 99 102 103 100 104 /** 101 105 * The "current rule" comboBox. 106 * 107 * @author pap 102 108 */ 103 109 @VisualElementDef(parent = LinksHud.class, sortKey = "aaa-current-rule") 104 110 public static class CurrentRule extends BoundComboBox<LinkRule> { 105 111 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 106 123 @SuppressWarnings("unused") 107 124 @SkinPartDef 108 125 private static void fillSkinParts(ElementSkinPart part) { … … 118 135 protected ComboState<LinkRule> computeModelData() { 119 136 LinksHud hud = this.findParentElement(LinksHud.class); 120 137 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 ; 123 143 144 return new ComboState<LinkRule>("", rules, rule); 124 145 } 125 146 // else, return empty DropDownList 126 return new ComboState<LinkRule>("", Collections.<LinkRule> emptyList(), null);147 return ComboState.<LinkRule>empty(); 127 148 } 128 149 129 150 @Override 130 151 protected BoundValidation validate(ComboInput<LinkRule> inputData) { 131 152 return BoundValidation.SUCCESS; 132 153 } 133 154 134 155 } 135 156 136 157 /** … … 139 160 @VisualElementDef(parent = LinksHud.class, sortKey = "ddd-available-triggers") 140 161 public static class AvailableTriggers extends BoundComboBox<LinkTrigger> { 141 162 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 142 178 @SuppressWarnings("unused") 143 179 @SkinPartDef 144 180 private static void fillSkinParts(ElementSkinPart part) { … … 158 194 if (hud != null && hud.holder().get() != null) { 159 195 160 196 // 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); 168 205 } 169 206 // else, return empty DropDownList 170 return new ComboState<LinkTrigger>("", Collections.<LinkTrigger> emptyList(), null);207 return ComboState.<LinkTrigger>empty(); 171 208 } 172 209 173 210 @Override 174 211 protected BoundValidation validate(ComboInput<LinkTrigger> inputData) { 175 212 return BoundValidation.SUCCESS; 176 213 } 177 178 @Override 179 public boolean computeEnabled() { 180 LinksHud hud = findParentElement(LinksHud.class); 181 return hud != null && hud.currentRule().get() != null; 182 } 214 183 215 } 184 216 185 217 /** … … 187 219 */ 188 220 @VisualElementDef(parent = LinksHud.class, sortKey = "eee-available-actions") 189 221 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 }; 190 251 191 252 @SuppressWarnings("unused") 192 253 @SkinPartDef … … 197 258 part.add(FIELD_EDITABLE_PROP_ID, Boolean.FALSE); 198 259 part.add(COMBO_SIZE_PROP_ID, new ImmSize(220, 20)); 199 260 part.add(VALIDATION_VISIBLE_ID, false); 261 part.add(SELECT_ACTION_TITLE_PROP_ID, "choose action"); 200 262 } 201 263 202 264 private ListProp<LinkActionProvider> actionProviders() { … … 208 270 209 271 @Override 210 272 protected List<? extends LinkActionProvider> computeData() { 273 List<LinkActionProvider> res = new ArrayList<LinkActionProvider>(); 211 274 ProList<SophieExtension<LinkActionProvider>> extensions = 212 275 BaseModelBookModule.get().getLinkActionPoint().extensions().get(); 213 List<LinkActionProvider> res = new ArrayList<LinkActionProvider>();214 276 for (int i = 0; i < extensions.size(); i++) { 215 277 res.add(extensions.get(i).getObject()); 216 278 } … … 224 286 225 287 @Override 226 288 protected ComboState<LinkActionProvider> computeModelData() { 227 LinksHud hud = this.findParentElement(LinksHud.class);289 LinksHud hud = findParentElement(LinksHud.class); 228 290 LinkActionProvider selectedProvider = null; 291 List<LinkActionProvider> items = new LinkedList<LinkActionProvider>(actionProviders().get()); 229 292 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 } 236 305 } 237 }238 306 307 } 239 308 } 240 return new ComboState<LinkActionProvider>("", actionProviders().get(), 241 selectedProvider); 309 return new ComboState<LinkActionProvider>("", items, selectedProvider); 242 310 } 243 311 244 312 @Override 245 313 protected BoundValidation validate(ComboInput<LinkActionProvider> inputData) { 246 314 return BoundValidation.SUCCESS; 247 315 } 248 316 249 317 @Override 250 318 public boolean computeEnabled() { 251 319 LinksHud hud = findParentElement(LinksHud.class); 252 320 return hud != null && 253 254 321 hud.currentRule().get() != null && 322 hud.currentRule().get().getTrigger() != null; 255 323 } 256 324 } 257 325 258 326 /** 259 327 * The "add rule" button. 260 328 */ 261 @VisualElementDef(parent = LinksHud.class, sortKey = "bbb-add-rule")329 // @VisualElementDef(parent = LinksHud.class, sortKey = "bbb-add-rule") 262 330 public static class AddRule extends LogicR3Button { 263 331 264 332 @SuppressWarnings("unused") … … 268 336 part.add(SIZE_PROP_ID, new ImmSize(26, 26)); 269 337 part.add(ICON_PROP_ID, ImageUtil.loadIcon("plus.png")); 270 338 } 271 339 272 340 @Override 273 341 protected ImmList<EventR3> computeEvents() { 274 342 return ImmTreeList.<EventR3>create(new EventR3(this, null, null,null, LinkActionIds.ADD_RULE)); 275 343 } 276 344 277 // public Prop<JButton> swingComponent() {278 // class swingComponent extends ResourceProperty<JButton> {279 //280 // @Override281 // protected JButton create() {282 // JButton res =null;283 // res.setName("emptyBackgroundButton");284 //285 // return res;286 // }287 //288 // @Override289 // protected void destroy(JButton res) {290 // // nothing291 // }292 //293 // @Override294 // protected void setup(JButton res) {295 // res.setMargin(new Insets(0, 0, 0, 0));296 // }297 // }298 // return getBean().makeProp(swingComponent.class);299 // }300 345 } 301 346 302 347 /** … … 312 357 part.add(SIZE_PROP_ID, new ImmSize(26, 26)); 313 358 part.add(ICON_PROP_ID, ImageUtil.loadIcon("minus.png")); 314 359 } 315 360 316 361 @Override 317 362 protected ImmList<EventR3> computeEvents() { 318 363 return ImmTreeList.create(new EventR3(this, null, null,null, LinkActionIds.REMOVE_RULE)); 319 364 } 320 321 // public Prop<JButton> swingComponent() {322 // class swingComponent extends ResourceProperty<JButton> {323 //324 // @Override325 // protected JButton create() {326 // JButton res =327 // new LogicR3Button("",328 // );329 // res.setName("emptyBackgroundButton");330 //331 // return res;332 // }333 //334 // @Override335 // protected void destroy(JButton res) {336 // // nothing337 // }338 //339 // @Override340 // 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 // }348 365 } 349 366 350 367 /** … … 352 369 */ 353 370 @VisualElementDef(parent = LinksHud.class, sortKey = "fff-configuration-panel") 354 371 public static class ConfigPanel extends BaseSwingVisualElement { 355 372 356 373 @SkinPartDef 357 374 @SuppressWarnings("unused") 358 375 private static void initSkin(ElementSkinPart part) { … … 380 397 381 398 public Prop<JPanel> swingComponent() { 382 399 class swingComponent extends ResourceProperty<JPanel> { 383 400 384 401 private ActionConfigurationPanel currentPanel = null; 385 402 386 403 @Override … … 455 472 @Override 456 473 protected void setup(Object res) { 457 474 holder().get(); 458 currentRule().set(null);475 wantedRule().set(null); 459 476 } 460 477 } 461 478 return getBean().makeProp(currentRuleSync.class); 462 479 } 463 480 464 481 /** 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 /** 465 503 * The rule which is currently selected in the hud. 466 504 * 467 505 * @return the property 468 506 */ 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); 471 530 } 472 531 473 532 /** … … 477 536 * The {@link LinkHolder} to use. 478 537 */ 479 538 public abstract Prop<? extends LinkHolder> holder(); 480 539 481 540 /** 482 541 * The Ids of the events, fired by the "add" and "remove" buttons. 483 542 */ 484 543 public enum LinkActionIds { 485 544 /** 486 * A bew {@link LinkRule} should be added to the current link.545 * A new {@link LinkRule} should be added to the current link. 487 546 */ 488 547 @EventParams({}) 489 548 ADD_RULE, 490 549 491 550 /** 492 551 * The currently selected {@link LinkRule} should be removed from the model. 493 552 */ -
modules/org.sophie2.main.func.links/src/main/java/org/sophie2/main/func/links/LinksUtil.java
45 45 LogicR3.fire(hud, null, null, null, EventIds.SET_LINK, 46 46 newLink, "Change link action settings"); 47 47 48 hud. currentRule().set(newRule);48 hud.wantedRule().set(newRule); 49 49 } 50 50 51 51 /**