/******************************************************************************* * Copyright (c) 2006, 2012 Oracle Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Oracle Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.dnd; import java.util.HashMap; import java.util.Map; import org.eclipse.bpel.ui.Templates; import org.eclipse.bpel.ui.Templates.Template; import org.eclipse.bpel.ui.Templates.TemplateResource; import org.eclipse.jface.dialogs.PopupDialog; import org.eclipse.jface.internal.text.html.HTMLTextPresenter; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.TextPresentation; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.StatusTextEvent; import org.eclipse.swt.browser.StatusTextListener; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; /** * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Aug 16, 2007 * */ public class DropPopup extends PopupDialog implements StatusTextListener, MenuDetectListener, KeyListener { interface CommandListener { /** * @param cmd */ void execute (String cmd) ; } CommandListener fTarget; protected HTMLTextPresenter fPresenter; protected TextPresentation fPresentation = new TextPresentation(); protected StyledText fText; void setCommandListener ( CommandListener listener ) { fTarget = listener; } /** * @param parentShell * @param shellStyle * @param title * @param statusFieldText */ public DropPopup (Shell parentShell, int shellStyle, String title, String statusFieldText) { super(parentShell,shellStyle | SWT.TOOL, true, true, false, false, title, statusFieldText); } @Override protected Control createDialogArea (Composite parent) { fText= new StyledText(parent, SWT.V_SCROLL | SWT.H_SCROLL); fText.setEditable(false); fPresenter= new HTMLTextPresenter(false); fText.addControlListener(new ControlAdapter() { /* * @see org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse.swt.events.ControlEvent) */ @Override public void controlResized(ControlEvent e) { fText.setText(fText.getText()); } }); return fText; } protected void setInput (String html) { Template template = getViewTemplate(); TemplateResource resource = template.getResources().get(0); Map<String,Object> args = new HashMap<String,Object>(); args.put("content",html); args.put("background-color", toCSS("background-color", getShell().getBackground() )); args.put("font", toCSS( getShell().getFont() )); fPresentation.clear(); Rectangle size= fText.getClientArea(); html = resource.process(args); System.out.println("Text: " + html); html = ((DefaultInformationControl.IInformationPresenterExtension)fPresenter).updatePresentation(getShell(), html, fPresentation, size.width, size.height); fText.setText(html); TextPresentation.applyTextPresentation(fPresentation, fText); // fBrowser.setText( resource.process(args) ); } String toCSS ( String name, Color color ) { StringBuilder sb = new StringBuilder(); sb.append(name).append(": rgb(").append(color.getRed()).append(","); sb.append(color.getGreen()).append(","); sb.append(color.getBlue()).append(");"); return sb.toString(); } String toCSS ( Font font ) { FontData fd[] = font.getFontData(); StringBuilder sb = new StringBuilder (); if (fd.length < 1) { return sb.toString(); } sb.append("font-size: ").append(fd[0].getHeight()).append("pt;"); sb.append("font-family: ").append(fd[0].getName()).append(";"); return sb.toString(); } @SuppressWarnings("nls") Template getViewTemplate () { Template t = dropTemplates.getTemplateByKey("dropPopupTemplate"); if (t == null || true ) { dropTemplates.initializeFrom("/html/"); t = dropTemplates.getTemplateByKey("dropPopupTemplate"); } return t; } static Templates dropTemplates = new Templates(); /** (non-Javadoc) * @see org.eclipse.swt.browser.StatusTextListener#changed(org.eclipse.swt.browser.StatusTextEvent) */ public void changed (StatusTextEvent event) { String cmd = event.text; if (cmd == null || cmd.startsWith("event://") == false) { return ; } cmd = cmd.substring(8); if (fTarget != null) { fTarget.execute(cmd); } close(); } /** * @see org.eclipse.swt.events.MenuDetectListener#menuDetected(org.eclipse.swt.events.MenuDetectEvent) */ public void menuDetected (MenuDetectEvent e) { e.doit = false; } /** * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent) */ public void keyPressed (KeyEvent e) { e.doit = false; close(); } /** * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent) */ public void keyReleased(KeyEvent e) { e.doit = false; } }