Files
gzz-mirror/Modules/mbox/SingleMail.zob
2026-09-14 20:19:29 -04:00

134 lines
3.3 KiB
Java

/*
SingleMail.zob
*
* 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 Tuukka Hastrup
*/
package org.gzigzag.module.mbox;
import org.gzigzag.*;
import java.awt.*;
/** A presentation of a single e-mail message.
*/
public class SingleMail implements FlobView, ZOb {
public static final boolean dbg = true;
static final void p(String s) { if (dbg) System.out.println(s); }
STRUCTPARAMS {
Font hfont = new Font("SansSerif", Font.PLAIN, 14);
Font dfont = new Font("SansSerif", Font.BOLD, 14);
Font bfont = new Font("Monospaced", Font.PLAIN, 12);
int tabstop = 8;
}
int headerh;
int bodyh;
FontMetrics hfm;
Color headerc, datac, bodyc;
String tabs[];
INITIALIZE {
headerh = (hfont.getSize() > dfont.getSize()? hfont.getSize()
: dfont.getSize());
bodyh = bfont.getSize();
hfm = FONTMETRICS(hfont);
headerc = datac = bodyc = Color.red;
tabs = new String[tabstop + 1];
tabs[0] = "";
for (int i = 1; i < tabstop + 1; i++)
tabs[i] = tabs[i - 1] + '\t';
}
public void raster(FlobSet into, FlobFactory fact,
ZZCell view, String[]dims, ZZCell accursed) {
Dimension d = into.getSize();
ZZCell handle = accursed.h("d.ref", -1);
ZZCell c = handle;
ZZCell f;
int y = 0;
c = c.s("d.handle", 1);
while (c != null && y <= d.height) {
f = c.s("d.1", 1);
if (f != null) // Header record
y = addHeader(into, y, c, f);
else
y = addBody(into, y, c);
c = c.s("d.handle", 1);
}
}
int addHeader(FlobSet into, int y, ZZCell c, ZZCell d) {
p(into.toString() + y + c.toString() + d.toString());
p("C: " + c.getID());
p("D: " + d.getID());
String field = c.getText();
String data = d.getText();
y += headerh;
into.add(new TextDecor(0, y, field, headerc, hfont));
into.add(new TextDecor(hfm.stringWidth(field) + 10, y,
data, datac, dfont));
return y;
}
int addBody(FlobSet into, int y, ZZCell c) {
String body = c.getText();
int start = 0;
int end = -1;
while (end < body.length()) { // Split into lines
end = body.indexOf('\n', end + 1);
if (end == -1)
end = body.length();
y += bodyh;
if (start < end) {
String line = body.substring(start, end);
StringBuffer buf = new StringBuffer();
int offs = 0;
int pos = 0;
int tab = -1;
while (tab < line.length()) { // Expand tabs
tab = line.indexOf('\t', tab + 1);
if (tab == -1)
tab = line.length();
buf.append(line.substring(pos, tab));
if (tab < line.length()) {
int tablen = tabstop - ((tab + offs) % tabstop);
p("Tab: " + tablen);
buf.append(tabs[tablen]);
offs = offs + tablen - 1;
}
pos = tab + 1;
}
into.add(new TextDecor(0, y, new String(buf), bodyc, bfont));
}
start = end + 1;
}
return y;
}
}
// vim: set syntax=java :