package net.sourceforge.squirrel_sql.client.session.mainpanel;
import net.sourceforge.squirrel_sql.client.action.SquirrelAction;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.client.session.MessagePanel;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
import net.sourceforge.squirrel_sql.fw.util.Utilities;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
public class ErrorPanel extends JPanel
{
private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ErrorPanel.class);
private ErrorPanelListener _errorPanelListener;
private JPopupMenu _popUp = new JPopupMenu();
private JTextArea _txtArea;
private TabButton _btnClose;
public ErrorPanel(ISession session, ErrorPanelListener errorPanelListener, ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement)
{
super(new BorderLayout());
_errorPanelListener = errorPanelListener;
_txtArea = new JTextArea();
_txtArea.setFont(_txtArea.getFont().deriveFont(Font.BOLD));
_txtArea.setForeground(Color.red);
_txtArea.setSelectedTextColor(Color.red);
_txtArea.setEditable(false);
for (int i = 0; i < sqlExecErrorMsgs.size(); i++)
{
_txtArea.append(sqlExecErrorMsgs.get(i));
if(i < sqlExecErrorMsgs.size() - 1)
{
_txtArea.append("\n\n");
}
}
JScrollPane scrp = new JScrollPane(_txtArea);
add(createNorthPanel(session, sqlExecErrorMsgs, lastExecutedStatement), BorderLayout.NORTH);
add(scrp, BorderLayout.CENTER);
initPopup();
scrp.scrollRectToVisible(new Rectangle(0,0,1,1));
}
private void initPopup()
{
JMenuItem mnuCopyAll = new JMenuItem(s_stringMgr.getString("ErrorPanel.copyAll"));
mnuCopyAll.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
onCopyAll();
}
});
_popUp.add(mnuCopyAll);
JMenuItem mnuCopySelection = new JMenuItem(s_stringMgr.getString("ErrorPanel.copySelection"));
mnuCopySelection.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
onCopySelection();
}
});
_popUp.add(mnuCopySelection);
_txtArea.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
maybeShowPopup(evt);
}
public void mouseReleased(MouseEvent evt)
{
maybeShowPopup(evt);
}
});
}
private void onCopyAll()
{
if(null == _txtArea.getText())
{
return;
}
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection data = new StringSelection(_txtArea.getText().trim());
clip.setContents(data, data);
}
private void onCopySelection()
{
if(null == _txtArea.getSelectedText())
{
return;
}
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection data = new StringSelection(_txtArea.getSelectedText().trim());
clip.setContents(data, data);
}
private JPanel createNorthPanel(ISession session, ArrayList<String> sqlExecErrorMsgs, String lastExecutedStatement)
{
JPanel ret = new JPanel(new GridBagLayout());
String msg = s_stringMgr.getString("ErrorPanel.NoErrorStatement") ;
if(1 < sqlExecErrorMsgs.size() && false == session.getProperties().getAbortOnError())
{
msg = s_stringMgr.getString("ErrorPanel.MultibleStatements") ;
}
else if(null != lastExecutedStatement && 0 < lastExecutedStatement.trim().length())
{
msg = s_stringMgr.getString("ErrorPanel.occuredIn", StringUtilities.cleanString(lastExecutedStatement.trim())) ;
}
String escapedMsg = Utilities.escapeHtmlChars(msg);
String htmlMsg = "<html><pre> " + escapedMsg + "</pre></html>";
GridBagConstraints gbc;
gbc = new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,5),0,0 );
ret.add(new JLabel(htmlMsg), gbc);
gbc = new GridBagConstraints(1,0,1,1,0,0, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0 );
_btnClose = new TabButton(new CloseAction(session));
ret.add(_btnClose, gbc);
return ret;
}
public void hideCloseButton()
{
_btnClose.setVisible(false);
}
private class CloseAction extends SquirrelAction
{
CloseAction(ISession session)
{
super(
session.getApplication(),
session.getApplication().getResources());
}
public void actionPerformed(ActionEvent evt)
{
closeTab();
}
}
private void closeTab()
{
_errorPanelListener.removeErrorPanel(this);
}
private final class TabButton extends JButton
{
TabButton(Action action)
{
super(action);
setMargin(new Insets(0, 0, 0, 0));
setBorderPainted(false);
setText("");
}
}
private void maybeShowPopup(MouseEvent evt)
{
if (evt.isPopupTrigger())
{
_popUp.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}