/********************************************************************** * based on /cvsroot/jameica/jameica/src/de/willuhn/jameica/gui/parts/FormTextPart.java,v $ * Copyright (c) by willuhn.webdesign * All rights reserved * **********************************************************************/ package de.open4me.depot.gui.parts; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.rmi.RemoteException; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.forms.HyperlinkSettings; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.FormText; import de.willuhn.io.IOUtil; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.Part; import de.willuhn.jameica.gui.internal.action.Program; import de.willuhn.jameica.gui.util.Color; import de.willuhn.jameica.gui.util.Font; import de.willuhn.jameica.gui.util.SWTUtil; import de.willuhn.jameica.messaging.StatusBarMessage; import de.willuhn.jameica.services.BeanService; import de.willuhn.jameica.system.Application; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; /** * Freiformatierbarer Text. */ public class FormTextPartExt implements Part { private StringBuffer content = new StringBuffer(); private ScrolledComposite container = null; private FormText text = null; /** * ct. */ public FormTextPartExt() { } /** * ct. * @param text der anzuzeigenden Text. */ public FormTextPartExt(String text) { setText(text); } /** * ct. * @param text die PlainText-Datei. * @throws IOException Wenn beim Lesen der Datei Fehler auftreten. */ public FormTextPartExt(Reader text) throws IOException { setText(text); } /** * Zeigt den Text aus der uebergebenen Datei an. * @param text anzuzeigender Text. * @throws IOException */ public void setText(Reader text) throws IOException { BufferedReader br = null; try { br = new BufferedReader(text); String thisLine = null; StringBuffer buffer = new StringBuffer(); while ((thisLine = br.readLine()) != null) { if (thisLine.length() == 0) // Leerzeile { buffer.append("\n\n"); continue; } buffer.append(thisLine.trim() + " "); // Leerzeichen am Ende einfuegen. } content = buffer; // machen wir erst wenn die gesamte Datei gelesen werden konnte refresh(); } catch (IOException e) { throw e; } finally { IOUtil.close(br); } } /** * Zeigt den uebergebenen Hilfe-Text an. * @param s anzuzeigender Hilfe-Text. */ public void setText(String s) { content = new StringBuffer(s); refresh(); } /** */ public void refresh() { if (text == null || content == null) return; String s = content.toString(); boolean b = s != null && s.startsWith("<form>"); try { text.setText(s == null ? "" : s,b,b); } catch (java.lang.IllegalArgumentException e) { e.printStackTrace(); text.setText("Fehlerhafter HTML Code", false, false); } resize(); } /** * Passt die Groesse des Textes an die Umgebung an. */ private void resize() { if (text == null || container == null) return; text.setSize(text.computeSize(text.getParent().getClientArea().width,SWT.DEFAULT)); } public void hyperlinkPressed(String action) { // Fallback try { new Program().handleAction(action); } catch (ApplicationException ae) { Application.getMessagingFactory().sendMessage(new StatusBarMessage(ae.getMessage(),StatusBarMessage.TYPE_ERROR)); } } /** * @see de.willuhn.jameica.gui.Part#paint(org.eclipse.swt.widgets.Composite) */ public void paint(Composite parent) throws RemoteException { container = new ScrolledComposite(parent,SWT.H_SCROLL | SWT.V_SCROLL); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalIndent = 4; container.setLayoutData(gd); container.setLayout(SWTUtil.createGrid(1,true)); container.addListener(SWT.Resize, new Listener() { public void handleEvent(Event event) { resize(); } }); text = new FormText(container, SWT.WRAP); // Die HyperlinkSettings muessen zwingend an den // FormText uebergeben werden, BEVOR der eigentliche Text uebergeben // wird. Das gibts sonst eine NPE. Und das laesst sich extrem // schlecht debuggen. // Den Quellcode von eclipse.ui.forms hab ich hier gefunden: // http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/?hideattic=0 // Daher machen wir das gleich als erstes. Sicher ist sicher. HyperlinkSettings hs = new HyperlinkSettings(GUI.getDisplay()); hs.setBackground(Color.BACKGROUND.getSWTColor()); hs.setForeground(Color.LINK.getSWTColor()); hs.setActiveBackground(Color.BACKGROUND.getSWTColor()); hs.setActiveForeground(Color.LINK_ACTIVE.getSWTColor()); text.setHyperlinkSettings(hs); text.setFont(Font.DEFAULT.getSWTFont()); text.setColor("header",Color.COMMENT.getSWTColor()); text.setColor("error",Color.ERROR.getSWTColor()); text.setColor("success",Color.SUCCESS.getSWTColor()); text.setFont("header", Font.H1.getSWTFont()); container.setContent(text); text.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { Object href = e.getHref(); if (href == null) { Logger.info("got hyperlink event, but data was null. nothing to do"); return; } if (!(href instanceof String)) { Logger.info("got hyperlink event, but data is not a string, skipping"); return; } String action = (String) href; // Wir versuchen die Action als Klasse zu laden. Wenn das fehlschlaegt, // starten wir die Action einfach als Programm Logger.info("executing action \"" + action); try { Logger.debug("trying to load class " + action); Class<Action> c = Application.getClassLoader().load(action); BeanService beanService = Application.getBootLoader().getBootable(BeanService.class); Action a = beanService.get(c); a.handleAction(e); return; } catch (Throwable t) { // ignore } hyperlinkPressed(action); } }); refresh(); } }