Creation of InfoPopup in Eclipse

how-to
Dec 27, 20095 mins

Creation of InfoPopup in Eclipse

An article by Debadatta Mishra

Introduction

In case of Eclipse editor, there is a concept called “InfoPopup”. It is a kind of UI which provides dynamic help message to the user. It is a special type of UI Screen which has a header for type of information and a footer about what to do . It has a yellowish type background which displays the help message.

Technicalities

Code for InfoPopup.java


package com.core.plugin.dialog;

import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

/**
 * This class is used to create a popup dialog
 * box to display the contents as information
 * to the user. This dialog is same as infopopup
 * dialog provided by Eclipse.
 * @author Debadatta Mishra(PIKU)
 * 
 *
 */
public final class InfoPopup extends PopupDialog
{
	/**
	 * The text control that displays the text.
	 */
	private Text text;
	
	/**
	 * The String shown in the popup.
	 */
	private String contents = "";
	
	/**
	 * Object of type {@link Rectangle}
	 */
	private Rectangle rectangle = null;
	
	
	/**Default constructor
	 * @param parent of type {@link Shell}
	 * @param rectangle of type {@link Rectangle}
	 * @param headerString of type String indicating the header
	 * @param footerString of type String indicating the footer
	 */
	public InfoPopup( Shell parent , Rectangle rectangle , String headerString , String footerString)
	{
		super(parent, PopupDialog.HOVER_SHELLSTYLE, false, false, true, false, headerString,footerString);
		this.rectangle = rectangle;
	}
	
	/**
	 * This method is used to show the animation
	 * by decreasing the x and y coordinates and
	 * by setting the size dynamically.
	 * @param shell of type {@link Shell}
	 */
	private static void doAnimation( Shell shell )
	{
		Point shellArea = shell.getSize();
		int x = shellArea.x;
		int y = shellArea.y;
		while( x != -200 )
		{
			try
			{
				shell.setSize(x--, y--);
			}
			catch( Exception e )
			{
				e.printStackTrace();
			}
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.window.Window#handleShellCloseEvent()
	 */
	protected void handleShellCloseEvent() 
	{
		//Comment out the following if do not want any kind of animated effect.
		doAnimation(getShell());
		super.handleShellCloseEvent();
	}
	
//	protected boolean hasTitleArea()
//	{
//		return false;
//	}
	
//	private class ExitAction extends Action
//	{
//		ExitAction()
//		{
//			super("Close", IAction.AS_PUSH_BUTTON);
//		}
//
//		public void run()
//		{
//			close();
//		}
//	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.PopupDialog#createTitleMenuArea(org.eclipse.swt.widgets.Composite)
	 */
	protected Control createTitleMenuArea(Composite arg0) 
	{
		Control ctrl = super.createTitleMenuArea(arg0);
		Composite composite = (Composite)ctrl;
		Control[] ctrls = composite.getChildren();
		
		ToolBar toolBar = (ToolBar)ctrls[1];
		ToolItem[] toolItems = toolBar.getItems();
		toolItems[0].setImage(JFaceResources.getImage(Dialog.DLG_IMG_ERROR));
		
		return ctrl;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.PopupDialog#fillDialogMenu(org.eclipse.jface.action.IMenuManager)
	 */
	protected void fillDialogMenu(IMenuManager dialogMenu) 
	{
		dialogMenu.addMenuListener( new IMenuListener()
		{
			public void menuAboutToShow(IMenuManager arg0) 
			{
//				close();
				handleShellCloseEvent();
			}
		}
		);
//		dialogMenu.add(new ExitAction());
	}

	/*
	 * Create a text control for showing the info about a proposal.
	 */
	protected Control createDialogArea(Composite parent)
	{
		text = new Text(parent, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP
				| SWT.NO_FOCUS);
		text.setText(contents);
		return text;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.PopupDialog#adjustBounds()
	 */
	protected void adjustBounds()
	{
		Point pt = getShell().getDisplay().getCursorLocation();
		getShell().setBounds(pt.x,pt.y,rectangle.width,rectangle.height);
	}
	
	/**Method to set the text contents of the InfoPop dialog
	 * @param textContents of type String indicating the message
	 */
	public void setText( String textContents )
	{
		this.contents = textContents;
	}
	
}

Let us look at the test harness class to execute the above.

Code for TestInfoPopup.java


package com.core.plugin.test.dialog;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import com.core.plugin.dialog.InfoPopup;

/**This is the test harness class to test the infopopup dialog.
 * @author Debadatta Mishra(PIKU)
 *
 */
public class TestInfoPopup
{
	public static void main(String[] args) 
	{
		final Display display = new Display ();
		final Shell shell = new Shell (display, SWT.DIALOG_TRIM); 
		
		Button btn = new Button( shell , SWT.PUSH );
		btn.setText("Press to see the InfoPopup");
		btn.setBounds(90, 10, 200, 30);
		
		btn.addSelectionListener( new SelectionAdapter()
		{
			public void widgetSelected(SelectionEvent se) 
			{
				//You can set the sixe of the Rectangle
				Rectangle rect = new Rectangle(110,220,200,110);
				InfoPopup pop = new InfoPopup( new Shell() , rect ,"Information for you","Select and press ESC to close");
				pop.setText("This is a special case of info popup dialog box which is similar to Eclipse InfoPopup.");
				pop.open();
			}
		}
		);
		shell.setSize(400, 200);
		shell.open ();
		while (!shell.isDisposed ()) 
		{
			if (!display.readAndDispatch ()) display.sleep ();
		}
		display.dispose ();
	}

}

Assumptions I assume that reader of this article has Exposure to eclipse plugin development Knowledge on Java language Knowledge on running programs in Eclipse editor Test Case details I have tested the above program in the following conditions. OS Name : Windows Vista Eclipse API : 3.2 Java : 1.6.0_16 Java Editor : Eclipse 3.2 Conclusion I hope that you will enjoy my article. This article does not bear any commercial significance , it is only meant for learning and for novice developers. In case of any problem or errors , feel free to contact me in the email debadatta.mishra@gmail.com .