/** * BackgroundView.java * (c) Peter Bielik and Radek Burget, 2011-2012 * * SwingBox is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SwingBox 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 * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with SwingBox. If not, see <http://www.gnu.org/licenses/>. * */ package org.fit.cssbox.swingbox.view; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Shape; import java.util.Map; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Element; import javax.swing.text.Position; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.Position.Bias; import javax.swing.text.View; import org.fit.cssbox.layout.ElementBox; import org.fit.cssbox.swingbox.util.Anchor; import org.fit.cssbox.swingbox.util.Constants; /** * @author Peter Bielik * @version 1.0 * @since 1.0 - 14.4.2011 */ public class BackgroundView extends View implements CSSBoxView { private ElementBox box; private int order; /** the cache of attributes */ private AttributeSet attributes; /** decides whether to construct a cache from current working properties */ private boolean refreshAttributes; private Anchor anchor; /** * */ public BackgroundView(Element elem) { super(elem); AttributeSet tmpAttr = elem.getAttributes(); Object obj = tmpAttr.getAttribute(Constants.ATTRIBUTE_BOX_REFERENCE); anchor = (Anchor) tmpAttr.getAttribute(Constants.ATTRIBUTE_ANCHOR_REFERENCE); Integer i = (Integer) tmpAttr.getAttribute(Constants.ATTRIBUTE_DRAWING_ORDER); order = (i == null) ? -1 : i; if (obj instanceof ElementBox) { box = (ElementBox) obj; } else { throw new IllegalArgumentException("Box reference is not an instance of ElementBox"); } if (box.toString().contains("\"btn\"")) System.out.println("jo!"); if (box.getElement() != null) { Map<String, String> elementAttributes = anchor.getProperties(); org.w3c.dom.Element pelem = Anchor.findAnchorElement(box.getElement()); if (pelem != null) { anchor.setActive(true); elementAttributes.put(Constants.ELEMENT_A_ATTRIBUTE_HREF, pelem.getAttribute("href")); elementAttributes.put(Constants.ELEMENT_A_ATTRIBUTE_NAME, pelem.getAttribute("name")); elementAttributes.put(Constants.ELEMENT_A_ATTRIBUTE_TITLE, pelem.getAttribute("title")); String target = pelem.getAttribute("target"); if ("".equals(target)) { target = "_self"; } elementAttributes.put(Constants.ELEMENT_A_ATTRIBUTE_TARGET, target); } else { anchor.setActive(false); elementAttributes.clear(); } } } @Override public String toString() { return "Background " + order +": " + box; } @Override public void paint(Graphics graphics, Shape allocation) { Graphics2D g; if (graphics instanceof Graphics2D) g = (Graphics2D) graphics; else throw new RuntimeException("Unknown graphics environment, java.awt.Graphics2D required !"); box.getVisualContext().updateGraphics(g); box.drawBackground(g); } @Override public void setParent(View parent) { super.setParent(parent); refreshAttributes = true; } @Override public boolean isVisible() { return box.isVisible(); } @Override public int viewToModel(float x, float y, Shape a, Bias[] bias) { Rectangle alloc = a instanceof Rectangle ? (Rectangle) a : a.getBounds(); if (x < alloc.x + (alloc.width / 2)) { bias[0] = Position.Bias.Forward; return getStartOffset(); } bias[0] = Position.Bias.Backward; return getEndOffset(); } @Override public Shape modelToView(int pos, Shape a, Bias b) throws BadLocationException { int p0 = getStartOffset(); int p1 = getEndOffset(); if ((pos >= p0) && (pos <= p1)) { Rectangle r = a instanceof Rectangle ? (Rectangle) a : a.getBounds(); if (pos == p1) { r.x += r.width; } r.width = 0; return r; } throw new BadLocationException(pos + " not in range " + p0 + "," + p1, pos); } @Override public float getPreferredSpan(int axis) { switch (axis) { case View.X_AXIS: return 10f; //box.getWidth(); case View.Y_AXIS: return 10f; //box.getHeight(); default: throw new IllegalArgumentException("Invalid axis: " + axis); } } @Override public int getDrawingOrder() { return order; } @Override public AttributeSet getAttributes() { if (refreshAttributes) { attributes = createAttributes(); refreshAttributes = false; } // always returns the same instance. // We need to know, if somebody modifies us outside.. return attributes; } protected SimpleAttributeSet createAttributes() { SimpleAttributeSet res = new SimpleAttributeSet(); res.addAttribute(Constants.ATTRIBUTE_ANCHOR_REFERENCE, anchor); res.addAttribute(Constants.ATTRIBUTE_BOX_REFERENCE, box); return res; } }