package net.sourceforge.squirrel_sql.client.preferences.codereformat;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.util.codereformat.CodeReformator;
import net.sourceforge.squirrel_sql.client.util.codereformat.CodeReformatorConfigFactory;
import net.sourceforge.squirrel_sql.fw.gui.FontInfo;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.xml.XMLBeanWriter;
import java.awt.event.*;
import java.util.ArrayList;
public class FormatSqlController
{
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(FormatSqlController.class);
private FormatSqlPanel _formatSqlPanel;
private FormatSqlPref _formatSqlPref;
private IApplication _app;
public FormatSqlController(IApplication app)
{
_app = app;
_formatSqlPref = FormatSqlPrefReader.loadPref();
_formatSqlPanel = new FormatSqlPanel(_formatSqlPref.getKeywordBehaviourPrefs());
FontInfo fontInfo = app.getSquirrelPreferences().getSessionProperties().getFontInfo();
_formatSqlPanel.txtExampleSqls.setEditable(false);
_formatSqlPanel.txtExampleSqls.setFont(fontInfo.createFont());
refreshExampleSql(_formatSqlPref);
_formatSqlPanel.txtIndentCount.setValue(_formatSqlPref.getIndent());
_formatSqlPanel.txtIndentCount.addFocusListener(new FocusAdapter()
{
@Override
public void focusLost(FocusEvent e)
{
refreshExampleSql(createFormatSqlPrefFromGui());
}
});
_formatSqlPanel.txtPreferedLineLength.setValue(_formatSqlPref.getPreferedLineLength());
_formatSqlPanel.txtPreferedLineLength.addFocusListener(new FocusAdapter()
{
@Override
public void focusLost(FocusEvent e)
{
refreshExampleSql(createFormatSqlPrefFromGui());
}
});
ActionListener actionListener = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
refreshExampleSql(createFormatSqlPrefFromGui());
}
};
for (KeywordBehaviourPrefCtrl keywordBehaviourPrefCtrl : _formatSqlPanel.keywordBehaviourPrefCtrls)
{
keywordBehaviourPrefCtrl.addKeyWordBehaviourChangedListener(actionListener);
}
_formatSqlPanel.chkDoInsertValuesAlign.setSelected(_formatSqlPref.isDoInsertValuesAlign());
_formatSqlPanel.chkDoInsertValuesAlign.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
adjustInsertValuesState();
}
});
adjustInsertValuesState();
}
private void adjustInsertValuesState()
{
for (KeywordBehaviourPrefCtrl keywordBehaviourPrefCtrl : _formatSqlPanel.keywordBehaviourPrefCtrls)
{
String keyWord = keywordBehaviourPrefCtrl.getKeywordBehaviourPref().getKeyWord();
if (FormatSqlPref.INSERT.equals(keyWord))
{
if(_formatSqlPanel.chkDoInsertValuesAlign.isSelected())
{
keywordBehaviourPrefCtrl.setBehaviour(FormatSqlPanel.KeywordBehaviour.START_NEW_LINE);
keywordBehaviourPrefCtrl.setEnabled(false);
}
else
{
keywordBehaviourPrefCtrl.setEnabled(true);
}
}
else if (FormatSqlPref.VALUES.equals(keyWord))
{
if(_formatSqlPanel.chkDoInsertValuesAlign.isSelected())
{
keywordBehaviourPrefCtrl.setBehaviour(FormatSqlPanel.KeywordBehaviour.NO_INFLUENCE_ON_NEW_LINE);
keywordBehaviourPrefCtrl.setEnabled(false);
}
else
{
keywordBehaviourPrefCtrl.setEnabled(true);
}
}
}
refreshExampleSql(createFormatSqlPrefFromGui());
}
private void refreshExampleSql(FormatSqlPref formatSqlPref)
{
String sqls;CodeReformator codeReformator = new CodeReformator(CodeReformatorConfigFactory.createConfig(formatSqlPref));
sqls = codeReformator.reformat("SELECT table1.id, table2.number, SUM(table1.amount) FROM table1 INNER JOIN table2 ON table.id = table2.table1_id WHERE table1.id IN (SELECT table1_id FROM table3 WHERE table3.name = 'Foo Bar' and table3.type = 'unknown_type') GROUP BY table1.id, table2.number ORDER BY table1.id");
sqls += "\n\n";
sqls += codeReformator.reformat("UPDATE table1 SET name = 'Hello', number = '1456-789' WHERE id = 42");
sqls += "\n\n";
sqls += codeReformator.reformat("INSERT INTO table1 (name, number) SELECT name, number FROM table1_bak");
sqls += "\n\n";
sqls += codeReformator.reformat("INSERT INTO table1 (name, number, type) VALUES ('Foo', 42, 'VA')");
sqls += "\n\n";
sqls += codeReformator.reformat("DELETE FROM table1 WHERE name = 'Hello' OR number = '1456-789'");
_formatSqlPanel.txtExampleSqls.setText(sqls);
}
public void applyChanges()
{
try
{
_formatSqlPref = createFormatSqlPrefFromGui();
XMLBeanWriter bw = new XMLBeanWriter(_formatSqlPref);
bw.save(FormatSqlPrefReader.getPrefsFile());
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
private FormatSqlPref createFormatSqlPrefFromGui()
{
FormatSqlPref ret = new FormatSqlPref();
if (null != _formatSqlPanel.txtIndentCount.getText())
{
try
{
Integer indent = Integer.valueOf(_formatSqlPanel.txtIndentCount.getText());
if (indent >= 0)
{
ret.setIndent(indent);
}
}
catch (NumberFormatException e)
{
// ignore
}
}
if (null != _formatSqlPanel.txtPreferedLineLength.getText())
{
try
{
Integer preferedLineLength = Integer.valueOf(_formatSqlPanel.txtPreferedLineLength.getText());
if (preferedLineLength >= 0)
{
ret.setPreferedLineLength(preferedLineLength);
}
}
catch (NumberFormatException e)
{
// ignore
}
}
ArrayList<KeywordBehaviourPref> buf = new ArrayList<KeywordBehaviourPref>();
for (KeywordBehaviourPrefCtrl keywordBehaviourPrefCtrl : _formatSqlPanel.keywordBehaviourPrefCtrls)
{
keywordBehaviourPrefCtrl.applyChanges();
buf.add(keywordBehaviourPrefCtrl.getKeywordBehaviourPref());
}
ret.setKeywordBehaviourPrefs(buf.toArray(new KeywordBehaviourPref[buf.size()]));
ret.setDoInsertValuesAlign(_formatSqlPanel.chkDoInsertValuesAlign.isSelected());
return ret;
}
public FormatSqlPanel getPanel()
{
return _formatSqlPanel;
}
}