001    package com.sptci.rwt.webui;
002    
003    import java.util.Collection;
004    import java.util.Map;
005    
006    import echopointng.Menu;
007    import echopointng.MenuBar;
008    import echopointng.MenuItem;
009    
010    import com.sptci.echo2.Configuration;
011    import com.sptci.epng.Logout;
012    import com.sptci.rwt.Category;
013    import com.sptci.rwt.DatabaseType;
014    
015    /**
016     * The component that displays the application menu.
017     *
018     * <p>&copy; Copyright 2007 <a href='http://sptci.com/' target='_new'>Sans Pareil Technologies, Inc.</a></p>
019     * @author Rakesh Vidyadharan 2007-09-29
020     * @version $Id: MenuComponent.java 4123 2008-05-25 21:49:01Z rakesh $
021     */
022    public class MenuComponent extends MenuBar
023    {
024      /** The main application controller to use for this component. */
025      private final MainController controller;
026    
027      /** The menu used to store saved JDBC connections. */
028      private Menu savedConnections;
029    
030      /** The menu used to store saved SQL statements. */
031      private Menu savedQueries;
032    
033      /**
034       * Default constructor.  Initialises the menu bar.
035       *
036       * @see #createConnections
037       * @see #createQueries
038       */
039      public MenuComponent( final MainController controller )
040      {
041        this.controller = controller;
042        createConnectionsMenu();
043        createQueries();
044      }
045    
046      /**
047       * Create the menu that displays the connection options.
048       *
049       * @see #createDataSources
050       * @see #createConnections
051       * @see #createConnection
052       */
053      private void createConnectionsMenu()
054      {
055        Menu menu = new Menu(
056            Configuration.getString( this, "connectionMenu.text" ) );
057    
058        menu.add( createDataSources() );
059        menu.add( createConnections() );
060        menu.add( createConnection() );
061        menu.add( new Logout() );
062    
063        add( menu );
064      }
065    
066      /**
067       * Create the menu used to display all available {@link
068       * javax.sql.DataSource}s configured for the application.
069       *
070       * @return The menu with all available datasources as menu items.
071       */
072      private Menu createDataSources()
073      {
074        final Menu menu = new Menu( Configuration.getString(
075              this, "connectionMenu.dataSources.text" ) );
076    
077        final DataSourceListener listener = new DataSourceListener( controller );
078        for ( String name : controller.getDataSources() )
079        {
080          final MenuItem item = new MenuItem( name );
081          item.setActionCommand( name );
082          item.addActionListener( listener );
083          menu.add( item );
084        }
085    
086        return menu;
087      }
088    
089      /**
090       * Create the menu used to display all the saved JDBC {@link
091       * java.sql.Connection}s for the application user.
092       *
093       * @return The menu with all available saved connections.
094       */
095      private Menu createConnections()
096      {
097        savedConnections = new Menu( Configuration.getString(
098              this, "connectionMenu.connections.text" ) );
099    
100        final MenuItem manage = new MenuItem( Configuration.getString(
101              this, "manageConnections" ) );
102        manage.addActionListener(
103            new ManageSavedConnectionsListener( controller ) );
104        savedConnections.add( manage );
105    
106        for ( Map.Entry<String,Collection<String>> entry :
107            controller.getSavedConnections().entrySet() )
108        {
109          final Menu sub = new Menu( entry.getKey() );
110    
111          for ( String name : entry.getValue() )
112          {
113            final MenuItem item = new MenuItem( name );
114            final DatabaseType databaseType =
115              controller.getConnections().getDatabaseType( entry.getKey() );
116            item.addActionListener(
117                new SavedConnectionListener( databaseType, name, controller ) );
118            sub.add( item );
119          }
120    
121          savedConnections.add( sub );
122        }
123    
124        return savedConnections;
125      }
126    
127      /**
128       * Create the menu item used to display the connection dialogue.
129       *
130       * @return The menu item to launch the connection dialogue.
131       */
132      private MenuItem createConnection()
133      {
134        MenuItem item = new MenuItem( Configuration.getString(
135              this, "connectionMenu.createConnection.text" ) );
136        item.setToolTipText( Configuration.getString(
137              this, "connectionMenu.createConnection.tooltip" ) );
138        item.addActionListener( new ConnectionDialogueListener( controller ) );
139        return item;
140      }
141    
142      /**
143       * Create the menu that displays query windows and saved queries.
144       *
145       * @see #createQueryExecutor
146       * @see #createBatchQueryExecutor
147       * @see #createSavedQueries()
148       */
149      private void createQueries()
150      {
151        Menu menu = new Menu(
152            Configuration.getString( this, "queryMenu.text" ) );
153    
154        menu.add( createQueryExecutor() );
155        menu.add( createBatchQueryExecutor() );
156        menu.add( createSavedQueries() );
157    
158        add( menu );
159      }
160    
161      /**
162       * Create the menu item that is used to launch the {@link
163       * QueryExecutorView} component.
164       *
165       * @return The menu item to launch the query executor component.
166       */
167      private MenuItem createQueryExecutor()
168      {
169        MenuItem item = new MenuItem( Configuration.getString(
170              this, "queryMenu.queryExecutor.text" ) );
171        item.setToolTipText( Configuration.getString(
172              this, "queryMenu.queryExecutor.tooltip" ) );
173        item.addActionListener( new QueryExecutorListener( controller ) );
174        return item;
175      }
176    
177      /**
178       * Create the menu item that is used to launch the {@link
179       * BatchQueryExecutorView} component.
180       *
181       * @return The menu item to launch the batch query executor component.
182       */
183      private MenuItem createBatchQueryExecutor()
184      {
185        MenuItem item = new MenuItem( Configuration.getString(
186              this, "queryMenu.batchQueryExecutor.text" ) );
187        item.setToolTipText( Configuration.getString(
188              this, "queryMenu.batchQueryExecutor.tooltip" ) );
189        item.addActionListener( new BatchQueryExecutorListener( controller ) );
190        return item;
191      }
192    
193      /**
194       * Create the menu used to display all the saved queries for the user
195       * and application.
196       *
197       * @see #createSavedQueries( Category )
198       * @return The menu used to organise the saved queries.
199       */
200      private Menu createSavedQueries()
201      {
202        savedQueries = new Menu(
203            Configuration.getString( this, "savedQueriesMenu.text" ) );
204    
205        final MenuItem item =
206          new MenuItem( Configuration.getString( this, "manageQueries" ) );
207        item.addActionListener( new ManageSavedQueriesListener( controller ) );
208        savedQueries.add( item );
209    
210        for ( Category category : controller.getCategories() )
211        {
212          savedQueries.add( createSavedQueries( category ) );
213        }
214    
215        return savedQueries;
216      }
217    
218      /**
219       * Create the necessary menu's to display the saved queries under the
220       * specified category.
221       *
222       * @param category The category under which saved queries are stored.
223       */
224      private Menu createSavedQueries( final Category category )
225      {
226        final Menu menu = new Menu( category.getName() );
227        for ( String name : category.getNames() )
228        {
229          final MenuItem item = new MenuItem( name );
230          item.addActionListener( new SavedQueryExecutorListener(
231                category.getQuery( name ).getValue(), controller ) );
232          menu.add( item );
233        }
234    
235        return menu;
236      }
237    }