Recommended: Sing it, brah! 5 fabulous songs for developers
JW's Top 5
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.
TechnicalitiesCode 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;
}
}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 ();
}
}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 .