core/com.nokia.cpp.utils.ui/src/com/nokia/cpp/internal/api/utils/ui/LinkParser.java
author dadubrow
Fri, 17 Sep 2010 10:34:07 -0500
changeset 2038 dd457404f42f
permissions -rw-r--r--
remove hypertext from other UIs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2038
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     1
package com.nokia.cpp.internal.api.utils.ui;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     2
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     3
import java.util.ArrayList;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     4
import java.util.List;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     5
import java.util.regex.Matcher;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     6
import java.util.regex.Pattern;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     7
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     8
import org.eclipse.jface.resource.JFaceColors;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
     9
import org.eclipse.jface.viewers.StyledString;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    10
import org.eclipse.jface.viewers.StyledString.Styler;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    11
import org.eclipse.swt.graphics.TextStyle;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    12
import org.eclipse.swt.widgets.Display;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    13
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    14
public class LinkParser {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    15
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    16
	public static class Element {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    17
		private String text;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    18
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    19
		public Element(String text) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    20
			this.text = text;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    21
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    22
		
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    23
		public String getText() {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    24
			return text;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    25
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    26
	}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    27
	
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    28
	public static class LinkElement extends Element {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    29
		private String href;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    30
		
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    31
		public LinkElement(String href, String text) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    32
			super(text);
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    33
			this.href = href;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    34
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    35
		
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    36
		public String getHref() {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    37
			return href;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    38
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    39
	}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    40
	
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    41
	private static final Pattern HREF_PATTERN = Pattern.compile("<a href=\"([^\"]*)\">(.*?)</a>", Pattern.CASE_INSENSITIVE);
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    42
	private static Styler hyperLinkStyler = new Styler() {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    43
		@Override
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    44
		public void applyStyles(TextStyle textStyle) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    45
			textStyle.foreground = JFaceColors.getHyperlinkText(Display.getDefault());
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    46
			textStyle.underline = true;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    47
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    48
	};
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    49
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    50
	public static List<Element> parseText(String text) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    51
		List<Element> elements = new ArrayList<Element>();
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    52
		if (text != null) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    53
			Matcher m = HREF_PATTERN.matcher(text);
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    54
			int start = 0;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    55
			int end;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    56
			while (m.find()) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    57
				end = m.start();
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    58
				if (start <= end)
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    59
					elements.add(new Element(text.substring(start, end)));
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    60
				elements.add(new LinkElement(m.group(1), m.group(2)));
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    61
				start = m.end();
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    62
			}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    63
			end = text.length();
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    64
			if (start <= end)
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    65
				elements.add(new Element(text.substring(start, end)));
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    66
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    67
		return elements;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    68
	}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    69
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    70
	public static StyledString getStyledString(List<Element> elements) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    71
		StyledString styledString = new StyledString();
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    72
		for (Element element : elements) {
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    73
			styledString.append(element.getText(), element instanceof LinkElement ? hyperLinkStyler : null);
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    74
		}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    75
		return styledString;
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    76
	}
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    77
dd457404f42f remove hypertext from other UIs
dadubrow
parents:
diff changeset
    78
}