package org.openswing.swing.client;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.openswing.swing.logger.client.*;
import org.openswing.swing.util.client.*;
import java.awt.datatransfer.*;
import java.text.*;
import org.openswing.swing.util.java.*;
import org.openswing.swing.form.model.client.VOModel;
import org.openswing.swing.form.model.client.ValueChangeEvent;
import org.openswing.swing.form.model.client.ValueChangeListener;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Class that could be used as bease class for an input control.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class InputControlPopupMenu extends JPopupMenu implements MouseListener {
/** input control linked to this popup menu */
private InputControl inputControl = null;
/** flag used to show copy/cut/past command in popup menu */
private boolean copyAndPasteEnabled = false;
/**
* Constructor invoked by input control when right mouse clicking on it.
* @param inputControl input control linked to this popup menu
*/
public InputControlPopupMenu(InputControl inputControl) {
this.inputControl = inputControl;
if (inputControl instanceof BaseInputControl)
((BaseInputControl)inputControl).getBindingComponent().addMouseListener(this);
else
((JComponent)inputControl).addMouseListener(this);
copyAndPasteEnabled =
!(inputControl instanceof CheckBoxControl) &&
!(inputControl instanceof RadioButtonControl) &&
!(inputControl instanceof ComboBoxControl) &&
!(inputControl instanceof ComboBoxVOControl) &&
!(inputControl instanceof ListControl) &&
!(inputControl instanceof ListVOControl) &&
!(inputControl instanceof ProgressBarControl) &&
!(inputControl instanceof ImageControl);
}
/**
* Set visibility state of popup menu.
*/
public final void setVisible(boolean v) {
super.setVisible(v);
if (!v &&
inputControl!=null &&
((JComponent)inputControl).isVisible()) {
if (inputControl instanceof BaseInputControl && !((BaseInputControl)inputControl).getBindingComponent().hasFocus())
((BaseInputControl)inputControl).getBindingComponent().requestFocus();
else if (!(inputControl instanceof BaseInputControl) && !((JComponent)inputControl).hasFocus())
((JComponent)inputControl).requestFocus();
}
}
/**
* Copy data within input control to the system clipboard.
*/
private boolean copyToClipboard(Object value) {
Transferable contents = null;
if (value instanceof String)
contents = new StringSelection(value.toString());
else if (value instanceof java.util.Date) {
SimpleDateFormat sdfdatetime = new SimpleDateFormat(ClientSettings.getInstance().getResources().getDateMask(Consts.TYPE_DATE_TIME));
contents = new StringSelection(sdfdatetime.format((java.util.Date)value));
}
else if (value instanceof Number)
contents = new StringSelection(value.toString());
if (contents!=null) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(contents, null);
return true;
}
else
return false;
}
/**
* Method called when input control content has been changed.
*/
private void maybeFireValueChangedEvent(Object oldValue,Object newValue) {
// retrieve current value...
if ((oldValue==null && newValue!=null) ||
(oldValue!=null && newValue==null) ||
(oldValue!=null && newValue!=null && ! oldValue.equals(newValue))) {
// mark the input control as changed
inputControl.setChanged(true);
// fire value changed events...
ValueChangeEvent e = new ValueChangeEvent(inputControl, inputControl.getAttributeName(), oldValue, newValue);
for (int i = 0; i < inputControl.getValueChangeListeners().length; i++)
inputControl.getValueChangeListeners()[i].valueChanged(e);
}
}
/**
* Method called when user right clicks with the mouse on the linked input control.
*/
private void showPopupMenu(final int x,final int y) {
try {
final Point tablexy=((JComponent)inputControl).getLocationOnScreen();
final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
removeAll();
final Object value = inputControl.getValue();
if (value!=null && copyAndPasteEnabled) {
// add "copy" menu item...
JMenuItem copyMenu = new JMenuItem(
ClientSettings.getInstance().getResources().getResource("copy"),
ClientSettings.getInstance().getResources().getResource("copymnemonic").charAt(0)
);
copyMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
copyToClipboard(value);
}
});
this.add(copyMenu);
}
if (inputControl.isEnabled()) {
if (copyAndPasteEnabled) {
JMenuItem cutMenu = new JMenuItem(
ClientSettings.getInstance().getResources().getResource("cut"),
ClientSettings.getInstance().getResources().getResource("cutmnemonic").charAt(0)
);
cutMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (copyToClipboard(value)) {
Object oldValue = inputControl.getValue();
inputControl.setValue(null);
maybeFireValueChangedEvent(oldValue,null);
}
}
});
this.add(cutMenu);
JMenuItem pasteMenu = new JMenuItem(
ClientSettings.getInstance().getResources().getResource("paste"),
ClientSettings.getInstance().getResources().getResource("pastemnemonic").charAt(0)
);
pasteMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Transferable content = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
if(content != null) {
try {
String data = (String) content.getTransferData(DataFlavor.stringFlavor);
if (data!=null && !data.equals("")) {
Object value = null;
if (inputControl instanceof CodLookupControl) {
if (((CodLookupControl)inputControl).isAllowOnlyNumbers())
value = new Double(data);
else
value = data;
}
else if (inputControl instanceof NumericControl) {
value = new Double(data);
}
else if (inputControl instanceof DateControl) {
SimpleDateFormat sdfdatetime = new SimpleDateFormat(ClientSettings.getInstance().getResources().getDateMask(Consts.TYPE_DATE_TIME));
value = sdfdatetime.parse(data);
}
else if (inputControl instanceof FormattedTextControl) {
value = data;
}
else if (inputControl instanceof TextControl) {
value = data;
}
else if (inputControl instanceof TextAreaControl) {
int pos = ((TextAreaControl)inputControl).getTextArea().getCaretPosition();
if (pos<0)
pos = 0;
value = ((TextAreaControl)inputControl).getTextArea().getText();
value =
(pos==0)?
(data+value):
(
pos==value.toString().length()-1?
value.toString().substring(0,pos)+data:
value.toString().substring(0,pos)+data+value.toString().substring(pos)
);
}
if (value!=null) {
Object oldValue = inputControl.getValue();
inputControl.setValue(value);
maybeFireValueChangedEvent(oldValue,value);
}
}
}
catch(Throwable ex) {
System.out.println("Couldn't get contents in format: " + DataFlavor.stringFlavor.getHumanPresentableName());
}
}
}
});
this.add(pasteMenu);
} // end if copyAndPasteEnabled
}
// if (this.getComponentCount()>0)
// this.add(new JSeparator());
if (this.getComponentCount()>0) {
int xOverflow = x+(int)tablexy.getX()+this.getWidth()-(int)screenSize.getWidth();
int yOverflow = y+(int)tablexy.getY()+this.getHeight()-(int)screenSize.getHeight();
int popupX = xOverflow>0?x-xOverflow-20:x;
int popupY = yOverflow>0?y-yOverflow-20:y;
this.show(((JComponent)inputControl),popupX,popupY);
}
}
catch (Throwable ex) {
Logger.error(this.getClass().getName(),"showPopupMenu","Error while constructing this menu.",ex);
ex.printStackTrace();
}
}
/**
* mouseClicked
*
* @param e MouseEvent
*/
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
showPopupMenu(e.getX(),e.getY());
}
else if (inputControl.isEnabled()) {
((JComponent)inputControl).requestFocus();
}
}
/**
* mouseEntered
*
* @param e MouseEvent
*/
public void mouseEntered(MouseEvent e) {
}
/**
* mouseExited
*
* @param e MouseEvent
*/
public void mouseExited(MouseEvent e) {
}
/**
* mousePressed
*
* @param e MouseEvent
*/
public void mousePressed(MouseEvent e) {
}
/**
* mouseReleased
*
* @param e MouseEvent
*/
public void mouseReleased(MouseEvent e) {
}
}