119 lines
3.4 KiB
Java
119 lines
3.4 KiB
Java
package it.cavallium.warppi.gui.expression.blocks;
|
|
|
|
import it.cavallium.warppi.gui.expression.Caret;
|
|
import it.cavallium.warppi.gui.graphicengine.GraphicEngine;
|
|
import it.cavallium.warppi.gui.graphicengine.Renderer;
|
|
import it.cavallium.warppi.math.Function;
|
|
import it.cavallium.warppi.math.MathContext;
|
|
import it.cavallium.warppi.math.parser.features.FeatureDivision;
|
|
import it.cavallium.warppi.math.parser.features.interfaces.Feature;
|
|
import it.cavallium.warppi.util.Error;
|
|
|
|
public class BlockDivision extends Block {
|
|
|
|
private final BlockContainer containerUp;
|
|
private final BlockContainer containerDown;
|
|
|
|
private int paddingLeftUpper;
|
|
private int paddingLeftLower;
|
|
private int h1;
|
|
|
|
public BlockDivision() {
|
|
containerUp = new BlockContainer(this, false);
|
|
containerDown = new BlockContainer(this, false);
|
|
recomputeDimensions();
|
|
}
|
|
|
|
@Override
|
|
public void draw(final GraphicEngine ge, final Renderer r, final int x, final int y, final Caret caret) {
|
|
BlockContainer.getDefaultFont(small).use(ge);
|
|
r.glColor(BlockContainer.getDefaultColor());
|
|
containerUp.draw(ge, r, x + 1 + paddingLeftUpper, y, caret);
|
|
r.glColor(BlockContainer.getDefaultColor());
|
|
r.glDrawLine(x, y + h1 + 1, x + width - 1, y + h1 + 1);
|
|
containerDown.draw(ge, r, x + 1 + paddingLeftLower, y + h1 + 3, caret);
|
|
}
|
|
|
|
@Override
|
|
public boolean putBlock(final Caret caret, final Block newBlock) {
|
|
boolean added = false;
|
|
added = added | containerUp.putBlock(caret, newBlock);
|
|
added = added | containerDown.putBlock(caret, newBlock);
|
|
if (added)
|
|
recomputeDimensions();
|
|
return added;
|
|
}
|
|
|
|
@Override
|
|
public boolean delBlock(final Caret caret) {
|
|
boolean removed = false;
|
|
removed = removed | containerUp.delBlock(caret);
|
|
removed = removed | containerDown.delBlock(caret);
|
|
if (removed)
|
|
recomputeDimensions();
|
|
return removed;
|
|
}
|
|
|
|
@Override
|
|
public BlockReference<?> getBlock(final Caret caret) {
|
|
BlockReference<?> bl = null;
|
|
bl = containerUp.getBlock(caret);
|
|
if (bl != null)
|
|
return bl;
|
|
bl = containerDown.getBlock(caret);
|
|
return bl;
|
|
}
|
|
|
|
@Override
|
|
public void recomputeDimensions() {
|
|
final int w1 = containerUp.getWidth();
|
|
final int w2 = containerDown.getWidth();
|
|
final int h1 = containerUp.getHeight();
|
|
final int h2 = containerDown.getHeight();
|
|
width = (w1 > w2 ? w1 : w2) + 4;
|
|
height = h1 + 3 + h2;
|
|
line = h1 + 1;
|
|
this.h1 = h1;
|
|
if (w1 != w2) {
|
|
if (w1 > w2) {
|
|
paddingLeftUpper = 0;
|
|
paddingLeftLower = (w1 - w2) / 2;
|
|
} else {
|
|
paddingLeftUpper = (w2 - w1) / 2;
|
|
paddingLeftLower = 0;
|
|
}
|
|
} else {
|
|
paddingLeftUpper = 0;
|
|
paddingLeftLower = 0;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setSmall(final boolean small) {
|
|
this.small = small;
|
|
containerUp.setSmall(small);
|
|
containerDown.setSmall(small);
|
|
recomputeDimensions();
|
|
}
|
|
|
|
public BlockContainer getUpperContainer() {
|
|
return containerUp;
|
|
}
|
|
|
|
public BlockContainer getLowerContainer() {
|
|
return containerDown;
|
|
}
|
|
|
|
@Override
|
|
public int computeCaretMaxBound() {
|
|
return containerUp.computeCaretMaxBound() + containerDown.computeCaretMaxBound();
|
|
}
|
|
|
|
@Override
|
|
public Feature toFeature(final MathContext context) throws Error {
|
|
final Function upper = getUpperContainer().toFunction(context);
|
|
final Function lower = getLowerContainer().toFunction(context);
|
|
return new FeatureDivision(upper, lower);
|
|
}
|
|
}
|