Skip to content

Commit

Permalink
#33 Reference editor (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
ShadelessFox authored Dec 31, 2022
2 parents 64ab2bc + 9cf1720 commit e7a18cb
Show file tree
Hide file tree
Showing 41 changed files with 928 additions and 293 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ private static void visitAllObjects(@Nullable Object root, @NotNull Predicate<Ob
for (Object element : array) {
visitAllObjects(element, consumer);
}
} else if (root instanceof RTTIReference reference) {
} else if (root instanceof RTTIReference.External reference) {
visitAllObjects(reference.path(), consumer);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ public static String getNormalizedPath(@NotNull String path, boolean normalizeEx
}

if (normalizeExtension) {
// If no extension is present, then index would become 0, yielding the same string
final String extension = path.substring(path.lastIndexOf('.') + 1);
final String extension = IOUtils.getExtension(path);

if (!extension.equals("core") && !extension.equals("stream")) {
path += ".core";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.shade.decima.model.packfile.edit.Change;
import com.shade.decima.model.util.Compressor;
import com.shade.decima.ui.navigator.impl.FilePath;
import com.shade.platform.model.util.IOUtils;
import com.shade.util.NotNull;
import com.shade.util.Nullable;
import org.slf4j.Logger;
Expand Down Expand Up @@ -37,12 +38,7 @@ public void mount(@NotNull Path packfile) throws IOException {
return;
}

String name = packfile.getFileName().toString();

if (name.indexOf('.') >= 0) {
name = name.substring(0, name.indexOf('.'));
}

final String name = IOUtils.getBasename(packfile.getFileName().toString());
final PackfileInfo info = metadata != null
? metadata.get(name)
: null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,46 +1,18 @@
package com.shade.decima.model.rtti.objects;

import com.shade.util.NotNull;
import com.shade.util.Nullable;

public record RTTIReference(@NotNull Type type, @Nullable RTTIObject uuid, @Nullable String path) {
public enum Type {
NONE(0, false, false),
INTERNAL_LINK(1, true, false),
EXTERNAL_LINK(2, true, true),
STREAMING_REFERENCE(3, true, true),
UUID_REFERENCE(5, true, false);
public sealed interface RTTIReference permits RTTIReference.None, RTTIReference.Internal, RTTIReference.External {
None NONE = new None();

private final byte value;
private final boolean hasUuid;
private final boolean hasPath;
record External(@NotNull Kind kind, @NotNull RTTIObject uuid, @NotNull String path) implements RTTIReference {}

Type(int value, boolean hasUuid, boolean hasPath) {
this.value = (byte) value;
this.hasUuid = hasUuid;
this.hasPath = hasPath;
}
record Internal(@NotNull Kind kind, @NotNull RTTIObject uuid) implements RTTIReference {}

@NotNull
public static Type valueOf(int value) {
for (Type type : values()) {
if (type.value == value) {
return type;
}
}
throw new IllegalArgumentException("Unknown reference type " + value);
}
record None() implements RTTIReference {}

public byte getValue() {
return value;
}

public boolean hasUuid() {
return hasUuid;
}

public boolean hasPath() {
return hasPath;
}
enum Kind {
LINK,
REFERENCE
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.shade.decima.model.rtti.types;

import com.shade.decima.model.rtti.RTTIClass;
import com.shade.decima.model.rtti.RTTIDefinition;
import com.shade.decima.model.rtti.RTTIType;
import com.shade.decima.model.rtti.RTTITypeParameterized;
Expand All @@ -24,33 +23,48 @@ public RTTITypeReference(@NotNull String name, @NotNull RTTIType<T> type) {
@NotNull
@Override
public RTTIReference read(@NotNull RTTITypeRegistry registry, @NotNull ByteBuffer buffer) {
final RTTIReference.Type type = RTTIReference.Type.valueOf(buffer.get());
final RTTIObject uuid = type.hasUuid() ? (RTTIObject) registry.find("GGUUID").read(registry, buffer) : null;
final String path = type.hasPath() ? (String) registry.find("String").read(registry, buffer) : null;
return new RTTIReference(type, uuid, path);
final RTTIType<RTTIObject> GGUUID = registry.find("GGUUID");
final RTTIType<String> String = registry.find("String");

return switch (buffer.get()) {
case 0 -> RTTIReference.NONE;
case 1 -> new RTTIReference.Internal(RTTIReference.Kind.LINK, GGUUID.read(registry, buffer));
case 2 -> new RTTIReference.External(RTTIReference.Kind.LINK, GGUUID.read(registry, buffer), String.read(registry, buffer));
case 5 -> new RTTIReference.Internal(RTTIReference.Kind.REFERENCE, GGUUID.read(registry, buffer));
case 3 -> new RTTIReference.External(RTTIReference.Kind.REFERENCE, GGUUID.read(registry, buffer), String.read(registry, buffer));
default -> throw new IllegalArgumentException("Unsupported reference type");
};
}

@Override
public void write(@NotNull RTTITypeRegistry registry, @NotNull ByteBuffer buffer, @NotNull RTTIReference value) {
buffer.put(value.type().getValue());
if (value.uuid() != null) {
((RTTIClass) registry.find("GGUUID")).write(registry, buffer, value.uuid());
}
if (value.path() != null) {
((RTTITypeString) registry.find("String")).write(registry, buffer, value.path());
final RTTIType<RTTIObject> GGUUID = registry.find("GGUUID");
final RTTIType<String> String = registry.find("String");

if (value instanceof RTTIReference.External ref) {
buffer.put((byte) (ref.kind() == RTTIReference.Kind.LINK ? 2 : 3));
GGUUID.write(registry, buffer, ref.uuid());
String.write(registry, buffer, ref.path());
} else if (value instanceof RTTIReference.Internal ref) {
buffer.put((byte) (ref.kind() == RTTIReference.Kind.LINK ? 1 : 5));
GGUUID.write(registry, buffer, ref.uuid());
} else {
buffer.put((byte) 0);
}
}

@Override
public int getSize(@NotNull RTTITypeRegistry registry, @NotNull RTTIReference value) {
int size = Byte.BYTES;
if (value.uuid() != null) {
size += ((RTTIClass) registry.find("GGUUID")).getSize(registry, value.uuid());
}
if (value.path() != null) {
size += ((RTTITypeString) registry.find("String")).getSize(registry, value.path());
final RTTIType<RTTIObject> GGUUID = registry.find("GGUUID");
final RTTIType<String> String = registry.find("String");

if (value instanceof RTTIReference.External ref) {
return Byte.BYTES + GGUUID.getSize(registry, ref.uuid()) + String.getSize(registry, ref.path());
} else if (value instanceof RTTIReference.Internal ref) {
return Byte.BYTES + GGUUID.getSize(registry, ref.uuid());
} else {
return Byte.BYTES;
}
return size;
}

@NotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.shade.decima.ui.controls;

import com.shade.platform.model.util.IOUtils;
import com.shade.util.NotNull;

import javax.swing.filechooser.FileFilter;
Expand Down Expand Up @@ -31,10 +32,9 @@ public boolean accept(File file) {
}

final String fileName = file.getName();
final int i = fileName.indexOf('.');
final String fileExtension = IOUtils.getExtension(fileName);

if (i > 0 && i < fileName.length() - 1) {
final String fileExtension = fileName.substring(i + 1).toLowerCase();
if (!fileExtension.isEmpty()) {
for (String extension : extensions) {
if (extension.equalsIgnoreCase(fileExtension)) {
return true;
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/com/shade/decima/ui/data/ValueController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.shade.decima.model.app.Project;
import com.shade.decima.model.rtti.RTTIType;
import com.shade.platform.ui.editors.Editor;
import com.shade.util.NotNull;

public interface ValueController<T> {
Expand All @@ -12,9 +13,9 @@ enum EditType {
INLINE,

/**
* A standalone editor that appears in a separate panel next to the editor.
* A standalone editor that appears in a modal dialog.
*/
PANEL
DIALOG
}

@NotNull
Expand All @@ -29,6 +30,9 @@ enum EditType {
@NotNull
String getValueLabel();

@NotNull
Editor getEditor();

@NotNull
Project getProject();

Expand Down
8 changes: 6 additions & 2 deletions src/main/java/com/shade/decima/ui/data/ValueEditor.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ public interface ValueEditor<T> {
@NotNull
T getEditorValue();

void addActionListener(@NotNull ActionListener listener);
default void addActionListener(@NotNull ActionListener listener) {
// do nothing by default
}

void removeActionListener(@NotNull ActionListener listener);
default void removeActionListener(@NotNull ActionListener listener) {
// do nothing by default
}
}
5 changes: 3 additions & 2 deletions src/main/java/com/shade/decima/ui/data/ValueManager.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.shade.decima.ui.data;

import com.shade.util.NotNull;
import com.shade.util.Nullable;

public interface ValueManager<T> {
@Nullable
@NotNull
ValueEditor<T> createEditor(@NotNull ValueController<T> controller);

boolean canEdit(@NotNull ValueController.EditType type);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import com.shade.util.NotNull;

import javax.swing.*;
import java.awt.event.ActionListener;

public abstract class BaseValueEditor<T, C extends JComponent> implements ValueEditor<T> {
protected final ValueController<T> controller;
Expand All @@ -21,16 +20,6 @@ public JComponent createComponent() {
return component = createComponentImpl();
}

@Override
public void addActionListener(@NotNull ActionListener listener) {
// do nothing by default
}

@Override
public void removeActionListener(@NotNull ActionListener listener) {
// do nothing by default
}

@NotNull
protected abstract C createComponentImpl();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.shade.decima.ui.data.editors;

import com.shade.decima.model.rtti.objects.RTTIObject;
import com.shade.decima.model.rtti.types.RTTITypeClass;
import com.shade.decima.ui.data.ValueController;
import com.shade.decima.ui.data.handlers.GGUUIDValueHandler;
import com.shade.util.NotNull;

import javax.swing.*;
import java.awt.event.ActionListener;
import java.util.UUID;

public class GGUUIDValueEditor extends BaseValueEditor<RTTIObject, JTextField> {
public GGUUIDValueEditor(@NotNull ValueController<RTTIObject> controller) {
super(controller);
}

@NotNull
@Override
protected JTextField createComponentImpl() {
return new JTextField();
}

@Override
public void setEditorValue(@NotNull RTTIObject value) {
component.setText("{%s}".formatted(GGUUIDValueHandler.INSTANCE.getString(value.type(), value)));
}

@NotNull
@Override
public RTTIObject getEditorValue() {
return fromString((RTTITypeClass) controller.getValueType(), component.getText());
}

@Override
public void addActionListener(@NotNull ActionListener listener) {
component.addActionListener(listener);
}

@Override
public void removeActionListener(@NotNull ActionListener listener) {
component.removeActionListener(listener);
}

@NotNull
public static RTTIObject fromString(@NotNull RTTITypeClass type, @NotNull String text) {
final UUID uuid;

if (text.startsWith("{") && text.endsWith("}")) {
uuid = UUID.fromString(text.substring(1, text.length() - 1));
} else {
uuid = UUID.fromString(text);
}

final long msb = uuid.getMostSignificantBits();
final long lsb = uuid.getLeastSignificantBits();
final RTTIObject object = type.instantiate();

object.set("Data3", (byte) (msb >>> 56));
object.set("Data2", (byte) (msb >>> 48));
object.set("Data1", (byte) (msb >>> 40));
object.set("Data0", (byte) (msb >>> 32));
object.set("Data5", (byte) (msb >>> 24));
object.set("Data4", (byte) (msb >>> 16));
object.set("Data7", (byte) (msb >>> 8));
object.set("Data6", (byte) (msb));
object.set("Data8", (byte) (lsb >>> 56));
object.set("Data9", (byte) (lsb >>> 48));
object.set("Data10", (byte) (lsb >>> 40));
object.set("Data11", (byte) (lsb >>> 32));
object.set("Data12", (byte) (lsb >>> 24));
object.set("Data13", (byte) (lsb >>> 16));
object.set("Data14", (byte) (lsb >>> 8));
object.set("Data15", (byte) (lsb));

return object;
}
}
Loading

0 comments on commit e7a18cb

Please sign in to comment.