Fixes NullPointerExceptions and blank contactlist when UI is uninstalled and then installed(changing theme on windows).

cusax-fix
Damian Minkov 14 years ago
parent 187659e8b9
commit 036cab07fa

@ -29,6 +29,21 @@ public class SIPCommToolBar
{
private static final long serialVersionUID = 0L;
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
SIPCommToolBar.class.getName() + "ToolBarSeparatorUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
SIPCommToolBarSeparatorUI.class.getName());
}
/**
* Creates an instance of <tt>SIPCommToolBar</tt>.
*/
@ -40,9 +55,9 @@ public SIPCommToolBar() {
* Adds a separator to this toolbar. The separator is added after
* the last component in the toolbar.
*/
public void addSeparator() {
public void addSeparator()
{
JToolBar.Separator s = new JToolBar.Separator(new Dimension(8, 22));
s.setUI(new SIPCommToolBarSeparatorUI());
if (getOrientation() == VERTICAL) {
s.setOrientation(JSeparator.HORIZONTAL);
@ -67,4 +82,16 @@ protected void paintBorder(Graphics g) {
g2.drawImage(dragImage, 0, (this.getHeight() - dragImage
.getHeight(null)) / 2 - 2, null);
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}

@ -25,6 +25,8 @@
*/
public class SIPCommTreeUI
extends BasicTreeUI
implements HierarchyListener,
TreeSelectionListener
{
private static JTree tree;
@ -59,33 +61,71 @@ public void installUI(JComponent c)
tree = (JTree)c;
tree.getSelectionModel().addTreeSelectionListener(
new TreeSelectionListener()
{
public void valueChanged(TreeSelectionEvent e)
{
// Update cell size.
selectionChanged( e.getOldLeadSelectionPath(),
e.getNewLeadSelectionPath());
}
});
JViewport v = getFirstParentViewport(tree);
if(v != null)
this.parentViewport = v;
else
tree.addHierarchyListener(this);
tree.addHierarchyListener(new HierarchyListener()
{
public void hierarchyChanged(HierarchyEvent e)
{
if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED
&& (e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0
&& e.getChangedParent() instanceof JViewport)
{
parentViewport = (JViewport) e.getChangedParent();
}
}
});
tree.getSelectionModel().addTreeSelectionListener(this);
super.installUI(c);
}
/**
* Returns the first parent view port found.
* @param c the component parents we search
* @return the first parent view port found.
*/
private JViewport getFirstParentViewport(Container c)
{
if(c == null)
return null;
else
if(c instanceof JViewport)
return (JViewport)c;
else
return getFirstParentViewport(c.getParent());
}
/**
* On uninstalling the ui remove the listeners.
* @param c
*/
public void uninstallUI(JComponent c)
{
tree.getSelectionModel().clearSelection();
tree.getSelectionModel().removeTreeSelectionListener(this);
tree.removeHierarchyListener(this);
super.uninstallUI(c);
}
/**
* HierarchyListener's method.
* @param e the event.
*/
public void hierarchyChanged(HierarchyEvent e)
{
if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED
&& (e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0
&& e.getChangedParent() instanceof JViewport)
{
parentViewport = (JViewport) e.getChangedParent();
}
}
/**
* The TreeSelectionListener's method.
* @param e the event.
*/
public void valueChanged(TreeSelectionEvent e)
{
// Update cell size.
selectionChanged( e.getOldLeadSelectionPath(),
e.getNewLeadSelectionPath());
}
/**
* Installs the defaults of this UI.
*/

@ -12,6 +12,9 @@
import net.java.sip.communicator.util.swing.*;
import net.java.sip.communicator.util.swing.plaf.*;
import javax.swing.*;
import javax.swing.plaf.*;
/**
* The <tt>SearchTextFieldUI</tt> is the one responsible for the search field
* look & feel. It draws a search icon inside the field and adjusts the bounds
@ -89,4 +92,15 @@ protected Rectangle getVisibleEditorRect()
}
return null;
}
/**
* Creates a UI.
*
* @param c the text field
* @return the UI
*/
public static ComponentUI createUI(JComponent c)
{
return new DialPadFieldUI();
}
}

@ -315,10 +315,25 @@ public boolean dispatchKeyEvent(KeyEvent e)
/**
* A custom call field.
*/
private class CallField
private static class CallField
extends SIPCommTextField
implements Skinnable
{
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
CallField.class.getName() + "FieldUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
DialPadFieldUI.class.getName());
}
/**
* The text field ui.
*/
@ -333,11 +348,12 @@ public CallField(String text)
{
super(text);
textFieldUI = new DialPadFieldUI();
textFieldUI.setDeleteButtonEnabled(true);
if(getUI() instanceof DialPadFieldUI)
{
((DialPadFieldUI)getUI()).setDeleteButtonEnabled(true);
}
this.setPreferredSize(new Dimension(200, 23));
this.setUI(textFieldUI);
this.setBorder(null);
this.setOpaque(false);
@ -351,6 +367,11 @@ public CallField(String text)
*/
public void loadSkin()
{
if(getUI() instanceof SIPCommTextFieldUI)
textFieldUI = (SIPCommTextFieldUI)getUI();
else
return;
textFieldUI.loadSkin();
if (OSUtils.IS_MAC)
@ -366,5 +387,17 @@ public void loadSkin()
setCaretColor(Color.WHITE);
}
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}
}

@ -157,6 +157,21 @@ public void actionPerformed(ActionEvent e)
private static class SmileyMenuItem
extends JMenuItem
{
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
SmileyMenuItem.class.getName() + "TreeUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
SIPCommMenuItemUI.class.getName());
}
/**
* The <tt>Smiley</tt> depicted by this instance.
*/
@ -172,10 +187,20 @@ public SmileyMenuItem(Smiley smiley)
{
super(GuiActivator.getResources().getImage(smiley.getImageID()));
this.setUI(new SIPCommMenuItemUI());
this.smiley = smiley;
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}
/**

@ -35,6 +35,21 @@ public class DefaultTreeContactList
{
private static final long serialVersionUID = 0L;
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
DefaultTreeContactList.class.getName() + "TreeUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
SIPCommTreeUI.class.getName());
}
/**
* The cached selection event.
*/
@ -50,7 +65,6 @@ public class DefaultTreeContactList
*/
public DefaultTreeContactList()
{
this.setUI(new SIPCommTreeUI());
this.setBackground(Color.WHITE);
this.setDragEnabled(true);
this.setTransferHandler(new ContactListTransferHandler(this));
@ -236,4 +250,16 @@ public void loadSkin()
{
renderer.loadSkin();
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}

@ -31,14 +31,24 @@ public class SearchField
Skinnable
{
/**
* The main application window.
* Class id key used in UIDefaults.
*/
private final MainFrame mainFrame;
private static final String uiClassID =
SearchField.class.getName() + "FieldUI";
/**
* SearchFieldUI defs.
* Adds the ui class to UIDefaults.
*/
private final SearchFieldUI textFieldUI;
static
{
UIManager.getDefaults().put(uiClassID,
SearchFieldUI.class.getName());
}
/**
* The main application window.
*/
private final MainFrame mainFrame;
/**
* Creates the <tt>SearchField</tt>.
@ -51,9 +61,9 @@ public SearchField(MainFrame frame)
this.mainFrame = frame;
textFieldUI = new SearchFieldUI();
textFieldUI.setDeleteButtonEnabled(true);
this.setUI(textFieldUI);
if(getUI() instanceof SearchFieldUI)
((SearchFieldUI)getUI()).setDeleteButtonEnabled(true);
this.setBorder(null);
this.setOpaque(false);
@ -200,6 +210,19 @@ public void filterQuerySucceeded(FilterQuery query)
*/
public void loadSkin()
{
textFieldUI.loadSkin();
if(getUI() instanceof SearchFieldUI)
((SearchFieldUI)getUI()).loadSkin();
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}

@ -10,6 +10,7 @@
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.text.*;
import net.java.sip.communicator.impl.gui.*;
@ -29,7 +30,9 @@
*/
public class SearchFieldUI
extends SIPCommTextFieldUI
implements Skinnable
implements Skinnable,
MouseMotionListener,
MouseListener
{
/**
* The icon indicating that this is a search field.
@ -98,14 +101,23 @@ protected void installListeners()
if (isCallButtonEnabled)
{
getComponent().addMouseListener(
new TextFieldMouseListener());
getComponent().addMouseListener(this);
getComponent().addMouseMotionListener(
new TextFieldMouseMotionListener());
getComponent().addMouseMotionListener(this);
}
}
/**
* Uninstalls listeners for the UI.
*/
protected void uninstallListeners()
{
super.uninstallListeners();
getComponent().removeMouseListener(this);
getComponent().removeMouseMotionListener(this);
}
/**
* Implements parent paintSafely method and enables antialiasing.
* @param g the <tt>Graphics</tt> object that notified us
@ -193,66 +205,52 @@ protected Rectangle getVisibleEditorRect()
}
/**
* The <tt>MouseListener</tt> that listens for mouse events in order to
* update the delete icon.
* Updates the call button when the mouse was clicked.
* @param e the <tt>MouseEvent</tt> that notified us of the click
*/
protected class TextFieldMouseListener implements MouseListener
public void mouseClicked(MouseEvent e)
{
/**
* Updates the call button when the mouse was clicked.
* @param e the <tt>MouseEvent</tt> that notified us of the click
*/
public void mouseClicked(MouseEvent e)
{
updateCallIcon(e);
}
updateCallIcon(e);
}
/**
* Updates the call button when the mouse is enters the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseEntered(MouseEvent e)
{
updateCallIcon(e);
}
/**
* Updates the call button when the mouse is enters the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseEntered(MouseEvent e)
{
updateCallIcon(e);
}
/**
* Updates the call button when the mouse exits the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseExited(MouseEvent e)
{
updateCallIcon(e);
}
/**
* Updates the call button when the mouse exits the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseExited(MouseEvent e)
{
updateCallIcon(e);
}
public void mousePressed(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}
public void mouseReleased(MouseEvent e) {}
/**
* The <tt>MouseMotionListener</tt> that listens for mouse events in order
* to update the delete icon.
* Updates the delete icon when the mouse is dragged over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
protected class TextFieldMouseMotionListener implements MouseMotionListener
public void mouseDragged(MouseEvent e)
{
/**
* Updates the delete icon when the mouse is dragged over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseDragged(MouseEvent e)
{
updateCallIcon(e);
}
updateCallIcon(e);
}
/**
* Updates the delete icon when the mouse is moved over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseMoved(MouseEvent e)
{
updateCallIcon(e);
}
/**
* Updates the delete icon when the mouse is moved over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseMoved(MouseEvent e)
{
updateCallIcon(e);
}
/**
@ -350,4 +348,15 @@ public void loadSkin()
.getImage();
}
}
/**
* Creates a UI for a SearchFieldUI.
*
* @param c the text field
* @return the UI
*/
public static ComponentUI createUI(JComponent c)
{
return new SearchFieldUI();
}
}

@ -40,6 +40,21 @@ public class AccountStatusPanel
AvatarListener,
Skinnable
{
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
AccountStatusPanel.class.getName() + "OpaquePanelUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
SIPCommOpaquePanelUI.class.getName());
}
/**
* The desired height of the avatar.
*/
@ -120,9 +135,6 @@ public AccountStatusPanel(MainFrame mainFrame)
{
super(new BorderLayout(10, 0));
if (ConfigurationManager.isTransparentWindowEnabled())
this.setUI(new SIPCommOpaquePanelUI());
FramedImageWithMenu imageWithMenu
= new FramedImageWithMenu(
mainFrame,
@ -596,4 +608,19 @@ public void serverStoredDetailsChanged(ServerStoredDetailsChangeEvent evt)
accountNameLabel.setText(accountName);
}
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
if(ConfigurationManager.isTransparentWindowEnabled())
return uiClassID;
else
return super.getUIClassID();
}
}

