Using UDIGApplication¶
The base class UDIGApplication serves three purposes:
- It is a show case of what the SDK can do; usable by end-users as a functional GIS Application
- It is an example for other RCP developers to copy (either cut and paste or subclass)
- It provides static final helper methods that can be used by other RCP developers
This class is to be used as part of a product definition:
- UDIG 1.0: IPlatformRunnable interface provided by RCP
- UDIG 1.1: IApplication interface provided by Equinox
Links to Related Content:
- For the latest instructions please see the Getting Started tutorial
As a Showcase¶
As a showcase the UDIGApplication needs to provide a fine balance between enough functionality to be useful; and not so much that the result is intimidating.
The actual uDig application does not do much:
- Kicks the org.locationtech.udig.libs “Activator” into loading the EPSG database
- Does a few sanity checks about the execution environment; displaying warning dialogs if everything is not right
- Starts up a workbench using the UDIGWorkbenchAdvisor
As a Base¶
As base class UDIGApplication must ensure that every contribution shows up in a logical part of the user interface. This is especially important with respect to menubars and toolbars; we must include examples of each kind of contribution.
Check for JAI
This has moved to an org.eclipse.ui.startup for the org.locationtech.udig.ui. It will display a dialog if JAI is not found.
Login
Setting up an UDIGApplication that requires a login is a common request. This example shows how to use the checkLogin() method to talk to a “Client” plug-in and call its login method.
The “Client’ plug-in technique is used when you have a Client plugin that holds on to a Spring remoting Session with a J2EE server application.
Here is an example of overriding the UDIGApplication checkLogin() method.
public boolean checkLogin() {
LoginDialog loginDialog = new LoginDialog(
"Connecting Communities Login",
"Please login to Connecting Communities:" );
boolean login= false;
while( !login ){
int result = loginDialog.open();
if( result == MessageDialog.OK){
try {
login = Client.getDefault().login( loginDialog.getUser(), loginDialog.getPassword() );
if( !login ){
loginDialog.setMessage("Could not login - please try again");
}
} catch (Exception connectionProblem) {
MessageDialog.openInformation(null, "Could not Connect", connectionProblem.toString() );
return false; // probably should prompt user here?
}
}
else {
return false; // user cancelled
}
}
return true;
}
The above example made use of a really simple MessageDialog shown bellow:
public class LoginDialog extends MessageDialog {
String user;
String password;
public LoginDialog( String title, String dialogMessage) {
super(null, title, null, dialogMessage, QUESTION,
new String[]{"Login","Exit"}, 0 );
}
protected Control createCustomArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout( new GridLayout(2,false) );
Label label = new Label( composite, SWT.RIGHT );
label.setText("User:");
GridData gridData = new GridData( SWT.FILL, SWT.FILL, false, false );
gridData.widthHint = 100; // just a suggestion
label.setLayoutData( gridData );
final Text userText = new Text( composite, SWT.SINGLE );
userText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ));
userText.addModifyListener( new ModifyListener(){
public void modifyText( ModifyEvent e ) {
user = userText.getText();
}
});
label = new Label( composite, SWT.RIGHT );
label.setText("Password:");
label.setLayoutData( gridData );
final Text passwordText = new Text ( composite, SWT.SINGLE | SWT.PASSWORD );
passwordText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ));
passwordText.addModifyListener( new ModifyListener(){
public void modifyText( ModifyEvent e ) {
user = passwordText.getText();
}
});
return null;
}
public String getUser() {
return user;
}
public String getPassword() {
return password;
}
public void setMessage( String message ){
messageLabel.setText( message );
}
}
Init
The init method as provided will kick the org.locationtech.udig.libs Activator class into loading the EPSG database. It actually does a quick sanity check first (to see if loading will take a long time).
/**
* We have a couple things that need to happen
* before the workbench is opened. The org.eclipse.ui.startup
* extension point is willing to run stuff for us *after*
* the workbench is opened - but that is not so useful
* when we need to configure the EPSG database for libs
* and load up the local catalog.
* <p>
* Long term we will want to create a startup list
* (much like we have shutdown hooks).
*/
protected boolean init() {
ProgressMonitorDialog progress = new ProgressMonitorDialog( Display.getCurrent().getActiveShell());
final Bundle bundle = Platform.getBundle(Activator.ID);
// We should kick the libs plugin to load the EPSG database now
if( ThreadedH2EpsgFactory.isUnpacked()){
// if there is not going to be a long delay
// don't annoy users with a dialog
Activator.initializeReferencingModule( null );
}
else {
// We are going to take a couple of minutes to set this up
// so we better set up a progress dialog thing
//
try {
progress.run(false,false, new IRunnableWithProgress(){
public void run( IProgressMonitor monitor ) throws InvocationTargetException,
InterruptedException {
Activator.initializeReferencingModule( monitor);
}
});
} catch (InvocationTargetException e) {
Platform.getLog(bundle).log(
new Status(IStatus.ERROR, Activator.ID, e.getCause().getLocalizedMessage(), e
.getCause()));
return false;
} catch (InterruptedException e) {
Platform.getLog(bundle).log(
new Status(IStatus.ERROR, Activator.ID, e.getCause().getLocalizedMessage(), e
.getCause()));
return false;
}
}
// We should kick the CatalogPlugin to load now...
return true;
}
As a Utility Class¶
Utility methods exist to perform checks commonly needed at startup.
Java Advanced Imaging
The checkForJAI method will return false if JAI is not installed into the current JRE:
boolean optional = UDIGApplication.checkForJAI();
Your application may need JAI or may not; it is required for raster operations - if your application is limited to vector work you can get by without this functionality.
GDI
The checkForGDI method will return false if GDI+ is required (ie on WIN_32 platform) and not available:
boolean required = UDIGApplication.checkForGDI();
We required GDI+ for SWT matrix calculations; instructions on how to obtain GDI+ for older versions are provided as part of the running udig instructions.