/*
* XRecordChooser.java
*
*/
package com.m16e.tools.gui;
import com.m16e.tools.Tuple;
import com.m16e.tools.datamodels.ComboData;
import com.m16e.tools.datamodels.QueryData;
import com.m16e.tools.datamodels.XgmTableDataModel;
import com.m16e.tools.datamodels.XgmTableModel;
import com.m16e.tools.db.DbBundle;
import com.m16e.tools.db.DbField;
import com.m16e.tools.db.DbTableInterface;
import com.m16e.tools.i18n.LocaleBundle;
import com.m16e.tools.i18n.MpBundle;
import com.m16e.tools.xgm.XgmAction;
import com.m16e.tools.xgm.XgmComponent;
import com.m16e.tools.xgm.XgmContainer;
import com.m16e.tools.xgm.XgmException;
import com.m16e.tools.xgm.XgmFactory;
import com.m16e.tools.xgm.XgmRootContainer;
import com.m16e.tools.xgm.XgmTable;
import com.m16e.tools.xml.XmlTreeNode;
import com.m16e.tools.xml.XmlTreeNodeable;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.sql.SQLException;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import org.apache.log4j.Logger;
///////////////////////////////////////////////////////////////
public class XRecordChooser
extends XgmRootContainer
{
public static final String DIALOGS_DIR = "dialogs";
String layoutFile = null;
String tableCompName = null;
DbTableInterface dbTab = null;
XgmTable xgmTable = null;
private static Logger logger = Logger.getLogger( XRecordChooser.class );
///////////////////////////////////////////////////////////////
public XRecordChooser( DbTableInterface table )
throws SQLException
{
dbTab = table;
layoutFile = dbTab.getTabLayoutFilename();
tableCompName = XgmContainer.PREFIX_TABLE + dbTab.getTableName();
}
///////////////////////////////////////////////////////////////
public void setLayoutFile( String layoutFile )
{
this.layoutFile = layoutFile;
}
///////////////////////////////////////////////////////////////
public void init()
throws XgmException
{
try
{
// String layout = dbTab.getTabLayoutFilename();
String text =
XgmFactory.getInstance().readLayout( layoutFile );
XmlTreeNode xtnDialog = new XmlTreeNode();
xtnDialog.fromXml( text );
xtnDialog.setAttribute( TYPE, XgmContainer.ContainerType.TYPE_PANEL.getName() );
java.util.List<XmlTreeNodeable> lstChildren = xtnDialog.getChildren();
XmlTreeNodeable xtn = xtnDialog.getChildren().get( 0 );
for( ; lstChildren.size() > 1; )
lstChildren.remove( 1 );
setLayout( layoutFile, xtnDialog, true );
xgmTable = (XgmTable) getComponentByName( tableCompName );
}
catch( Exception e )
{
String msg = e.getLocalizedMessage();
logger.warn( msg, e );
throw new XgmException( XgmException.GUI_ERROR, msg );
}
}
///////////////////////////////////////////////////////////////
public XgmTable getTable() { return xgmTable; }
///////////////////////////////////////////////////////////////
public Tuple getRecord()
{
xgmTable.getXgmTableDataModel().requery();
JOptionPane jop = new JOptionPane( getSwingComponent() );
jop.setOptionType( JOptionPane.OK_CANCEL_OPTION );
//jop.setWantsInput( true );
jop.setSelectionValues( null );
jop.setInitialSelectionValue( getSwingComponent() );
String tableName = DbBundle.getInstance().getBundleMessage( dbTab.getTableName() );
JDialog jd =
jop.createDialog(
getSwingComponent(),
LocaleBundle.getInstance().getBundleMessage(
LocaleBundle.MSG_LIST_OF, tableName ) );
AbstractAction aa = new AbstractAction()
{
public void actionPerformed( ActionEvent e )
{
processHelp();
}
};
InputMap wim =
jop.getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW );
String actionName = "process-xrecordchosser-F3";
wim.put( KeyStroke.getKeyStroke( KeyEvent.VK_F3, 0 ), actionName );
jop.getActionMap().put( actionName, aa );
//processHelp();
//jd.setSize( 600, 400 );
jd.setResizable( true );
jop.selectInitialValue();
jd.setVisible( true );
jd.dispose();
Object val = jop.getValue();
if( val instanceof Integer )
{
int op = ((Integer) val).intValue();
if( op != JOptionPane.OK_OPTION )
return null;
}
else
return null;
XmlTreeNodeable result = null;
Tuple record = null;
try
{
result = getXtnValueForResult();
dbTab.setData( result );
record = dbTab.getTuple();
}
catch( Exception e )
{
String msg = e.getLocalizedMessage();
logger.warn( msg, e );
JOptionPane.showMessageDialog( getSwingComponent(), msg );
}
return record;
}
///////////////////////////////////////////////////////////////
public static void registerAction( XgmComponent xc, XgmAction action )
{
Component comp = xc.getSwingComponent();
if( comp instanceof JComponent )
{
JComponent jComp = (JComponent) comp;
InputMap wim =
jComp.getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW );
wim.put( action.getKeyStroke(), action.getActionName() );
jComp.getActionMap().put(
action.getActionName(),
action );
}
}
///////////////////////////////////////////////////////////////
void requery( QueryData where )
{
XgmTableDataModel xtdm = xgmTable.getXgmTableDataModel();
xtdm.setWhereClause( where );
xtdm.requery();
}
///////////////////////////////////////////////////////////////
static MpBundle localeBundle = LocaleBundle.getInstance();
static final String[] STRING_OPS =
{
localeBundle.getBundleMessage( LocaleBundle.MSG_OP_STARTS_WITH ),
localeBundle.getBundleMessage( LocaleBundle.MSG_OP_CONTAINS ),
localeBundle.getBundleMessage( LocaleBundle.MSG_OP_ENDS_WITH )
};
static final String[] OBJ_OPS =
{
localeBundle.getBundleMessage( LocaleBundle.MSG_OP_EQUAL ),
localeBundle.getBundleMessage( LocaleBundle.MSG_OP_GREATER_THEN ),
localeBundle.getBundleMessage( LocaleBundle.MSG_OP_LESSER_THEN )
};
///////////////////////////////////////////////////////////////
void processHelp()
{
QueryData where = null;
XgmTableModel xtm = null;
if( xgmTable != null )
{
xtm = xgmTable.getXgmTableModel();
where = xtm.getXgmTableDataModel().getWhereClause();
}
try
{
JPanel jpMain = new JPanel( new BorderLayout() );
JCheckBox jcbSearch = new JCheckBox( "Limpar pesquisa anterior" );
jpMain.add( jcbSearch, BorderLayout.NORTH );
JPanel jpChoose = new JPanel( new GridLayout( 0, 3 ) );
JLabel jlFld = new JLabel( "Campo:" );
jpChoose.add( jlFld );
jpChoose.add( new JLabel() );
final JComboBox jcbOp = new JComboBox();
JComboBox jcbFld = new JComboBox( dbTab.getDbTable().getTitlesForCombo() );
jcbFld.addItemListener(
new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
ComboData cd = (ComboData) e.getItemSelectable().getSelectedObjects()[0];
switch( dbTab.getDbTable().getField( cd.getCode() ).getDbFieldType() )
{
case CHAR:
case VARCHAR:
jcbOp.removeAllItems();
for( String item : STRING_OPS )
jcbOp.addItem( item );
break;
default:
jcbOp.removeAllItems();
for( String item : OBJ_OPS )
jcbOp.addItem( item );
break;
}
}
}
);
jpChoose.add( jcbFld );
JLabel jlVal = new JLabel( "Valor:" );
jpChoose.add( jlVal );
jpChoose.add( jcbOp );
JTextField jtfVal = new JTextField( 40 );
jpChoose.add( jtfVal );
jpMain.add( jpChoose, BorderLayout.CENTER );
JOptionPane jop = new JOptionPane( jpMain );
jop.setOptionType( JOptionPane.OK_CANCEL_OPTION );
JDialog jd = jop.createDialog( getSwingComponent(), "Pesquisa" );
jd.setResizable( true );
jop.selectInitialValue();
jd.setVisible( true );
jd.setModal( true );
jd.dispose();
Object val = jop.getValue();
if( val instanceof Integer )
{
int op = ((Integer) val).intValue();
if( op == JOptionPane.OK_OPTION )
{
DbField dbf = dbTab.getField( jcbFld.getSelectedIndex() );
where = new QueryData( dbf.getFieldName() );
where.addArg( jtfVal.getText() );
}
requery( where );
}
}
catch( Exception e1 )
{
String msg = e1.getLocalizedMessage();
logger.warn( msg, e1 );
JOptionPane.showMessageDialog( null, msg );
}
}
///////////////////////////////////////////////////////////////
// interface KeyListener: END
///////////////////////////////////////////////////////////////
}
|