|
|
@@ -26,6 +26,7 @@ import org.leumasjaffe.charsheet.model.DDCharacter;
|
|
|
import org.leumasjaffe.charsheet.model.DDCharacterClass;
|
|
|
import org.leumasjaffe.charsheet.observer.ObserverHelper;
|
|
|
import org.leumasjaffe.charsheet.view.level.ExperienceDialog;
|
|
|
+import org.leumasjaffe.observer.ObservableListener;
|
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
|
|
|
@@ -36,12 +37,11 @@ import lombok.SneakyThrows;
|
|
|
import lombok.experimental.FieldDefaults;
|
|
|
import lombok.experimental.NonFinal;
|
|
|
|
|
|
+@SuppressWarnings("serial")
|
|
|
@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
public class D20Sheet extends JFrame {
|
|
|
- /**
|
|
|
- *
|
|
|
- */
|
|
|
- private static final long serialVersionUID = 1L;
|
|
|
+ static int TABS_BEFORE_CLASSES = 1;
|
|
|
+
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
@NonFinal File currentlyOpenFile = null;
|
|
|
@NonFinal @NonNull DDCharacter model = new DDCharacter();
|
|
|
@@ -52,7 +52,9 @@ public class D20Sheet extends JFrame {
|
|
|
JPanel abilitiesTab;
|
|
|
SkillTab skillTab;
|
|
|
EquipmentTab equipmentTab;
|
|
|
- private DeveloperMenu developerMenu;
|
|
|
+ DeveloperMenu developerMenu;
|
|
|
+
|
|
|
+ ObservableListener<D20Sheet, DDCharacter> listener;
|
|
|
|
|
|
public D20Sheet() {
|
|
|
UIManager.put("CheckBox.disabledText", UIManager.get("CheckBox.foreground"));
|
|
|
@@ -119,7 +121,7 @@ public class D20Sheet extends JFrame {
|
|
|
|
|
|
JMenuItem mntmGainExperience = new JMenuItem("Gain Experience");
|
|
|
mntmGainExperience.addActionListener(e -> {
|
|
|
- ExperienceDialog.GainExperience(this.model);
|
|
|
+ ExperienceDialog.gainExperience(this.model);
|
|
|
if (Config.get(K_LEVELUP, IMMEDIATELY) == IMMEDIATELY) {
|
|
|
DialogBuilder.showLevelUpDialog(this, this.model, 0);
|
|
|
}
|
|
|
@@ -160,6 +162,7 @@ public class D20Sheet extends JFrame {
|
|
|
menuBar.add(developerMenu);
|
|
|
|
|
|
// Set up post-GUI dependencies
|
|
|
+ listener = new ObservableListener<>(this, (c, v) -> c.reloadModel());
|
|
|
setModel(model);
|
|
|
}
|
|
|
|
|
|
@@ -176,7 +179,7 @@ public class D20Sheet extends JFrame {
|
|
|
tabbedPane.addTab("Skills", null, skillTab, null);
|
|
|
tabbedPane.addTab("Gear & Items", null, equipmentTab, null);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void saveAs(final JFileChooser fc) {
|
|
|
int rv = fc.showSaveDialog(this);
|
|
|
if ( rv == JFileChooser.APPROVE_OPTION ) {
|
|
|
@@ -184,7 +187,7 @@ public class D20Sheet extends JFrame {
|
|
|
saveModelResource();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
@SneakyThrows
|
|
|
private void loadModelResource(File selectedFile) {
|
|
|
currentlyOpenFile = selectedFile;
|
|
|
@@ -197,16 +200,44 @@ public class D20Sheet extends JFrame {
|
|
|
mapper.writeValue(currentlyOpenFile, model);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ private void reloadModel() {
|
|
|
+ int i = -1;
|
|
|
+ for (DDCharacterClass cc : this.model.getClasses()) {
|
|
|
+ ++i;
|
|
|
+ if (checkIfClassExistsAndOverwrite(cc)) continue;
|
|
|
+ ClassTab ct = new ClassTab(model, cc);
|
|
|
+ classTabs.add(ct);
|
|
|
+ tabbedPane.insertTab(ct.getName(), null, ct, null, TABS_BEFORE_CLASSES + i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean checkIfClassExistsAndOverwrite(DDCharacterClass cc) {
|
|
|
+ for (int j = 0; j < classTabs.size(); ++j) {
|
|
|
+ final DDCharacterClass dclass = classTabs.get(j).getModel();
|
|
|
+ if (dclass.getName().equals(cc.getName())) {
|
|
|
+ if (dclass.getLevel().value() != cc.getLevel().value()) {
|
|
|
+ ClassTab ct = new ClassTab(model, cc);
|
|
|
+ classTabs.set(j, ct);
|
|
|
+ tabbedPane.setComponentAt(j + TABS_BEFORE_CLASSES, ct);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
private void setModel(DDCharacter model) {
|
|
|
- classTabs.clear();
|
|
|
this.model = model;
|
|
|
+ classTabs.clear();
|
|
|
summaryTab.setModel(model);
|
|
|
- model.getClasses().stream().forEach(cc -> classTabs.add(new ClassTab(model, cc)));
|
|
|
+
|
|
|
equipmentTab.setModel(model);
|
|
|
skillTab.setModel(model);
|
|
|
developerMenu.setModel(model);
|
|
|
-
|
|
|
+
|
|
|
reorderTabs();
|
|
|
+
|
|
|
+ listener.setObserved(this.model);
|
|
|
}
|
|
|
}
|