package net.sourceforge.squirrel_sql.client.gui.session; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.sql.SQLException; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import net.sourceforge.squirrel_sql.client.session.ISession; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; import net.sourceforge.squirrel_sql.fw.gui.SQLCatalogsComboBox; import net.sourceforge.squirrel_sql.fw.sql.ISQLConnection; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; import org.apache.commons.lang.StringUtils; public class CatalogsPanel extends JPanel { /** Internationalized strings for this class. */ private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(CatalogsPanel.class); private static final ILogger s_log = LoggerController.createLogger(CatalogsPanel.class); private ISession _session; private JComponent _parent; private SQLCatalogsComboBox _catalogsCmb; private PropertyChangeListener _connectionPropetryListener; public CatalogsPanel(ISession session, JComponent parent) { _session = session; _parent = parent; _connectionPropetryListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { onConnectionPropertyChanged(evt); } }; setVisible(false); initInBackground(); } private void onConnectionPropertyChanged(PropertyChangeEvent evt) { try { final String propName = evt.getPropertyName(); if (propName == null || propName.equals(ISQLConnection.IPropertyNames.CATALOG)) { if (_catalogsCmb != null) { final ISQLConnection conn = _session.getSQLConnection(); if (!StringUtils.equals(conn.getCatalog(), _catalogsCmb.getSelectedCatalog())) { _catalogsCmb.setSelectedCatalog(conn.getCatalog()); } } } } catch (SQLException e) { s_log.error("Error processing Property ChangeEvent", e); } } private void initInBackground() { try { if(false == _session.getSQLConnection().getSQLMetaData().supportsCatalogs()) { return; } final String[] catalogs = _session.getSQLConnection().getSQLMetaData().getCatalogs(); if(null == catalogs || 0 == catalogs.length) { return; } final String selected = _session.getSQLConnection().getCatalog(); _session.getSQLConnection().removePropertyChangeListener(_connectionPropetryListener); _session.getSQLConnection().addPropertyChangeListener(_connectionPropetryListener); GUIUtils.processOnSwingEventThread(new Runnable() { public void run() { initGuiInForeground(catalogs, selected); } }); } catch (SQLException e) { s_log.error(s_stringMgr.getString("SessionPanel.error.retrievecatalog"), e); } } private void initGuiInForeground(String[] catalogs, String selected) { setLayout(new GridBagLayout()); GridBagConstraints gbc; gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,5),0,0); JLabel lblCatalogs = new JLabel(s_stringMgr.getString("SessionPanel.catalog")); add(lblCatalogs, gbc); _catalogsCmb = new SQLCatalogsComboBox(); gbc = new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,5),0,0); add(_catalogsCmb, gbc); _catalogsCmb.setCatalogs(catalogs, selected); Dimension prefSize = getPreferredSize(); prefSize.width = lblCatalogs.getPreferredSize().width + _catalogsCmb.getPreferredSize().width + 20; setPreferredSize(prefSize); setMaximumSize(prefSize); setVisible(true); _parent.validate(); } public void addActionListener(ActionListener catalogsComboListener) { if(null != _catalogsCmb) { _catalogsCmb.addActionListener(catalogsComboListener); } } public void removeActionListener(ActionListener catalogsComboListener) { if(null != _catalogsCmb) { _catalogsCmb.addActionListener(catalogsComboListener); } } public void refreshCatalogs() { removeAll(); _session.getApplication().getThreadPool().addTask(new Runnable() { public void run() { initInBackground(); } }); } public String getSelectedCatalog() { return (String) _catalogsCmb.getSelectedItem(); } }