+package org.argeo.cms.swt.acr;
+
+import java.net.URI;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.widgets.StyledControl;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A {@link StyledControl} which can link either to an internal {@link Content}
+ * or an external URI.
+ */
+public abstract class LinkedControl extends StyledControl {
+
+ private static final long serialVersionUID = -7603153425459801216L;
+
+ private Content linkedContent;
+ private URI plainUri;
+
+ public LinkedControl(Composite parent, int swtStyle) {
+ super(parent, swtStyle);
+ }
+
+ public void setLink(Content linkedContent) {
+ if (plainUri != null)
+ throw new IllegalStateException("An URI is already set");
+ this.linkedContent = linkedContent;
+ }
+
+ public void setLink(URI uri) {
+ if (linkedContent != null)
+ throw new IllegalStateException("A linked content is already set");
+ this.plainUri = uri;
+ }
+
+ public boolean isInternalLink() {
+ if (!hasLink())
+ throw new IllegalStateException("No link has been set");
+ return linkedContent != null;
+ }
+
+ public boolean hasLink() {
+ return plainUri != null || linkedContent != null;
+ }
+
+ public Content getLinkedContent() {
+ return linkedContent;
+ }
+
+ public URI getPlainUri() {
+ return plainUri;
+ }
+
+ public URI toUri() {
+ if (plainUri != null)
+ return plainUri;
+ if (linkedContent != null)
+ return URI.create("#" + CmsSwtUtils.cleanPathForUrl(linkedContent.getPath()));
+ return null;
+
+ }
+
+}