Skip to content

Commit

Permalink
Now child list can also be ModelField
Browse files Browse the repository at this point in the history
  • Loading branch information
klesun committed Jun 5, 2015
1 parent 8846074 commit b46e2a2
Show file tree
Hide file tree
Showing 30 changed files with 544 additions and 340 deletions.
22 changes: 8 additions & 14 deletions src/Model/AbstractHandler.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package Model;

import Storyspace.Staff.MidianaComponent;
import Storyspace.Staff.StaffPanel;

import javax.swing.*;
Expand All @@ -13,15 +14,15 @@

abstract public class AbstractHandler implements KeyListener, MouseListener, MouseMotionListener {

private IModel context = null;
private IComponentModel context = null;
protected LinkedHashMap<Combo, ActionFactory> actionMap = new LinkedHashMap<>();
protected static LinkedList<Action> handledEventQueue = new LinkedList<>(); // for ctrl-z
protected static LinkedList<Action> unhandledEventQueue = new LinkedList<>(); // for ctrl-y

// mouse
protected Point mouseLocation = new Point(0,0);

public AbstractHandler(IModel context) {
public AbstractHandler(IComponentModel context) {
this.context = context;
this.initActionMap();

Expand Down Expand Up @@ -57,7 +58,7 @@ final public void keyTyped(KeyEvent e) {}
final public void keyReleased(KeyEvent e) {}

private AbstractHandler getRootHandler() {
IModel rootContext = getContext();
IComponentModel rootContext = getContext();
while (rootContext.getModelParent() != null) {
rootContext = rootContext.getModelParent();
}
Expand All @@ -79,7 +80,9 @@ final public Boolean handleKey(Combo combo) {
}
}
}
if (getSheetPanel() != null) { getSheetPanel().checkCam(); } // говно!!!
if (getContext() instanceof MidianaComponent) { // i don't like this
MidianaComponent.class.cast(getContext()).getFirstPanelParent().checkCam();
}
return result;
}

Expand All @@ -101,16 +104,7 @@ final public static void destroyRedoHistory() {
while (unhandledEventQueue.poll() != null);
}

// TODO: it's so ugly...
private StaffPanel getSheetPanel() {
IModel context = getContext();
while (!(context instanceof StaffPanel) && context != null) { // circular import? yes...
context = context.getModelParent();
}
return (StaffPanel)context;
}

public IModel getContext() {
public IComponentModel getContext() {
return this.context;
}

Expand Down
67 changes: 17 additions & 50 deletions src/Model/AbstractModel.java
Original file line number Diff line number Diff line change
@@ -1,79 +1,46 @@

package Model;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.HashMap;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import Gui.Settings;
import Model.Field.AbstractModelField;
import Model.Field.Bool;
import Model.Field.Int;
import Model.Field.Str;
import Stuff.Tools.Logger;
import org.json.JSONException;
import org.json.JSONObject;

public abstract class AbstractModel implements IModel {

private IModel parent = null;
private AbstractHandler eventHandler = null;
private IComponentModel parent = null;
protected Helper h = new Helper(this);

public AbstractModel(IModel parent) { // TODO: parent should be AbstractModel
public AbstractModel(IComponentModel parent) { // TODO: i'm not sure, that parent is ALWAYS ComponentModel. It's just a temporary hack.
this.parent = parent;
this.eventHandler = this.makeHandler();
}

// override me please, if you got special fields (like Lists or Objects)
public AbstractModel reconstructFromJson(JSONObject jsObject) throws JSONException {
for (AbstractModelField field: fieldValueStorage) {
if (jsObject.has(field.getName())) { field.setValueFromJsObject(jsObject); }
else { Logger.warning("Source does not have field [" + field.getName() + "] for class {" + getClass().getSimpleName() + "}"); }
}
@Override
final public Helper getModelHelper() { return h; }

public List<String> getFieldList() {
return getModelHelper().getFieldStorage().stream().map(f -> f.getName()).collect(Collectors.toList());
}

// override me please
public AbstractModel reconstructFromJson(JSONObject jsObject) throws JSONException {
h.reconstructFromJson(jsObject);
return this;
}

// override me please, if you got special fields (like Lists or Objects)
// override me please
public void getJsonRepresentation(JSONObject dict) {
for (AbstractModelField field: fieldValueStorage) {
dict.put(field.getName(), field.getValue());
}
h.getJsonRepresentation(dict);
}

final public JSONObject getJsonRepresentation() { return Helper.getJsonRepresentation(this); }


abstract public AbstractModel getFocusedChild();
abstract protected AbstractHandler makeHandler();

final public AbstractHandler getHandler() { return this.eventHandler; }

public abstract void drawOn(Graphics surface, int x, int y);

// field getters

protected List<AbstractModelField> fieldValueStorage = new ArrayList<>();

protected Int addField(String fieldName, Integer fieldValue) {
Int field = new Int(fieldName, fieldValue);
fieldValueStorage.add(field);
return field;
}
protected Bool addField(String fieldName, Boolean fieldValue) {
Bool field = new Bool(fieldName, fieldValue);
fieldValueStorage.add(field);
return field;
}
protected Str addField(String fieldName, String fieldValue) {
Str field = new Str(fieldName, fieldValue);
fieldValueStorage.add(field);
return field;
}

public IModel getModelParent() { return this.parent; }
public IComponentModel getModelParent() { return this.parent; }

// from static context

Expand Down
44 changes: 0 additions & 44 deletions src/Model/Field/AbstractModelField.java

This file was deleted.

42 changes: 42 additions & 0 deletions src/Model/Field/Arr.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package Model.Field;

import Model.AbstractModel;
import Model.IModel;
import Stuff.Tools.Logger;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.List;

public class Arr<ELEM_CLASS extends AbstractModel> extends ModelField<List<ELEM_CLASS>> {

Class<ELEM_CLASS> elemClass;

public Arr(String name, List<ELEM_CLASS> value, IModel owner, Class<ELEM_CLASS> elemClass) {
super(name, value, owner);
this.elemClass = elemClass;
}

@Override
public JSONArray getJsonValue() {
JSONArray arr = new JSONArray("[]");
for (AbstractModel el: getValue()) {
arr.put(el.getJsonRepresentation());
}
return arr;
}

@Override
public void setValueFromJsObject(JSONObject jsObject) {
getValue().clear();
JSONArray arr = jsObject.getJSONArray(getName());
for (int i = 0; i < arr.length(); ++i) {
ELEM_CLASS el = null;
try { el = elemClass.getDeclaredConstructor(owner.getClass()).newInstance(owner); }
catch (Exception e) { Logger.fatal(e, "Failed to make instance of {" + elemClass.getSimpleName() + "}"); }

el.reconstructFromJson(arr.getJSONObject(i));
getValue().add(el);
}
}
}
19 changes: 0 additions & 19 deletions src/Model/Field/Bool.java

This file was deleted.

19 changes: 0 additions & 19 deletions src/Model/Field/Int.java

This file was deleted.

62 changes: 62 additions & 0 deletions src/Model/Field/ModelField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package Model.Field;

import Model.IModel;
import Stuff.Tools.Logger;
import org.json.JSONObject;

import java.util.List;
import java.util.function.Function;

public class ModelField<huj> {

private String name;
private huj value;
protected IModel owner;

public ModelField(String name, huj value, IModel owner) {
if (new JSONObject("{}").getGetterByClass(value.getClass()) == null) {
Logger.fatal("Unsupported Field Value Class! [" + value.getClass().getSimpleName() + "]");
}
this.owner = owner;
this.value = value;
this.name = name;
}

// override me please!
public Object getJsonValue() { return getValue(); };

// override me please!
public void setValueFromJsObject(JSONObject jsObject) {
huj value = (huj)jsObject.get(getName(), getValue().getClass());
setValue(value);
}

public ModelField<huj> addTo(List<ModelField> fieldStorage) {
fieldStorage.add(this);
return this;
}

// field getters/setters

public huj getValue() { return value; }

public String getName() { return name; }

public ModelField setValue(huj value) {
this.value = value;
return this;
}

public ModelField setValueFromString(String str) {
setValue((huj)getParseStringLambda().apply(str));
return this;
}

private Function<String, Object> getParseStringLambda() {
return getValue().getClass() == Integer.class ? Integer::parseInt :
getValue().getClass() == Boolean.class ? Boolean::parseBoolean :
getValue().getClass() == String.class ? s -> s :
s -> Logger.fatal("NO WAI!!!");

}
}
19 changes: 0 additions & 19 deletions src/Model/Field/Str.java

This file was deleted.

Loading

0 comments on commit b46e2a2

Please sign in to comment.