package net.sourceforge.squirrel_sql.client.session.mainpanel.overview.datascale;
import net.sourceforge.squirrel_sql.fw.gui.SortableTableModel;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* This class only exists because the regular right mouse menu handling does not work
* for the buttons that a DataScalePanel consists of.
*
* The right mouse menu works for those Buttons only if a button was clicked and then the previous navigation button was used
* to return to the table where the button was klicked. In this case the tabel's right mouse menu doesn't work anymore.
* That is why we implement both ways.
*
* Quite a bit comlicated just to bring up a right mouse menu, isn't it.
*
*
*/
public class DataScaleTablePopupHandler
{
private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(DataScaleTablePopupHandler.class);
private DataScaleTable _dataScaleTable;
private JButton _buttonPopupWasOpenedAt;
private DataScale _dataScalePopupWasOpenedAt;
DataScaleTablePopupHandler(final DataScaleTable dataScaleTable)
{
_dataScaleTable = dataScaleTable;
attachListenersToTable(dataScaleTable);
attachListenersToButtons(dataScaleTable);
}
private void attachListenersToButtons(DataScaleTable dataScaleTable)
{
final JPopupMenu popup = createPopupMenu();
for (int i = 0; i < dataScaleTable.getDataScaleTableModel().getRowCount(); i++)
{
final DataScale dataScale = dataScaleTable.getDataScaleTableModel().getDataScaleAt(i);
// This initialzing call is needed to make ths scale to create the buttons.
dataScale.getPanel();
JButton[] buttons = dataScale.getButtons();
for (final JButton button : buttons)
{
button.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent evt)
{
maybeShowPopUpOnButton(evt, dataScale, button, popup);
}
@Override
public void mouseReleased(MouseEvent evt)
{
maybeShowPopUpOnButton(evt, dataScale, button, popup);
}
});
}
}
}
private void maybeShowPopUpOnButton(MouseEvent evt, DataScale dataScale, JButton button, JPopupMenu popup)
{
if (evt.isPopupTrigger())
{
_dataScalePopupWasOpenedAt = dataScale;
_buttonPopupWasOpenedAt = button;
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
private void attachListenersToTable(DataScaleTable dataScaleTable)
{
final JPopupMenu popup = createPopupMenu();
dataScaleTable.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent evt)
{
maybeShowPopUpOnTable(evt, popup);
}
@Override
public void mouseReleased(MouseEvent evt)
{
maybeShowPopUpOnTable(evt, popup);
}
});
}
private JPopupMenu createPopupMenu()
{
final JPopupMenu popup = new JPopupMenu();
JMenuItem mnuInTable = new JMenuItem(s_stringMgr.getString("DataScaleTablePopupHandler.showInTable"));
mnuInTable.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
_dataScalePopupWasOpenedAt.showInTableSelected(_buttonPopupWasOpenedAt);
}
});
popup.add(mnuInTable);
JMenuItem mnuInTableWin = new JMenuItem(s_stringMgr.getString("DataScaleTablePopupHandler.showTableInWin"));
mnuInTableWin.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
_dataScalePopupWasOpenedAt.showInTableWin(_buttonPopupWasOpenedAt);
}
});
popup.add(mnuInTableWin);
return popup;
}
private void maybeShowPopUpOnTable(MouseEvent evt, JPopupMenu popup)
{
if (evt.isPopupTrigger())
{
Point point = new Point(evt.getX(), evt.getY());
int colIx = _dataScaleTable.columnAtPoint(point);
String headerValue = (String) _dataScaleTable.getColumnModel().getColumn(colIx).getHeaderValue();
if(DataScaleTableModel.COL_NAME_DATA.equals(headerValue))
{
int rowIx = _dataScaleTable.rowAtPoint(point);
DataScaleTableModel model = _dataScaleTable.getDataScaleTableModel();
SortableTableModel sortableTableModel = (SortableTableModel) _dataScaleTable.getModel();
int transformedRow = sortableTableModel.transfromToModelRow(rowIx);
_dataScalePopupWasOpenedAt = model.getDataScaleAt(transformedRow);
Rectangle rect = _dataScaleTable.getCellRect(rowIx, colIx, false);
// System.out.println("cell rect x = " + rect.x);
// System.out.println("cell rect y = " + rect.y);
//
// System.out.println("point x = " + point.x);
// System.out.println("point y = " + point.y);
//
int xInScalePanel = point.x - rect.x;
int yInScalePanel = point.y - rect.y;
//
// System.out.println("point in panel x = " + xInScalePanel);
// System.out.println("point in panel y = " + yInScalePanel);
_buttonPopupWasOpenedAt = _dataScalePopupWasOpenedAt.getPanel().getButtonAt(xInScalePanel);
// System.out.println("btn = " + _buttonPopupWasOpenedAt.getText());
if (null != _dataScalePopupWasOpenedAt && null != _buttonPopupWasOpenedAt)
{
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}
}
}