@ -43,6 +43,21 @@ public class GlobalStatusSelectorBox
extends StatusSelectorMenu
implements ActionListener
{
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
GlobalStatusSelectorBox.class.getName() + "StatusMenuUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
SIPCommStatusMenuUI.class.getName());
}
/**
* The indent of the image.
*/
@ -151,8 +166,6 @@ public GlobalStatusSelectorBox(MainFrame mainFrame)
this.addSeparator();
this.setUI(new SIPCommStatusMenuUI());
this.setFont(titleLabel.getFont().deriveFont(Font.PLAIN, 11f));
this.setIcon(offlineItem.getIcon());
this.setIconTextGap(2);
@ -1007,4 +1020,16 @@ public void loadSkin()
updateGlobalStatus();
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}

@ -10,6 +10,7 @@
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.metal.*;
import net.java.sip.communicator.util.*;
@ -26,6 +27,21 @@ public class ExtendedTooltip
private static final Logger logger
= Logger.getLogger(ExtendedTooltip.class);
/**
* Class id key used in UIDefaults.
*/
private static final String uiClassID =
ExtendedTooltip.class.getName() + "ToolTipUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
ImageToolTipUI.class.getName());
}
private final JLabel imageLabel = new JLabel();
private final JLabel titleLabel = new JLabel();
@ -48,8 +64,6 @@ public ExtendedTooltip(final Window parentWindow, boolean isListViewEnabled)
{
this.isListViewEnabled = isListViewEnabled;
this.setUI(new ImageToolTipUI());
this.setLayout(new BorderLayout());
JPanel mainPanel = new JPanel(new BorderLayout(5, 5));
@ -289,8 +303,20 @@ private void recalculateTooltipSize(int newTextWidth, int newTextHeight)
/**
* Customized UI for this MetaContactTooltip.
*/
private class ImageToolTipUI extends MetalToolTipUI
public static class ImageToolTipUI extends MetalToolTipUI
{
static ImageToolTipUI sharedInstance = new ImageToolTipUI();
/**
* Creates the UI.
* @param c
* @return
*/
public static ComponentUI createUI(JComponent c)
{
return sharedInstance;
}
/**
* Overwrite the UI paint method to do nothing in order fix double
* painting of the tooltip text.
@ -309,6 +335,9 @@ public void paint(Graphics g, JComponent c)
@Override
public void update(Graphics g, JComponent c)
{
JTextArea bottomTextArea =
((ExtendedTooltip)c).bottomTextArea;
String bottomText = bottomTextArea.getText();
if(bottomText == null || bottomText.length() <= 0)
bottomTextArea.setVisible(false);
@ -325,40 +354,56 @@ public void update(Graphics g, JComponent c)
@Override
public Dimension getPreferredSize(JComponent c)
{
Icon icon = imageLabel.getIcon();
ExtendedTooltip tooltip = (ExtendedTooltip)c;
Icon icon = tooltip.imageLabel.getIcon();
int width = 0;
if (icon != null)
width += icon.getIconWidth();
if (isListViewEnabled)
width += textWidth + 15;
if (tooltip.isListViewEnabled)
width += tooltip.textWidth + 15;
else
width = textWidth > width ? textWidth : width;
width = tooltip.textWidth > width ? tooltip.textWidth : width;
int imageHeight = 0;
if (icon != null)
imageHeight = icon.getIconHeight();
int height = 0;
if (isListViewEnabled)
if (tooltip.isListViewEnabled)
{
height = imageHeight > textHeight ? imageHeight : textHeight;
height = imageHeight > tooltip.textHeight
? imageHeight : tooltip.textHeight;
}
else
height = imageHeight + textHeight;
height = imageHeight + tooltip.textHeight;
String bottomText = bottomTextArea.getText();
String bottomText = tooltip.bottomTextArea.getText();
if(bottomText != null && bottomText.length() > 0)
{
// Seems a little messy, but sets the proper size.
bottomTextArea.setColumns(5);
bottomTextArea.setSize(0,0);
bottomTextArea.setSize(bottomTextArea.getPreferredSize());
tooltip.bottomTextArea.setColumns(5);
tooltip.bottomTextArea.setSize(0,0);
tooltip.bottomTextArea.setSize(
tooltip.bottomTextArea.getPreferredSize());
height += bottomTextArea.getPreferredSize().height;
height += tooltip.bottomTextArea.getPreferredSize().height;
}
return new Dimension(width, height);
}
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
}

@ -49,7 +49,22 @@ public class AboutWindow
*/
private static AboutWindow aboutWindow;
private final SIPCommTextFieldUI textFieldUI;
/**
* Class id key used in UIDefaults for the version label.
*/
private static final String uiClassID =
AboutWindow.class.getName() + "$VersionTextFieldUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(uiClassID,
SIPCommTextFieldUI.class.getName());
}
private final JTextField versionLabel;
/**
* Shows a <code>AboutWindow</code> creating it first if necessary. The
@ -122,13 +137,24 @@ public AboutWindow(Frame owner)
titleLabel.setAlignmentX(Component.RIGHT_ALIGNMENT);
}
JTextField versionLabel
= new JTextField(" "
+ System.getProperty("sip-communicator.version"));
// Force the use of the custom text field UI in order to fix an
// incorrect rendering on Ubuntu.
textFieldUI = new SIPCommTextFieldUI();
versionLabel.setUI(textFieldUI);
versionLabel
= new JTextField(" "
+ System.getProperty("sip-communicator.version"))
{
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return uiClassID;
}
};
versionLabel.setBorder(null);
versionLabel.setOpaque(false);
@ -246,7 +272,8 @@ public AboutWindow(Frame owner)
*/
public void loadSkin()
{
textFieldUI.loadSkin();
if(versionLabel.getUI() instanceof Skinnable)
((Skinnable)versionLabel.getUI()).loadSkin();
}
/**

@ -21,7 +21,19 @@ public class SIPCommLinkButton
{
private static final long serialVersionUID = 1L;
/**
* Class id key used in UIDefaults.
*/
private static final String UIClassID = "LinkButtonUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(UIClassID,
SIPCommLinkButtonUI.class.getName());
}
public static final int ALWAYS_UNDERLINE = 0;
@ -77,10 +89,7 @@ public SIPCommLinkButton(URL url)
public SIPCommLinkButton(String text, URL url)
{
super(text);
// Define UI
this.setUI(SIPCommLinkButtonUI.createUI(this));
UIManager.getDefaults().put("LinkButtonUI", "SIPCommLinkButtonUI");
linkBehavior = SIPCommLinkButton.HOVER_UNDERLINE;
linkColor = Color.blue;
@ -96,12 +105,6 @@ public SIPCommLinkButton(String text, URL url)
this.setRolloverEnabled(true);
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
@Override
public void updateUI()
{
this.setUI(SIPCommLinkButtonUI.createUI(this));
}
public String getUIClassID()
{

@ -27,6 +27,20 @@ public class SIPCommMenuBar
*/
private static final long serialVersionUID = 0L;
/**
* Class id key used in UIDefaults.
*/
private static final String UIClassID = "SIPCommMenuBarUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(UIClassID,
SIPCommMenuBarUI.class.getName());
}
/**
* Creates an instance of <tt>SIPCommMenuBar</tt>.
*/
@ -41,6 +55,17 @@ public SIPCommMenuBar()
public void loadSkin()
{
this.setBorder(BorderFactory.createEmptyBorder());
this.setUI(new SIPCommMenuBarUI());
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return UIClassID;
}
}

