gt: 					var description = descriptionList.item(i).getTextContent();
context: package phasereditor.ide.ui.views;
  
  import static java.lang.System.out;
  import static phasereditor.ui.PhaserEditorUI.swtRun;
  
  import java.io.ByteArrayInputStream;
  import java.nio.charset.Charset;
  import java.util.function.Supplier;
  import java.util.prefs.Preferences;
  
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResourceChangeEvent;
  import org.eclipse.core.resources.IResourceChangeListener;
  import org.eclipse.core.resources.IResourceDelta;
  import org.eclipse.core.resources.IResourceDeltaVisitor;
  import org.eclipse.core.resources.ResourcesPlugin;
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.core.runtime.IProgressMonitor;
  import org.eclipse.core.runtime.IStatus;
  import org.eclipse.core.runtime.Status;
  import org.eclipse.core.runtime.jobs.Job;
  import org.eclipse.jface.resource.JFaceColors;
  import org.eclipse.jface.viewers.StructuredSelection;
  import org.eclipse.jface.wizard.IWizard;
  import org.eclipse.jface.wizard.WizardDialog;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.custom.ScrolledComposite;
  import org.eclipse.swt.events.ControlListener;
  import org.eclipse.swt.graphics.Rectangle;
  import org.eclipse.swt.layout.GridData;
  import org.eclipse.swt.layout.GridLayout;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Label;
  import org.eclipse.swt.widgets.Text;
  import org.eclipse.ui.INewWizard;
  import org.eclipse.ui.IWorkbench;
  import org.eclipse.ui.PlatformUI;
  import org.eclipse.ui.forms.events.HyperlinkAdapter;
  import org.eclipse.ui.forms.events.HyperlinkEvent;
  import org.eclipse.ui.forms.widgets.ImageHyperlink;
  import org.eclipse.ui.part.ViewPart;
  import org.w3c.dom.Document;
  
  import phasereditor.ide.IDEPlugin;
  import phasereditor.lic.HttpTool;
  import phasereditor.project.core.ProjectCore;
  import phasereditor.project.ui.ProjectUI;
  import phasereditor.project.ui.wizards.NewPhaserExampleProjectWizard;
  import phasereditor.project.ui.wizards.NewPhaserProjectWizard;
  import phasereditor.ui.EditorSharedImages;
  import phasereditor.ui.SwtRM;
  import phasereditor.webrun.ui.WebRunUI;
  
  public class StartView extends ViewPart {
  
  	private static Composite _workspaceComp;
  	private IResourceChangeListener _resourceChangeListener;
  	private Composite _mainComp;
  	private ScrolledComposite _scrolledComp;
  
  	public StartView() {
  		// TODO Auto-generated constructor stub
  	}
  
  	@Override
  	public void createPartControl(Composite parent) {
  		_scrolledComp = new ScrolledComposite(parent, SWT.V_SCROLL);
  		_mainComp = new Composite(_scrolledComp, SWT.NONE);
  		var layout = new GridLayout(2, true);
  		layout.marginWidth = 50;
  		layout.marginHeight = 50;
  		_mainComp.setLayout(layout);
  
  		createMainHeader(_mainComp);
  
  		createLeftComp();
  
  		createRightComp();
  
  		_scrolledComp.setContent(_mainComp);
  		_scrolledComp.setExpandVertical(true);
  		_scrolledComp.setExpandHorizontal(true);
  		_scrolledComp.addControlListener(ControlListener.controlResizedAdapter(e -> {
  			updateScrolledComposite();
  		}));
  
  		registerListeners();
  
  	}
  
  	@Override
  	public void dispose() {
  		ResourcesPlugin.getWorkspace().removeResourceChangeListener(_resourceChangeListener);
  
  		super.dispose();
  	}
  
  	private void registerListeners() {
  		_resourceChangeListener = new IResourceChangeListener() {
  
  			@Override
  			public void resourceChanged(IResourceChangeEvent event) {
  				try {
  					if (event.getDelta() == null) {
  						return;
  					}
  					event.getDelta().accept(new IResourceDeltaVisitor() {
  
  						@Override
  						public boolean visit(IResourceDelta delta) throws CoreException {
  							if (delta.getResource() instanceof IProject) {
  								var v1 = delta.getMovedToPath();
  								var v2 = delta.getMovedFromPath();
  								if (v1 != null || v2 != null || delta.getKind() == IResourceDelta.REMOVED
  										|| delta.getKind() == IResourceDelta.ADDED) {
  									updateProjectLinks();
  									return false;
  								}
  							}
  							return true;
  						}
  					});
  				} catch (CoreException e) {
  					IDEPlugin.logError(e);
  				}
  			}
  		};
  		ResourcesPlugin.getWorkspace().addResourceChangeListener(_resourceChangeListener);
  	}
  
  	private void updateScrolledComposite() {
  		Rectangle r = _scrolledComp.getClientArea();
  		_scrolledComp.setMinSize(_mainComp.computeSize(r.width, SWT.DEFAULT));
  	}
  
  	private void createRightComp() {
  
  		var parent = new Composite(_mainComp, SWT.NONE);
  		parent.setLayout(new GridLayout(1, true));
  		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
  
  		createHSpace(parent);
  
  		createHeader(parent, "Social Channels");
  
  		createSocialChannelsComp(parent);
  
  		createHSpace(parent);
  
  		createNewsComp(parent);
  	}
  
  	private void createNewsComp(Composite parent) {
  		createHeader(parent, "Latest News");
  
  		var comp = new Composite(parent, SWT.NONE);
  		var layout = new GridLayout(1, false);
  		layout.marginWidth = 0;
  		layout.marginHeight = 0;
  		comp.setLayout(layout);
  		comp.setLayoutData(new GridData(GridData.FILL_BOTH));
  
  		var content = getSavedLatestNews();
  
  		if (content != null) {
  			out.println("Saved Phaser Editor Blog content");
  			updateNewsComp(comp, content);
  		}
  
  		var job = new Job("Fetching latest news") {
  
  			@Override
  			protected IStatus run(IProgressMonitor monitor) {
  
  				try {
  					var feedUrl = "https://phasereditor2d.com/blog/feed/rss";
  
  					if (System.getProperty("localfeed") != null) {
  						feedUrl = "http://localhost/blog/feed/rss";
  					}
  
  					var newContent = HttpTool.GET(feedUrl);
  
  					out.println("New Phaser Editor Blog content:");
  					out.println(newContent);
  
  					rememberLatestNews(newContent);
  
  					updateNewsComp(comp, newContent);
  
  				} catch (Exception e) {
  					// e.printStackTrace();
  				}
  
  				return Status.OK_STATUS;
  			}
  
  		};
  		job.schedule();
  	}
  
  	private static void rememberLatestNews(String content) {
  		var node = Preferences.userRoot().node("phasereditor.ide").node("phasereditor.ide");
  		node.put("latestnews", content);
  		try {
  			node.flush();
  		} catch (java.util.prefs.BackingStoreException e) {
  			IDEPlugin.logError(e);
  		}
  	}
  
  	private static String getSavedLatestNews() {
  		var node = Preferences.userRoot().node("phasereditor.ide").node("phasereditor.ide");
  		return node.get("latestnews", null);
  	}
  
  	private void updateNewsComp(Composite comp, String content) {
  		swtRun(() -> {
  			try {
  
  				for (var c : comp.getChildren()) {
  					c.dispose();
  				}
  
  				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  				DocumentBuilder builder;
  
  				builder = factory.newDocumentBuilder();
  
  				Document doc = builder.parse(new ByteArrayInputStream(content.getBytes(Charset.forName("utf8"))));
  				doc.getDocumentElement().normalize();
  
  				var titleList = doc.getElementsByTagName("title");
  				var linkList = doc.getElementsByTagName("link");
  				var descriptionList = doc.getElementsByTagName("description");
  				var pubDateList = doc.getElementsByTagName("pubDate");
  
  				for (int i = 1; i < titleList.getLength(); i++) {
  					if (i > 5) {
  						break;
  					}
  					var title = titleList.item(i).getTextContent();
  					var link = linkList.item(i).getTextContent();
  