Delays the creation of the smileys menu displayed when the smiley button in the chat window format toolbar is clicked because it isn't always necessary and it's big.

cusax-fix
Lyubomir Marinov 16 years ago
parent 36846cdeae
commit bcfc4a3810

@ -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 sqware.
* 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(smileyItem.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);
}
}

@ -17,7 +17,6 @@
import net.java.sip.communicator.impl.gui.main.chat.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.swing.*;
/**
@ -75,8 +74,7 @@ public EditTextToolBar(ChatWritePanel writePanel)
this.initColorLabel();
this.smileysBox = new SmileysSelectorBox(
ImageLoader.getDefaultSmileysPack(), chatWritePanel);
this.smileysBox = new SmileysSelectorBox(chatWritePanel);
this.smileysBox.setName("smiley");
this.smileysBox.setToolTipText(GuiActivator.getResources()
@ -494,9 +492,6 @@ public SmileysSelectorBox getSmileysSelectorBox()
*/
public boolean hasSelectedMenus()
{
if(smileysBox.isMenuSelected())
return true;
return false;
return smileysBox.isMenuSelected();
}
}

Loading…
Cancel
Save