Files
gzz-mirror/Java/flob/SimpleFlobView.zob
2026-09-14 20:19:29 -04:00

154 lines
3.8 KiB
Java

/*
SimpleFlobRaster.zob
*
* Copyright (c) 2000, Ted Nelson and Tuomas Lukka
*
* You may use and distribute under the terms of either the GNU Lesser
* General Public License, either version 2 of the license or,
* at your choice, any later version. Alternatively, you may use and
* distribute under the terms of the XPL.
*
* See the LICENSE.lgpl and LICENSE.xpl files for the specific terms of
* the licenses.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the README
* file for more details.
*
*/
/*
* Written by Tuomas Lukka
*/
package org.gzigzag;
import java.util.*;
import java.awt.*;
/** A simple but powerful raster which uses flob coordinates.
* Z is the selection dimension, X and Y are the flob dimension
* specifications.
*/
public class SimpleFlobView implements FlobView, ZOb {
public static final String rcsid = "$Id$";
public static boolean dbg = false;
static final void p(String s) { if(dbg) System.out.println(s); }
static final void pa(String s) { System.out.println(s); }
STRUCTPARAMS {
/** Whether the selection dimension is always d.2 or
* whether it is the Z dimension.
*/
boolean selectd2
= true;
/** The connectors.
*/
ZOb decorator
= null;
}
Component comp;
static class FlobDim {
String name;
ZZPath num;
ZZPath txt;
FlobDim(ZZCell c) {
name = c.getText();
c = c.s("d.1", 1);
if(c==null) throw new ZZError("Invalid flobdim 1");
ZZCell ps = c.s("d.2", 1);
if(ps==null) throw new ZZError("Invalid flobdim 2");
num = ZZPath.createFromStructure1(ps);
c = c.s("d.1", 1);
if(c==null) throw new ZZError("Invalid flobdim 3");
ps = c.s("d.2", 1);
if(ps==null) throw new ZZError("Invalid flobdim 4");
txt = ZZPath.createFromStructure1(ps);
}
/** Find the zoom record for this dimension and use
* it to scale the output coordinates.
*/
public void findZoom(ZZCell c) {
}
float ozero = 0, omax = 1;
int zero, max;
public void setFinalRange(int zero, int max) {
this.zero = zero; this.max = max;
}
public int getNO(ZZCell c) {
ZZCell r = num.readFrom(c, false);
if(r == null)
return -1;
float f = Float.valueOf(r.getText()).floatValue();
return (int)(((f-ozero)/omax) * max + zero);
}
}
public SimpleFlobView() { }
public void raster(FlobSet into, FlobFactory fact,
ZZCell view, String[] dims, ZZCell accursed) {
Dimension size = into.getSize();
FlobDim x, y;
String z = null;
ZZCell di = view.s("d.dims", 1);
x = new FlobDim(ZZCursorReal.get(di));
di = di.s("d.dims", 1);
y = new FlobDim(ZZCursorReal.get(di));
if(selectd2)
z = "d.2";
else {
di = di.s("d.dims", 1);
z = ZZCursorReal.get(di).getText();
}
// Find ZOOM factors
ZZCell fz = ZZDefaultSpace.findInheritableParam(view, "FlobZoom");
if(fz == null) {
fz = view.N("d.2", 1);
fz.setText("FlobZoom");
fz.N("d.1", 1);
}
ZZCell zl = fz.s("d.1", 1);
x.findZoom(zl); x.setFinalRange(0, size.width);
y.findZoom(zl); y.setFinalRange(0, size.height);
// XXX better
// This is all our cells.
ZZCell[] cells = accursed.h(z, -1).readRank(z, 1, true);
final int w = 4;
final int h = 4;
// Now get the coordinates.
for(int i=0; i<cells.length; i++) {
ZZCell c = cells[i].h("d.ref", -1);
int xc = x.getNO(c);
int yc = y.getNO(c);
p("C: "+xc+" "+yc);
fact.makeFlob(into, cells[i], c,
1, xc-w/2, yc-h/2, 1, w, h);
}
if(decorator != null) {
if(!(decorator instanceof FlobDecorator))
throw new ZZError("FlobDim decorator must be FlobDecorator: "+
decorator);
((FlobDecorator)decorator).decorate(into, "", view);
}
}
}
// vim: set syntax=java :