|
|
@@ -7,7 +7,10 @@ import org.leumasjaffe.charsheet.model.inventory.DDInventory;
|
|
|
import org.leumasjaffe.charsheet.model.inventory.DDItem;
|
|
|
import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
|
|
|
import org.leumasjaffe.charsheet.model.inventory.Money;
|
|
|
+import org.leumasjaffe.charsheet.model.observable.IntValue;
|
|
|
import org.leumasjaffe.charsheet.view.dialog.BuySellItemDialog;
|
|
|
+import org.leumasjaffe.observer.IndirectObservableListener;
|
|
|
+import org.leumasjaffe.observer.ObservableListener;
|
|
|
import org.leumasjaffe.observer.ObserverDispatch;
|
|
|
|
|
|
import lombok.AccessLevel;
|
|
|
@@ -23,9 +26,11 @@ class ItemInfoMenu extends JPopupMenu {
|
|
|
*
|
|
|
*/
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
+
|
|
|
+ IndirectObservableListener<JMenuItem, IntValue> sellListener, equipListener = null;
|
|
|
+ ObservableListener<JMenuItem, DDInventory> buyListener;
|
|
|
|
|
|
public ItemInfoMenu(final DDInventory inv, final DDItem item) {
|
|
|
- final int rawWealth = inv.getWealth().asCopper();
|
|
|
final int rawValue = item.getValue().asCopper();
|
|
|
final BuySellAction doTxn = new BuySellAction(inv, item);
|
|
|
final BuySellDialogHelper dlg = new BuySellDialogHelper(item.getName());
|
|
|
@@ -41,25 +46,42 @@ class ItemInfoMenu extends JPopupMenu {
|
|
|
|
|
|
JMenuItem mntmBuy = new JMenuItem("Purchase");
|
|
|
mntmBuy.addActionListener(e -> {
|
|
|
- doTxn.applyTransaction(dlg.getNumUnits("Purchase", rawValue, rawWealth / rawValue), rawValue);
|
|
|
+ doTxn.applyTransaction(dlg.getNumUnits("Purchase", rawValue, inv.getWealth().asCopper() / rawValue), rawValue);
|
|
|
+ });
|
|
|
+ buyListener = new ObservableListener<>(mntmBuy, (c, v) -> {
|
|
|
+ c.setEnabled(inv.getWealth().asCopper() >= item.getValue().asCopper());
|
|
|
});
|
|
|
- mntmBuy.setEnabled(rawWealth >= item.getValue().asCopper());
|
|
|
+ buyListener.setObserved(inv);
|
|
|
add(mntmBuy);
|
|
|
|
|
|
JMenuItem mntmSell = new JMenuItem("Sell");
|
|
|
mntmSell.addActionListener(e -> {
|
|
|
doTxn.applyTransaction(-dlg.getNumUnits("Sell", rawValue / 2, item.getCount().value()), rawValue / 2);
|
|
|
});
|
|
|
- mntmSell.setEnabled(item.getUnequippedCount() > 0);
|
|
|
+ sellListener = new IndirectObservableListener<>(mntmSell, (c, v) -> {
|
|
|
+ c.setEnabled(item.getUnequippedCount() > 0);
|
|
|
+ });
|
|
|
+ sellListener.setObserved(item.getCount(), item.getCountEquipped());
|
|
|
add(mntmSell);
|
|
|
|
|
|
if (item.getSlot() != EquipmentSlot.NONE) {
|
|
|
JMenuItem mntmEquip = new JMenuItem("Equip");
|
|
|
- mntmEquip.setEnabled(item.getUnequippedCount() > 0);
|
|
|
mntmEquip.addActionListener(e -> EquipItemController.accept(inv.getEquipment(), item));
|
|
|
+ equipListener = new IndirectObservableListener<>(mntmEquip, (c, v) -> {
|
|
|
+ c.setEnabled(item.getUnequippedCount() > 0);
|
|
|
+ });
|
|
|
+ equipListener.setObserved(item.getCount(), item.getCountEquipped());
|
|
|
add(mntmEquip);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void removeNotify() {
|
|
|
+ super.removeNotify();
|
|
|
+ ObserverDispatch.unsubscribeAll(buyListener);
|
|
|
+ ObserverDispatch.unsubscribeAll(sellListener);
|
|
|
+ ObserverDispatch.unsubscribeAll(equipListener);
|
|
|
+ }
|
|
|
|
|
|
@AllArgsConstructor
|
|
|
@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|