/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.firststeps;
import java.io.File;
import java.io.PrintWriter;
import org.eclipse.swt.widgets.Composite;
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.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.intro.config.IIntroContentProvider;
import org.eclipse.ui.intro.config.IIntroContentProviderSite;
import eu.esdihumboldt.hale.ui.service.project.RecentProjectsMenu;
import eu.esdihumboldt.hale.ui.service.project.RecentProjectsService;
/**
* A content provider to show and link to recently opened projects.
*
* @author Kai Schwierczek
*/
public class RecentProjectsContentProvider implements IIntroContentProvider {
private boolean disposed = false;
/**
* Max length of the project file path shown.
*/
public static final int MAX_LENGTH = 60;
/**
* @see org.eclipse.ui.intro.config.IIntroContentProvider#init(org.eclipse.ui.intro.config.IIntroContentProviderSite)
*/
@Override
public void init(IIntroContentProviderSite site) {
// site isn't needed or directly react to changes in recent entries?
// -> somehow add listener to recent entries, reflow after changes,
// remove listener in dispose ?
}
/**
* Create the html content for recent entries.
*
* @see org.eclipse.ui.intro.config.IIntroContentProvider#createContent(java.lang.String,
* java.io.PrintWriter)
*/
@Override
public void createContent(String id, PrintWriter out) {
if (disposed)
return;
RecentProjectsService.Entry[] entries = getRecentFiles();
if (entries.length > 0) {
out.print("<ul id=\"recent-files-list\">"); //$NON-NLS-1$
for (int i = entries.length - 1; i >= 0; i--) {
RecentProjectsService.Entry entry = entries[i];
out.print("<li>"); //$NON-NLS-1$
if (entry.getProjectName() != null) {
out.print(entry.getProjectName());
out.print("<br>"); //$NON-NLS-1$
}
out.print("<a class=\"recentFile\" href=\""); //$NON-NLS-1$
out.print("http://org.eclipse.ui.intro/runAction?"); //$NON-NLS-1$
out.print("pluginId=eu.esdihumboldt.hale.ui.firststeps&"); //$NON-NLS-1$
out.print("class=eu.esdihumboldt.hale.ui.firststeps.LoadProjectAction&"); //$NON-NLS-1$
out.print("closeIntro=true&path="); //$NON-NLS-1$
out.print(entry.getFile());
out.print("\">"); //$NON-NLS-1$
out.print(RecentProjectsMenu.shorten(entry.getFile(), MAX_LENGTH,
new File(entry.getFile()).getName().length()));
out.print("</a>"); //$NON-NLS-1$
out.print("</li>"); //$NON-NLS-1$
}
out.print("</ul>"); //$NON-NLS-1$
}
else {
out.print("<p class=\"status-text\">"); //$NON-NLS-1$
out.print("No recently opened projects.");
out.print("</p>"); //$NON-NLS-1$
}
}
/**
* Create widgets to display the recent entries when using the SWT
* presentation
*
* XXX not tested, how to make eclipse use the SWT version?
*
* @see org.eclipse.ui.intro.config.IIntroContentProvider#createContent(String,
* Composite, FormToolkit)
*/
@Override
public void createContent(String id, Composite parent, FormToolkit toolkit) {
if (disposed)
return;
FormText formText = toolkit.createFormText(parent, true);
formText.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
new LoadProjectAction().execute(true, (String) e.getHref());
}
});
StringBuffer buffer = new StringBuffer();
buffer.append("<form>"); //$NON-NLS-1$
RecentProjectsService.Entry[] entries = getRecentFiles();
if (entries.length > 0) {
for (int i = entries.length - 1; i >= 0; i--) {
RecentProjectsService.Entry entry = entries[i];
buffer.append("<li style=\"none\">"); //$NON-NLS-1$
if (entry.getProjectName() != null) {
buffer.append(entry.getProjectName());
buffer.append("<br>"); //$NON-NLS-1$
}
buffer.append("<a href=\""); //$NON-NLS-1$
buffer.append(entry.getFile());
buffer.append("\">"); //$NON-NLS-1$
buffer.append(RecentProjectsMenu.shorten(entry.getFile(), MAX_LENGTH,
new File(entry.getFile()).getName().length()));
buffer.append("</a>"); //$NON-NLS-1$
buffer.append("</li>"); //$NON-NLS-1$
}
}
else {
buffer.append("<p>"); //$NON-NLS-1$
buffer.append("No recently opened projects.");
buffer.append("</p>"); //$NON-NLS-1$
}
buffer.append("</form>"); //$NON-NLS-1$
String text = buffer.toString();
text = text.replaceAll("&{1}", "&"); //$NON-NLS-1$ //$NON-NLS-2$
formText.setText(text, true, false);
}
private RecentProjectsService.Entry[] getRecentFiles() {
RecentProjectsService rfs = PlatformUI.getWorkbench()
.getService(RecentProjectsService.class);
RecentProjectsService.Entry[] entries = rfs.getRecentFiles();
if (entries == null)
entries = new RecentProjectsService.Entry[0];
return entries;
}
/**
* @see org.eclipse.ui.intro.config.IIntroContentProvider#dispose()
*/
@Override
public void dispose() {
disposed = true;
}
}