@ -10,6 +10,7 @@
import java.util.* ;
import javax.swing.* ;
import javax.swing.event.* ;
import net.java.sip.communicator.impl.gui.* ;
import net.java.sip.communicator.impl.gui.customcontrols.* ;
@ -22,37 +23,28 @@
* smiley icon to send .
*
* @author Yana Stamcheva
* @author Lubomir Marinov
* /
public class SmileysSelectorBox
extends SIPCommMenuBar
implements ActionListener ,
MouseListener
implements ActionListener ,
MouseListener ,
PopupMenuListener
{
private final ChatWritePanel chatWritePanel ;
private final Hashtable < JMenuItem , Smiley > smileysList
= new Hashtable < JMenuItem , Smiley > ( ) ;
private int gridRowCount = 0 ;
private int gridColCount = 0 ;
private final SIPCommMenu selectorBox = new SIPCommMenu ( ) ;
private final GridBagConstraints gridBagConstraints
= new GridBagConstraints ( ) ;
private final JLabel smileyTextLabel = new JLabel ( ) ;
private final JLabel smileyDescriptionLabel = new JLabel ( ) ;
/ * *
* Creates an instance of this < tt > SmileysSelectorBox < / tt > and initializes
* the panel with the smiley icons given by the incoming imageList .
* Initializes a new < tt > SmileysSelectorBox < / tt > instance .
*
* @param imageList The pack of smiley icons .
* @param writePanel the < tt > ChatWritePanel < / tt > the new instance is to
* write the selected < tt > Smiley < / tt > into when it is clicked
* /
public SmileysSelectorBox ( Collection < Smiley > imageList ,
ChatWritePanel writePanel )
public SmileysSelectorBox ( ChatWritePanel writePanel )
{
this . chatWritePanel = writePanel ;
@ -65,52 +57,29 @@ public SmileysSelectorBox(Collection<Smiley> imageList,
this . selectorBox . setIcon ( new ImageIcon ( ImageLoader
. getImage ( ImageLoader . SMILIES_ICON ) ) ) ;
this . calculateGridDimensions ( imageList . size ( ) ) ;
JPopupMenu popupMenu = this . selectorBox . getPopupMenu ( ) ;
popupMenu . setLayout ( new GridBagLayout ( ) ) ;
popupMenu . setBackground ( Color . WHITE ) ;
int count = 0 ;
for ( Smiley smiley : imageList )
{
this . addSmileyToGrid ( smiley , count ) ;
count + + ;
}
smileyTextLabel . setPreferredSize ( new Dimension ( 50 , 25 ) ) ;
smileyTextLabel . setBorder (
BorderFactory . createEmptyBorder ( 0 , 0 , 0 , 5 ) ) ;
smileyDescriptionLabel . setBorder (
BorderFactory . createEmptyBorder ( 0 , 5 , 0 , 0 ) ) ;
gridBagConstraints . fill = GridBagConstraints . HORIZONTAL ;
gridBagConstraints . gridx = 0 ;
gridBagConstraints . gridy = gridRowCount ;
gridBagConstraints . gridwidth = gridColCount ;
popupMenu . add ( smileyDescriptionLabel , gridBagConstraints ) ;
gridBagConstraints . fill = GridBagConstraints . HORIZONTAL ;
gridBagConstraints . gridx = gridColCount / 2 ;
gridBagConstraints . gridy = gridRowCount ;
smileyTextLabel . setHorizontalAlignment ( SwingConstants . RIGHT ) ;
popupMenu . add ( smileyTextLabel , gridBagConstraints ) ;
/ *
* Load the smileys and the UI which represents them on demand because
* they are not always necessary .
* /
popupMenu . addPopupMenuListener ( this ) ;
this . add ( selectorBox ) ;
}
/ * *
* In order to have a popup which is at the form closest to sq w are.
* In order to have a popup which is at the form closest to square .
*
* @param itemsCount the count of items that will be laied out .
* @param itemsCount the count of items that will be laid out .
* @return the dimensions of the grid
* /
private void calculateGridDimensions ( int itemsCount )
private Dimension calculateGridDimensions ( int itemsCount )
{
this . gridRowCount = ( int ) Math . round ( Math . sqrt ( itemsCount ) ) ;
int gridRowCount = ( int ) Math . round ( Math . sqrt ( itemsCount ) ) ;
/ *
* FIXME The original code was "(int)Math.ceil(itemsCount/gridRowCount)" .
@ -118,35 +87,9 @@ private void calculateGridDimensions(int itemsCount)
* integers and , consequently , itemsCount / gridRowCount gives an integer .
* Was the intention to have the division produce a real number ?
* /
this . gridColCount = itemsCount / gridRowCount ;
}
/ * *
* Adds the given smiley to the grid of the selector box popup menu .
*
* @param smiley the smiley to add
* @param smileyIndex the index of the smiley in the table
* /
private void addSmileyToGrid ( Smiley smiley ,
int smileyIndex )
{
ImageIcon imageIcon =
new ImageIcon ( ImageLoader . getImage ( smiley . getImageID ( ) ) ) ;
SmileyMenuItem smileyItem = new SmileyMenuItem ( imageIcon ) ;
int gridColCount = itemsCount / gridRowCount ;
smileyItem . setPreferredSize ( new Dimension ( 36 , 36 ) ) ;
smileyItem . addActionListener ( this ) ;
smileyItem . addMouseListener ( this ) ;
gridBagConstraints . anchor = GridBagConstraints . EAST ;
gridBagConstraints . gridx = smileyIndex % gridColCount ;
gridBagConstraints . gridy = smileyIndex % gridRowCount ;
selectorBox . getPopupMenu ( ) . add ( smileyItem , gridBagConstraints ) ;
smileysList . put ( smileyItem , smiley ) ;
return new Dimension ( gridColCount , gridRowCount ) ;
}
/ * *
@ -173,15 +116,14 @@ public boolean isMenuSelected()
* /
public void actionPerformed ( ActionEvent e )
{
JMenuItem smileyItem = ( JMenuItem ) e . getSource ( ) ;
Smiley smiley = smileysList . get ( smileyItem ) ;
SmileyMenuItem smileyItem = ( SmileyMenuItem ) e . getSource ( ) ;
Smiley smiley = smileyItem . smiley ;
chatWritePanel . appendText ( smiley . getSmileyStrings ( ) [ 0 ] ) ;
chatWritePanel . getEditorPane ( ) . requestFocus ( ) ;
clearMouseOverEffects ( smileyItem , smiley );
clearMouseOverEffects ( smileyItem );
}
/ * *
@ -208,12 +150,27 @@ public void paintComponent(Graphics g)
/ * *
* A custom menu item , which paints round border over selection .
* /
private class SmileyMenuItem extends JMenuItem
private static class SmileyMenuItem
extends JMenuItem
{
public SmileyMenuItem ( Icon imageIcon )
/ * *
* The < tt > Smiley < / tt > depicted by this instance .
* /
public final Smiley smiley ;
/ * *
* Initializes a new < tt > SmileyMenuItem < / tt > instance which is to depict
* a specific < tt > Smiley < / tt > .
*
* @param smiley the < tt > Smiley < / tt > to be depicted by the new instance
* /
public SmileyMenuItem ( Smiley smiley )
{
super ( imageIcon ) ;
super ( new ImageIcon ( ImageLoader . getImage ( smiley . getImageID ( ) ) ) ) ;
this . setUI ( new SIPCommMenuItemUI ( ) ) ;
this . smiley = smiley ;
}
}
@ -223,9 +180,8 @@ public SmileyMenuItem(Icon imageIcon)
* /
public void mouseEntered ( MouseEvent e )
{
JMenuItem smileyItem = ( JMenuItem ) e . getSource ( ) ;
Smiley smiley = smileysList . get ( smileyItem ) ;
SmileyMenuItem smileyItem = ( SmileyMenuItem ) e . getSource ( ) ;
Smiley smiley = smileyItem . smiley ;
ImageIcon imageIcon
= GuiActivator . getResources ( ) . getImage ( smiley . getImageID ( ) . getId ( ) ) ;
@ -240,20 +196,22 @@ public void mouseEntered(MouseEvent e)
* /
public void mouseExited ( MouseEvent e )
{
JMenuItem smileyItem = ( JMenuItem ) e . getSource ( ) ;
Smiley smiley = smileysList . get ( smileyItem ) ;
SmileyMenuItem smileyItem = ( SmileyMenuItem ) e . getSource ( ) ;
this . clearMouseOverEffects ( smileyItem , smiley );
this . clearMouseOverEffects ( smileyItem );
}
public void mouseClicked ( MouseEvent e )
{ }
{
}
public void mousePressed ( MouseEvent e )
{ }
{
}
public void mouseReleased ( MouseEvent e )
{ }
{
}
/ * *
* Clears all mouse over effects for the given smiley item . This method
@ -262,13 +220,92 @@ public void mouseReleased(MouseEvent e)
*
* @param smileyItem the item for which we clear mouse over effects .
* /
private void clearMouseOverEffects ( JMenuItem smileyItem , Smiley smiley )
private void clearMouseOverEffects ( SmileyMenuItem smileyItem )
{
ImageIcon imageIcon =
new ImageIcon ( ImageLoader . getImage ( smiley . getImageID ( ) ) ) ;
new ImageIcon ( ImageLoader . getImage ( smiley Item. smiley . getImageID ( ) ) ) ;
smileyItem . setIcon ( imageIcon ) ;
smileyTextLabel . setText ( "" ) ;
smileyDescriptionLabel . setText ( "" ) ;
}
/ *
* Implements PopupMenuListener # popupMenuCanceled ( PopupMenuEvent ) . Does
* nothing .
* /
public void popupMenuCanceled ( PopupMenuEvent e )
{
}
/ *
* Implements
* PopupMenuListener # popupMenuWillBecomeInvisible ( PopupMenuEvent ) . Does
* nothing .
* /
public void popupMenuWillBecomeInvisible ( PopupMenuEvent e )
{
}
/ *
* Implements PopupMenuListener # popupMenuWillBecomeVisible ( PopupMenuEvent ) .
* Loads the smileys and creates the UI to represent them when they are
* first necessary .
* /
public void popupMenuWillBecomeVisible ( PopupMenuEvent e )
{
JPopupMenu popupMenu = ( JPopupMenu ) e . getSource ( ) ;
// Don't populate it again if it's already populated.
if ( popupMenu . getComponentIndex ( smileyTextLabel ) ! = - 1 )
return ;
Collection < Smiley > imageList = ImageLoader . getDefaultSmileysPack ( ) ;
Dimension gridDimensions
= this . calculateGridDimensions ( imageList . size ( ) ) ;
int gridColCount = gridDimensions . width ;
int gridRowCount = gridDimensions . height ;
GridBagConstraints gridBagConstraints = new GridBagConstraints ( ) ;
int smileyIndex = 0 ;
for ( Smiley smiley : imageList )
{
SmileyMenuItem smileyItem = new SmileyMenuItem ( smiley ) ;
smileyItem . setPreferredSize ( new Dimension ( 36 , 36 ) ) ;
smileyItem . addActionListener ( this ) ;
smileyItem . addMouseListener ( this ) ;
gridBagConstraints . anchor = GridBagConstraints . EAST ;
gridBagConstraints . gridx = smileyIndex % gridColCount ;
gridBagConstraints . gridy = smileyIndex % gridRowCount ;
popupMenu . add ( smileyItem , gridBagConstraints ) ;
smileyIndex + + ;
}
smileyDescriptionLabel . setBorder (
BorderFactory . createEmptyBorder ( 0 , 5 , 0 , 0 ) ) ;
gridBagConstraints . fill = GridBagConstraints . HORIZONTAL ;
gridBagConstraints . gridx = 0 ;
gridBagConstraints . gridy = gridRowCount ;
gridBagConstraints . gridwidth = gridColCount ;
popupMenu . add ( smileyDescriptionLabel , gridBagConstraints ) ;
smileyTextLabel . setBorder (
BorderFactory . createEmptyBorder ( 0 , 0 , 0 , 5 ) ) ;
smileyTextLabel . setHorizontalAlignment ( SwingConstants . RIGHT ) ;
smileyTextLabel . setPreferredSize ( new Dimension ( 50 , 25 ) ) ;
gridBagConstraints . fill = GridBagConstraints . HORIZONTAL ;
gridBagConstraints . gridx = gridColCount / 2 ;
gridBagConstraints . gridy = gridRowCount ;
popupMenu . add ( smileyTextLabel , gridBagConstraints ) ;
}
}