@ -42,6 +42,20 @@ public class SIPCommTabbedPane
*/
private static final long serialVersionUID = 0L;
/**
* Class id key used in UIDefaults.
*/
private static final String UIClassID = "SIPCommTabbedPaneEnhancedUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(UIClassID,
SIPCommTabbedPaneEnhancedUI.class.getName());
}
private int overTabIndex = -1;
private int lastSelectedIndex;
@ -72,8 +86,6 @@ public SIPCommTabbedPane(boolean closingTabs, boolean maximizingTabs)
new Color(UtilActivator.getResources()
.getColor("service.gui.TAB_TITLE")));
this.setUI(new SIPCommTabbedPaneEnhancedUI());
if(closingTabs)
this.setCloseIcon(true);
@ -510,4 +522,16 @@ public void loadSkin()
((SIPCommTabbedPaneEnhancedUI)this.getUI()).loadSkin();
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return UIClassID;
}
}

@ -29,6 +29,20 @@ public class SIPCommTextButton extends JButton
*/
private static final long serialVersionUID = 0L;
/**
* Class id key used in UIDefaults.
*/
private static final String UIClassID = "BasicButtonUI";
/**
* Adds the ui class to UIDefaults.
*/
static
{
UIManager.getDefaults().put(UIClassID,
BasicButtonUI.class.getName());
}
private final float[] borderColor
= Color.DARK_GRAY.getRGBComponents(null);
@ -70,7 +84,6 @@ public SIPCommTextButton(String text, Image bgImage)
* and feel.
*/
this.setContentAreaFilled(false);
this.setUI(new BasicButtonUI());
}
public void setBgImage(Image image)
@ -152,6 +165,18 @@ private void internalPaintComponent(Graphics2D g)
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/
public String getUIClassID()
{
return UIClassID;
}
/**
* The <tt>ButtonRepaintCallback</tt> is charged to repaint this button
* when the fade animation is performed.

@ -8,6 +8,8 @@
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.metal.*;
import javax.swing.text.*;
@ -23,7 +25,9 @@
*/
public class SIPCommTextFieldUI
extends MetalTextFieldUI
implements Skinnable
implements Skinnable,
MouseMotionListener,
MouseListener
{
/**
* Indicates if the mouse is currently over the delete button.
@ -127,11 +131,20 @@ protected void installListeners()
{
super.installListeners();
getComponent().addMouseListener(
new TextFieldMouseListener());
getComponent().addMouseListener(this);
getComponent().addMouseMotionListener(
new TextFieldMouseMotionListener());
getComponent().addMouseMotionListener(this);
}
/**
* Uninstalls listeners for the UI.
*/
protected void uninstallListeners()
{
super.uninstallListeners();
getComponent().removeMouseListener(this);
getComponent().removeMouseMotionListener(this);
}
/**
@ -381,71 +394,58 @@ public void loadSkin()
}
/**
* The <tt>MouseListener</tt> that listens for mouse events in order to
* update the delete icon.
* Updates the delete icon when the mouse was clicked.
* @param e the <tt>MouseEvent</tt> that notified us of the click
*/
protected class TextFieldMouseListener implements MouseListener
public void mouseClicked(MouseEvent e)
{
/**
* Updates the delete icon when the mouse was clicked.
* @param e the <tt>MouseEvent</tt> that notified us of the click
*/
public void mouseClicked(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
updateDeleteIcon(e);
updateCursor(e);
}
/**
* Updates the delete icon when the mouse is enters the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseEntered(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
/**
* Updates the delete icon when the mouse is enters the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseEntered(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
/**
* Updates the delete icon when the mouse exits the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseExited(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
/**
* Updates the delete icon when the mouse exits the component area.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseExited(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
public void mousePressed(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}
/**
* The <tt>MouseMotionListener</tt> that listens for mouse events in order
* to update the delete icon.
* Updates the delete icon when the mouse is dragged over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
protected class TextFieldMouseMotionListener implements MouseMotionListener
public void mouseDragged(MouseEvent e)
{
/**
* Updates the delete icon when the mouse is dragged over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseDragged(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
updateDeleteIcon(e);
updateCursor(e);
}
/**
* Updates the delete icon when the mouse is moved over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseMoved(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
/**
* Updates the delete icon when the mouse is moved over.
* @param e the <tt>MouseEvent</tt> that notified us
*/
public void mouseMoved(MouseEvent e)
{
updateDeleteIcon(e);
updateCursor(e);
}
private void updateCursor(MouseEvent mouseEvent)
@ -457,4 +457,15 @@ private void updateCursor(MouseEvent mouseEvent)
Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
}
}
/**
* Creates a UI for a SIPCommTextFieldUI.
*
* @param c the text field
* @return the UI
*/
public static ComponentUI createUI(JComponent c)
{
return new SIPCommTextFieldUI();
}
}
Loading…
Cancel
Save