/*
* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project
*
* This library 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 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Contact info: lobochief@users.sourceforge.net
*/
package com.nvarghese.beowulf.common.cobra.html.domimpl;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.w3c.dom.UserDataHandler;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.html2.HTMLBodyElement;
import org.w3c.dom.html2.HTMLDocument;
import org.w3c.dom.html2.HTMLLinkElement;
import com.nvarghese.beowulf.common.cobra.html.HtmlRendererContext;
import com.nvarghese.beowulf.common.cobra.util.gui.ColorFactory;
public class HTMLLinkElementImpl extends HTMLAbstractUIElement implements HTMLLinkElement {
private static final Logger logger = Logger.getLogger(HTMLLinkElementImpl.class.getName());
private static final boolean loggableInfo = logger.isLoggable(Level.INFO);
private CSSStyleSheet styleSheet;
public HTMLLinkElementImpl(String name) {
super(name);
}
private boolean disabled;
public boolean getDisabled() {
return this.disabled;
}
public void setDisabled(boolean disabled) {
this.disabled = disabled;
CSSStyleSheet sheet = this.styleSheet;
if (sheet != null) {
sheet.setDisabled(disabled);
}
}
public String getHref() {
String href = this.getAttribute("href");
return href == null ? "" : href;
}
public void setHref(String href) {
this.setAttribute("href", href);
}
public String getHreflang() {
return this.getAttribute("hreflang");
}
public void setHreflang(String hreflang) {
this.setAttribute("hreflang", hreflang);
}
public String getMedia() {
return this.getAttribute("media");
}
public void setMedia(String media) {
this.setAttribute("media", media);
}
public String getRel() {
return this.getAttribute("rel");
}
public void setRel(String rel) {
this.setAttribute("rel", rel);
}
public String getRev() {
return this.getAttribute("rev");
}
public void setRev(String rev) {
this.setAttribute("rev", rev);
}
public String getTarget() {
String target = this.getAttribute("target");
if (target != null) {
return target;
}
HTMLDocumentImpl doc = (HTMLDocumentImpl) this.document;
return doc == null ? null : doc.getDefaultTarget();
}
public void setTarget(String target) {
this.setAttribute("target", target);
}
public String getType() {
return this.getAttribute("type");
}
public void setType(String type) {
this.setAttribute("type", type);
}
public Object setUserData(String key, Object data, UserDataHandler handler) {
if (com.nvarghese.beowulf.common.cobra.html.parser.HtmlParser.MODIFYING_KEY.equals(key) && data != Boolean.TRUE) {
this.processLink();
}
/*
* else
* if(com.steadystate.css.dom.CSSStyleSheetImpl.KEY_DISABLED_CHANGED
* .equals(key)) { this.informDocumentInvalid(); }
*/
return super.setUserData(key, data, handler);
}
/**
* If the LINK refers to a stylesheet document, this method loads and parses
* it.
*/
protected void processLink() {
this.styleSheet = null;
// String rel = this.getAttribute("rel");
/*
* if(rel != null) { String cleanRel = rel.trim().toLowerCase(); boolean
* isStyleSheet = cleanRel.equals("stylesheet"); boolean isAltStyleSheet
* = cleanRel.equals("alternate stylesheet"); if(isStyleSheet ||
* isAltStyleSheet) { UserAgentContext uacontext =
* this.getUserAgentContext(); if(uacontext.isExternalCSSEnabled()) {
* String media = this.getMedia(); if(CSSUtilities.matchesMedia(media,
* uacontext)) { HTMLDocumentImpl doc = (HTMLDocumentImpl)
* this.getOwnerDocument(); try { boolean liflag = loggableInfo; long
* time1 = liflag ? System.currentTimeMillis() : 0; try { CSSStyleSheet
* sheet = CSSUtilities.parse(this, this.getHref(), doc,
* doc.getBaseURI(), false); if(sheet != null) { this.styleSheet =
* sheet; if(sheet instanceof CSSStyleSheetImpl) { CSSStyleSheetImpl
* sheetImpl = (CSSStyleSheetImpl) sheet; if(isAltStyleSheet) {
* sheetImpl.setDisabledOnly(true); } else {
* sheetImpl.setDisabledOnly(this.disabled); } } else {
* if(isAltStyleSheet) { sheet.setDisabled(true); } else {
* sheet.setDisabled(this.disabled); } } doc.addStyleSheet(sheet); } }
* finally { if(liflag) { long time2 = System.currentTimeMillis();
* logger
* .info("processLink(): Loaded and parsed CSS (or attempted to) at URI=["
* + this.getHref() + "] in " + (time2 - time1) + " ms."); } }
*
* } catch(MalformedURLException mfe) {
* this.warn("Will not parse CSS. URI=[" + this.getHref() +
* "] with BaseURI=[" + doc.getBaseURI() +
* "] does not appear to be a valid URI."); } catch(Throwable err) {
* this.warn("Unable to parse CSS. URI=[" + this.getHref() + "].", err);
* } } } } }
*/
}
public String getAbsoluteHref() {
HtmlRendererContext rcontext = this.getHtmlRendererContext();
if (rcontext != null) {
String href = this.getHref();
if (href != null && href.length() > 0) {
// String target = this.getTarget();
try {
URL url = this.getFullURL(href);
return url == null ? null : url.toExternalForm();
} catch (MalformedURLException mfu) {
this.warn("Malformed URI: [" + href + "].", mfu);
}
}
}
return null;
}
public void navigate() {
if (this.disabled) {
return;
}
HtmlRendererContext rcontext = this.getHtmlRendererContext();
if (rcontext != null) {
String href = this.getHref();
if (href != null && href.length() > 0) {
String target = this.getTarget();
try {
URL url = this.getFullURL(href);
if (url == null) {
this.warn("Unable to resolve URI: [" + href + "].");
} else {
rcontext.linkClicked(this, url, target);
}
} catch (MalformedURLException mfu) {
this.warn("Malformed URI: [" + href + "].", mfu);
}
}
}
}
private java.awt.Color getLinkColor() {
HTMLDocument doc = (HTMLDocument) this.document;
if (doc != null) {
HTMLBodyElement body = (HTMLBodyElement) doc.getBody();
if (body != null) {
String vlink = body.getVLink();
String link = body.getLink();
if (vlink != null || link != null) {
HtmlRendererContext rcontext = this.getHtmlRendererContext();
if (rcontext != null) {
boolean visited = rcontext.isVisitedLink(this);
String colorText = visited ? vlink : link;
if (colorText != null) {
return ColorFactory.getInstance().getColor(colorText);
}
}
}
}
}
return java.awt.Color.BLUE;
}
/*
* protected RenderState createRenderState(RenderState prevRenderState) {
* if(this.hasAttribute("href")) { prevRenderState = new
* TextDecorationRenderState(prevRenderState,
* RenderState.MASK_TEXTDECORATION_UNDERLINE); prevRenderState = new
* ColorRenderState(prevRenderState, this.getLinkColor()); } return
* super.createRenderState(prevRenderState); }
*/
public String toString() {
// Javascript code often depends on this being exactly href. See
// js9.html.
// To change, perhaps add method to AbstractScriptableDelegate.
return this.getHref();
}
}