View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.support;
14  
15  import java.awt.BorderLayout;
16  import java.awt.Color;
17  import java.awt.Component;
18  import java.awt.Cursor;
19  import java.awt.Dimension;
20  import java.awt.Event;
21  import java.awt.Frame;
22  import java.awt.GraphicsEnvironment;
23  import java.awt.Point;
24  import java.awt.Rectangle;
25  import java.awt.Toolkit;
26  import java.awt.event.ActionEvent;
27  import java.awt.event.KeyEvent;
28  import java.net.URL;
29  import java.util.ArrayList;
30  import java.util.HashMap;
31  import java.util.List;
32  import java.util.Map;
33  
34  import javax.swing.AbstractAction;
35  import javax.swing.Action;
36  import javax.swing.BorderFactory;
37  import javax.swing.ImageIcon;
38  import javax.swing.JButton;
39  import javax.swing.JComponent;
40  import javax.swing.JDialog;
41  import javax.swing.JLabel;
42  import javax.swing.JPanel;
43  import javax.swing.JPopupMenu;
44  import javax.swing.JProgressBar;
45  import javax.swing.JSplitPane;
46  import javax.swing.JTabbedPane;
47  import javax.swing.JTable;
48  import javax.swing.KeyStroke;
49  import javax.swing.UIManager;
50  import javax.swing.border.Border;
51  import javax.swing.table.TableCellEditor;
52  
53  import com.eviware.soapui.SoapUI;
54  import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
55  import com.eviware.soapui.model.ModelItem;
56  import com.eviware.soapui.support.action.swing.ActionList;
57  import com.eviware.soapui.support.components.ConfigurationDialog;
58  import com.eviware.soapui.support.components.JButtonBar;
59  import com.eviware.soapui.support.components.JXToolBar;
60  import com.eviware.soapui.support.components.SwingConfigurationDialogImpl;
61  import com.eviware.soapui.support.swing.GradientPanel;
62  import com.eviware.soapui.support.swing.SoapUISplitPaneUI;
63  import com.eviware.soapui.support.swing.SwingUtils;
64  import com.eviware.soapui.ui.desktop.DesktopPanel;
65  import com.eviware.soapui.ui.desktop.SoapUIDesktop;
66  import com.eviware.x.dialogs.XDialogs;
67  import com.eviware.x.dialogs.XFileDialogs;
68  import com.eviware.x.impl.swing.SwingDialogs;
69  import com.eviware.x.impl.swing.SwingFileDialogs;
70  import com.jgoodies.looks.HeaderStyle;
71  import com.jgoodies.looks.Options;
72  
73  /***
74   * Facade for common UI-related tasks
75   * 
76   * @author Ole.Matzura
77   */
78  
79  public class UISupport
80  {
81     // This is needed in Eclipse that has strict class loader constraints.
82     private static List<ClassLoader> secondaryResourceLoaders = new ArrayList<ClassLoader>();
83     
84  	private static Component frame;
85  	private static Map<String, ImageIcon> iconCache = new HashMap<String, ImageIcon>();
86  	public static Dimension TOOLBAR_BUTTON_DIMENSION = new Dimension( 22, 21 );
87  	private static Boolean isWindows;
88  
89  	private static XDialogs dialogs;
90  	private static XFileDialogs fileDialogs;
91  	private static UIUtils uiUtils;
92  	private static ToolHost toolHost;
93  	private static Cursor hourglassCursor;
94  	private static Cursor defaultCursor;
95  
96  	static
97  	{
98  		setDialogs( new ConsoleDialogs() );
99  		uiUtils = new SwingUtils();
100 	}
101 
102 	public static ImageIcon TOOL_ICON = UISupport.createImageIcon( "/applications-system.png" );
103 	public static ImageIcon OPTIONS_ICON = UISupport.createImageIcon( "/preferences-system.png" );
104 	public static ImageIcon HELP_ICON = UISupport.createImageIcon( "/help-browser.png" );
105 
106    /***
107     * Add a classloader to find resources.
108     * 
109     * @param loader
110     */
111    public static void addClassLoader(ClassLoader loader)
112    {
113       secondaryResourceLoaders.add(loader);
114    }
115    
116 	/***
117 	 * Set the main frame of this application. This is only used when running
118 	 * under Swing.
119 	 * 
120 	 * @param frame
121 	 */
122 	public static void setMainFrame( Component frame )
123 	{
124 		UISupport.frame = frame;
125 		setDialogs( new SwingDialogs( frame ) );
126 		setFileDialogs( new SwingFileDialogs( frame ) );
127 	}
128 
129 	public static void setDialogs( XDialogs xDialogs )
130 	{
131 		dialogs = xDialogs;
132 	}
133 
134 	public static void setFileDialogs( XFileDialogs xFileDialogs )
135 	{
136 		fileDialogs = xFileDialogs;
137 	}
138 
139 	public static ToolHost getToolHost()
140 	{
141 		return toolHost;
142 	}
143 
144 	public static void setToolHost( ToolHost host )
145 	{
146 		toolHost = host;
147 	}
148 
149 	public static Frame getMainFrame()
150 	{
151 		return ( Frame ) ( frame instanceof Frame ? frame : null );
152 	}
153 
154 	public static XDialogs getDialogs()
155 	{
156 		return dialogs;
157 	}
158 
159 	public static XFileDialogs getFileDialogs()
160 	{
161 		return fileDialogs;
162 	}
163 
164 	/***
165 	 * @deprecated use XForm related classes instead
166 	 */
167 	
168 	public static ConfigurationDialog createConfigurationDialog( String name, String helpUrl,
169 				String description, ImageIcon icon )
170 	{
171 		return new SwingConfigurationDialogImpl( name, helpUrl, description, icon );
172 	}
173 	
174 	/***
175 	 * @deprecated use XForm related classes instead
176 	 */
177 
178 	public static ConfigurationDialog createConfigurationDialog( String name, String helpUrl )
179 	{
180 		return new SwingConfigurationDialogImpl( name, helpUrl, null, null );
181 	}
182 
183 	/***
184 	 * @deprecated use XForm related classes instead
185 	 */
186 	
187 	public static ConfigurationDialog createConfigurationDialog( String name )
188 	{
189 		return new SwingConfigurationDialogImpl( name, null, null, null );
190 	}
191 
192 	public static void showErrorMessage( String message )
193 	{
194 		if( message.length() > 120 )
195 		{
196 			dialogs.showExtendedInfo( "Error", "An error occurred", message, null );
197 		}
198 		else
199 		{
200 			dialogs.showErrorMessage( message );
201 		}
202 	}
203 
204 	public static boolean confirm( String question, String title )
205 	{
206 		return dialogs.confirm( question, title );
207 	}
208 
209 	public static String prompt( String question, String title, String value )
210 	{
211 		return dialogs.prompt( question, title, value );
212 	}
213 
214 	/***
215 	 * @deprecated use prompt(String question, String title, String value)
216 	 *             instead
217 	 */
218 
219 	public static String prompt( String question, String title )
220 	{
221 		return dialogs.prompt( question, title );
222 	}
223 
224 	public static boolean stopCellEditing( JTable table )
225 	{
226 		try
227 		{
228 			int column = table.getEditingColumn();
229 			if( column > -1 )
230 			{
231 				TableCellEditor cellEditor = table.getColumnModel().getColumn( column ).getCellEditor();
232 				if( cellEditor == null )
233 				{
234 					cellEditor = table.getDefaultEditor( table.getColumnClass( column ) );
235 				}
236 				if( cellEditor != null )
237 				{
238 					cellEditor.stopCellEditing();
239 				}
240 			}
241 		}
242 		catch( RuntimeException e )
243 		{
244 			return false;
245 		}
246 		return true;
247 	}
248 
249 	public static JPanel createProgressBarPanel( JProgressBar progressBar, int space,
250 				boolean indeterimate )
251 	{
252 		JPanel panel = new JPanel( new BorderLayout() );
253 
254 		progressBar.setValue( 0 );
255 		progressBar.setStringPainted( true );
256 		progressBar.setString( "" );
257 		progressBar.setIndeterminate( indeterimate );
258 
259 		progressBar.setBorder( BorderFactory.createMatteBorder( 0, 0, 1, 1, Color.LIGHT_GRAY ) );
260 
261 		panel.setBorder( BorderFactory.createEmptyBorder( space, space, space, space ) );
262 		panel.add( progressBar, BorderLayout.CENTER );
263 
264 		return panel;
265 	}
266 
267 	public static JSplitPane createHorizontalSplit()
268 	{
269 		JSplitPane splitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT );
270 		splitPane.setUI( new SoapUISplitPaneUI() );
271 		splitPane.setDividerSize( 10 );
272 		splitPane.setOneTouchExpandable( true );
273 		return splitPane;
274 	}
275 
276 	public static JSplitPane createHorizontalSplit( Component leftComponent, Component rightComponent )
277 	{
278 		JSplitPane splitPane = createHorizontalSplit();
279 
280 		splitPane.setLeftComponent( leftComponent );
281 		splitPane.setRightComponent( rightComponent );
282 		return splitPane;
283 	}
284 
285 	public static JSplitPane createVerticalSplit()
286 	{
287 		JSplitPane splitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
288 		splitPane.setUI( new SoapUISplitPaneUI() );
289 		splitPane.setDividerSize( 10 );
290 		splitPane.setOneTouchExpandable( true );
291 		splitPane.setBorder( null );
292 		return splitPane;
293 	}
294 
295 	public static JSplitPane createVerticalSplit( Component topComponent, Component bottomComponent )
296 	{
297 		JSplitPane splitPane = createVerticalSplit();
298 
299 		splitPane.setLeftComponent( topComponent );
300 		splitPane.setRightComponent( bottomComponent );
301 		return splitPane;
302 	}
303 
304 	public static void centerDialog( JDialog dialog )
305 	{
306 		Dimension sz = dialog.getSize();
307 		Rectangle b = frame == null ? null : frame.getBounds();
308 
309 		if( dialog.getOwner().isVisible() )
310 		{
311 			b = dialog.getOwner().getBounds();
312 		}
313 		else if( b == null )
314 		{
315 			GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
316 			b = ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds();
317 		}
318 
319 		dialog.setLocation( ( int ) ( ( b.getWidth() - sz.getWidth() ) / 2 ), ( int ) ( ( b
320 					.getHeight() - sz.getHeight() ) / 2 ) );
321 	}
322 
323 	public static void showDialog( JDialog dialog )
324 	{
325 		centerDialog( dialog );
326 		dialog.setVisible( true );
327 	}
328 
329 	public static ImageIcon createImageIcon( String path )
330 	{
331 		if( iconCache.containsKey( path ) )
332 			return iconCache.get( path );
333 
334 		java.net.URL imgURL = SoapUI.class.getResource( path );
335       if(imgURL == null)
336       {
337          imgURL = loadFromSecondaryLoader(path);
338       }
339 		if( imgURL != null )
340 		{
341 			try
342 			{
343 				ImageIcon imageIcon = new ImageIcon( imgURL );
344 				iconCache.put( path, imageIcon );
345 				return imageIcon;
346 			}
347 			catch( Throwable e )
348 			{
349 				System.err.println( "Failed to create icon: " + e );
350 				return null;
351 			}
352 		}
353 		else
354 		{
355 			System.err.println( "Couldn't find icon file: " + path );
356 			return null;
357 		}
358 	}
359 
360 	private static URL loadFromSecondaryLoader(String path)
361    {
362       for(ClassLoader loader : secondaryResourceLoaders)
363       {
364          URL url = loader.getResource(path);
365          if(url != null)
366          {
367             return url;
368          }
369       }
370       return null;
371    }
372 
373    public static void showInfoMessage( String message )
374 	{
375 		dialogs.showInfoMessage( message );
376 	}
377 
378 	public static void showInfoMessage( String message, String title )
379 	{
380 		dialogs.showInfoMessage( message, title );
381 	}
382 
383 	@SuppressWarnings("unchecked")
384 	public static <T extends Object> T prompt( String question, String title, T[] objects )
385 	{
386 		return ( T ) dialogs.prompt( question, title, objects );
387 	}
388 
389 	@SuppressWarnings("unchecked")
390 	public static <T extends Object> T prompt( String question, String title, T[] objects, String value )
391 	{
392 		return ( T ) dialogs.prompt( question, title, objects, value );
393 	}
394 
395 	public static JButton createToolbarButton( Action action )
396 	{
397 		JButton result = new JButton( action );
398 		result.setPreferredSize( TOOLBAR_BUTTON_DIMENSION );
399 		result.setText( "" );
400 		return result;
401 	}
402 
403 	public static JButton createToolbarButton( Action action, boolean enabled )
404 	{
405 		JButton result = createToolbarButton( action );
406 		result.setEnabled( enabled );
407 		return result;
408 	}
409 
410 	public static JPanel createTabPanel( JTabbedPane tabs, boolean addBorder )
411 	{
412 		GradientPanel panel = new GradientPanel( new BorderLayout() );
413 
414 		Color color = UIManager.getDefaults().getColor( "Panel.background" );
415 		Color darker = color.darker();
416 		panel.setForeground( new Color( (color.getRed() + darker.getRed()) / 2, 
417 					 (color.getGreen() + darker.getGreen()) / 2,
418 					 (color.getBlue() + darker.getBlue()) / 2) );
419 
420 		if( tabs.getTabPlacement() == JTabbedPane.LEFT || tabs.getTabPlacement() == JTabbedPane.RIGHT )
421 			panel.setDirection( GradientPanel.VERTICAL );
422 
423 		panel.add( tabs, BorderLayout.CENTER );
424 
425 		if( addBorder )
426 		{
427 			if( tabs.getTabPlacement() == JTabbedPane.TOP )
428 				panel.setBorder( BorderFactory.createMatteBorder( 1, 1, 0, 0, Color.GRAY ) );
429 			else
430 				panel.setBorder( BorderFactory.createMatteBorder( 0, 1, 0, 0, Color.GRAY ) );
431 		}
432 
433 		tabs.setBorder( null );
434 
435 		return panel;
436 	}
437 
438 	public static void showPopup( JPopupMenu popup, JComponent invoker, Point p )
439 	{
440 		popup.setInvoker( invoker );
441 
442 		popup.setLocation( ( int ) ( invoker.getLocationOnScreen().getX() + p.getX() ),
443 					( int ) ( invoker.getLocationOnScreen().getY() + p.getY() ) );
444 		popup.setVisible( true );
445 	}
446 
447 	public static DesktopPanel selectAndShow( ModelItem modelItem )
448 	{
449 		UISupport.select( modelItem );
450 		return showDesktopPanel( modelItem );
451 	}
452 
453 	public static DesktopPanel showDesktopPanel( ModelItem modelItem )
454 	{
455 		SoapUIDesktop desktop = SoapUI.getDesktop();
456 		return desktop == null ? null : desktop.showDesktopPanel( modelItem );
457 	}
458 
459 	public static DesktopPanel showDesktopPanel( DesktopPanel desktopPanel )
460 	{
461 		SoapUIDesktop desktop = SoapUI.getDesktop();
462 		return desktop == null ? null : desktop.showDesktopPanel( desktopPanel );
463 	}
464 
465 	public static Boolean confirmOrCancel( String question, String title )
466 	{
467 		return dialogs.confirmOrCancel( question, title );
468 	}
469 
470 	public static JPanel buildPanelWithToolbar( JComponent top, JComponent content )
471 	{
472 		JPanel p = new JPanel( new BorderLayout() );
473 		p.add( top, BorderLayout.NORTH );
474 		p.add( content, BorderLayout.CENTER );
475 
476 		return p;
477 	}
478 
479 	public static JPanel buildPanelWithToolbarAndStatusBar( JComponent top, JComponent content,
480 				JComponent bottom )
481 	{
482 		JPanel p = new JPanel( new BorderLayout() );
483 		p.add( top, BorderLayout.NORTH );
484 		p.add( content, BorderLayout.CENTER );
485 		p.add( bottom, BorderLayout.SOUTH );
486 
487 		return p;
488 	}
489 
490 	public static Dimension getPreferredButtonSize()
491 	{
492 		return TOOLBAR_BUTTON_DIMENSION;
493 	}
494 
495 	public static void showErrorMessage( Exception ex )
496 	{
497 		SoapUI.logError( ex );
498 		
499 		if( ex.toString().length() > 100 )
500 		{
501 			dialogs.showExtendedInfo( "Error", "An error of type " +  ex.getClass().getSimpleName() + " occured.", ex.toString(), null );
502 		}
503 		else
504 		{
505 			dialogs.showErrorMessage( ex.toString() );
506 		}
507 	}
508 
509 	public static Component wrapInEmptyPanel( JComponent component, Border border )
510 	{
511 		JPanel panel = new JPanel( new BorderLayout() );
512 		panel.add( component, BorderLayout.CENTER );
513 		panel.setBorder( border );
514 
515 		return panel;
516 	}
517 
518 	public static boolean isWindows()
519 	{
520 		if( isWindows == null )
521 			isWindows = new Boolean( System.getProperty( "os.name" ).indexOf( "Windows" ) >= 0 );
522 
523 		return isWindows.booleanValue();
524 	}
525 
526 	public static void setHourglassCursor()
527 	{
528 		if( frame == null )
529 			return;
530 
531 		if( hourglassCursor == null )
532 			hourglassCursor = new Cursor( Cursor.WAIT_CURSOR );
533 
534 		frame.setCursor( hourglassCursor );
535 	}
536 
537 	public static void resetCursor()
538 	{
539 		if( frame == null )
540 			return;
541 
542 		if( defaultCursor == null )
543 			defaultCursor = new Cursor( Cursor.DEFAULT_CURSOR );
544 
545 		frame.setCursor( defaultCursor );
546 	}
547 
548 	public static void setUIUtils( UIUtils utils )
549 	{
550 		UISupport.uiUtils = utils;
551 	}
552 
553 	public static void invokeLater( Runnable runnable )
554 	{
555 		uiUtils.invokeLater( runnable );
556 	}
557 	
558 	public static void invokeAndWait( Runnable runnable ) throws Exception
559 	{
560 		uiUtils.invokeAndWait( runnable );
561 	}
562 
563 	public static JXToolBar createToolbar()
564 	{
565 		JXToolBar toolbar = new JXToolBar();
566 		toolbar.setRollover( true );
567 		toolbar.putClientProperty( Options.HEADER_STYLE_KEY, HeaderStyle.BOTH );
568 		toolbar.setBorder( BorderFactory.createEmptyBorder( 3, 0, 3, 0 ) );
569 		return toolbar;
570 	}
571 
572 	/***
573 	 * Replaces "menu" in the keyStroke with ctrl or meta depending on
574 	 * getMenuShortcutKeyMask
575 	 */
576 
577 	public static KeyStroke getKeyStroke( String keyStroke )
578 	{
579 		try
580 		{
581 			if( Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() == Event.META_MASK )
582 			{
583 				keyStroke = keyStroke.replaceAll( "menu", "meta" );
584 			}
585 			else
586 			{
587 				keyStroke = keyStroke.replaceAll( "menu", "ctrl" );
588 			}
589 		}
590 		catch( Throwable e )
591 		{
592 			keyStroke = keyStroke.replaceAll( "menu", "ctrl" );
593 		}
594 
595 		return KeyStroke.getKeyStroke( keyStroke );
596 	}
597 
598 	public static Component buildDescription( String title, String string, ImageIcon icon )
599 	{
600 		JPanel panel = new GradientPanel( new BorderLayout() );
601 		panel.setBackground( UIManager.getColor( "control" ) );
602 		panel.setForeground( Color.WHITE );
603 		panel.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createMatteBorder( 0, 0,
604 					1, 0, Color.DARK_GRAY ), BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ) );
605 
606 		JLabel label = new JLabel( "<html><div style=\"font-size: 9px\">" + string + "</div></html>" );
607 		label.setBorder( BorderFactory.createEmptyBorder( 5, 5, 0, 0 ) );
608 
609 		JPanel innerPanel = new JPanel( new BorderLayout() );
610 		innerPanel.add( label, BorderLayout.CENTER );
611 		innerPanel.setOpaque( false );
612 
613 		JLabel titleLabel = new JLabel( "<html><div style=\"font-size: 9px\"><b>" + title
614 					+ "</b></div></html>" );
615 		innerPanel.add( titleLabel, BorderLayout.NORTH );
616 		panel.add( innerPanel, BorderLayout.CENTER );
617 
618 		if( icon != null )
619 		{
620 			JLabel iconLabel = new JLabel( icon );
621 			iconLabel.setBorder( BorderFactory.createEmptyBorder( 0, 10, 0, 0 ) );
622 			panel.add( iconLabel, BorderLayout.EAST );
623 		}
624 
625 		return panel;
626 	}
627 
628 	public static void setPreferredHeight( Component component, int heigth )
629 	{
630 		component.setPreferredSize( new Dimension( ( int ) component.getPreferredSize().getWidth(),
631 					heigth ) );
632 	}
633 
634 	public static JButtonBar initDialogActions( ActionList actions, final JDialog dialog )
635 	{
636 		JButtonBar buttons = new JButtonBar();
637 		buttons.addActions( actions );
638 
639 		dialog.getRootPane().setDefaultButton( buttons.getDefaultButton() );
640 		dialog.getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put(
641 					KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE, 0 ), "ESCAPE" );
642 		dialog.getRootPane().getActionMap().put( "ESCAPE", new AbstractAction()
643 		{
644 			public void actionPerformed( ActionEvent e )
645 			{
646 				dialog.setVisible( false );
647 			}
648 		} );
649 
650 		for( int c = 0; c < actions.getActionCount(); c++ )
651 		{
652 			Action action = actions.getActionAt( c );
653 			if( action instanceof HelpActionMarker )
654 			{
655 				dialog.getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ).put(
656 							KeyStroke.getKeyStroke( KeyEvent.VK_F1, 0 ), "HELP" );
657 				dialog.getRootPane().getActionMap().put( "HELP", action );
658 				break;
659 			}
660 		}
661 
662 		return buttons;
663 	}
664 
665 	public static <T extends JComponent> T addTitledBorder( T component, String title )
666 	{
667 		component.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder( 3, 0, 0, 0 ), 
668 							BorderFactory.createCompoundBorder( 
669 							BorderFactory.createTitledBorder( BorderFactory.createEmptyBorder(), title ), 
670 							component.getBorder() )));
671 		
672 		return component;
673 	}
674 
675 	public static void beep()
676 	{
677 		Toolkit.getDefaultToolkit().beep();
678 	}
679 
680 	@SuppressWarnings("unchecked")
681 	public static<T extends Object> T prompt( String question, String title, List<T> objects  )
682 	{
683 		return ( T ) dialogs.prompt( question, title, objects.toArray() );
684 	}
685 	
686 	@SuppressWarnings("unchecked")
687 	public static<T extends Object> T prompt( String question, String title, List<T> objects, String value  )
688 	{
689 		return ( T ) dialogs.prompt( question, title, objects.toArray(), value );
690 	}
691 
692 	public static void showExtendedInfo( String title, String description, String content, Dimension size )
693 	{
694 		dialogs.showExtendedInfo( title, description, content, size );
695 	}
696 	
697 	public static boolean confirmExtendedInfo( String title, String description, String content, Dimension size )
698 	{
699 		return dialogs.confirmExtendedInfo( title, description, content, size );
700 	}
701 	
702 	public static Boolean confirmOrCancelExtendedInfo( String title, String description, String content, Dimension size )
703 	{
704 		return dialogs.confirmOrCancleExtendedInfo( title, description, content, size );
705 	}
706 
707 	public static void select( ModelItem modelItem )
708 	{
709 		if( SoapUI.getNavigator() != null )
710 			SoapUI.getNavigator().selectModelItem( modelItem );
711 	}
712 }