Index: org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.api/src/main/java/org/gvsig/tools/swing/api/ToolsSwingManager.java
===================================================================
--- org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.api/src/main/java/org/gvsig/tools/swing/api/ToolsSwingManager.java	(revision 2009)
+++ org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.api/src/main/java/org/gvsig/tools/swing/api/ToolsSwingManager.java	(revision 2010)
@@ -185,6 +185,10 @@
     public DropDown createDropDown(JComboBox combo);
     
     public DropDown createDropDown(JLabel label);
+
+    public DropDown createDropDown(AbstractButton button);
+
+    public DropDown createDropDown(JComponent component);
     
     /**
      * Contructor for creating a CompoundIcon where the icons are
Index: org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DropDownButton.java
===================================================================
--- org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DropDownButton.java	(revision 0)
+++ org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DropDownButton.java	(revision 2010)
@@ -0,0 +1,241 @@
+package org.gvsig.tools.swing.impl;
+
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import javax.swing.AbstractButton;
+import javax.swing.ComboBoxModel;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.UIManager;
+import org.apache.commons.lang3.StringUtils;
+import org.gvsig.tools.swing.api.DropDown;
+
+/**
+ *
+ * @author jjdelcerro
+ */
+@SuppressWarnings("UseSpecificCatch")
+public class DropDownButton implements DropDown {
+    
+    private final AbstractButton component;
+    private final Set<ItemListener> itemListeners;
+    private ComboBoxModel model;
+    private int selectedIndex;
+    private JPopupMenu popup;
+    private List<ImageIcon>icons;
+    private boolean readonly = false;
+    private Color disabledForeground = null;
+    private Color enabledForeground = null;
+    private boolean visibleDropdownArrow = true;
+    
+    
+    public DropDownButton(final AbstractButton button) {
+        this.component = button;
+        this.itemListeners = new HashSet<>();
+        this.component.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        this.component.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                doShowPopup();
+            }
+        });
+        this.icons=null;
+        String s = this.component.getText();
+        if( !s.endsWith(" \u25BE")) {
+            this.component.setText(s+" \u25BE");
+        }
+        this.component.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                doShowPopup();
+            }
+        });
+    }
+
+    @Override
+    public JComponent asJComponent() {
+        return this.component;
+    }
+    
+    @Override
+    public boolean isReadOnly() {
+        return this.readonly;
+    }
+    
+    @Override
+    public void setReadOnly(boolean readOnly) {
+        if( disabledForeground == null ) {
+            disabledForeground = UIManager.getColor("Button.disabledText");        
+            enabledForeground = UIManager.getColor("Button.foreground");        
+        }
+        
+        this.readonly = readOnly;
+        if( readOnly ) {
+            component.setForeground(disabledForeground);        
+        } else {
+            component.setForeground(enabledForeground);        
+        }
+    }
+
+    @Override
+    public void setVisibleDropdownArrow(boolean visible) {
+        this.visibleDropdownArrow = visible;
+        String s = this.component.getText();
+        if( this.visibleDropdownArrow ) {
+            if( !s.endsWith(" \u25BE")) {
+                this.component.setText(s+" \u25BE");
+            }
+        } else {
+            if( s.endsWith(" \u25BE")) {
+                this.component.setText(s.substring(0, s.length()-1));
+            }
+        }
+    }
+    
+    @Override
+    public boolean isVisibleDropdownArrow() {
+        return this.visibleDropdownArrow;
+    }
+    
+    @Override
+    public void setEnabled(boolean enabled) {
+        this.component.setEnabled(enabled);
+    }
+
+    private void doShowPopup() {
+        if (model == null) {
+            return;
+        }
+        this.popup = new JPopupMenu();
+        for (int i = 0; i < model.getSize(); i++) {
+            this.popup.add(this.createItem(i));
+        }
+        Point p = component.getLocationOnScreen();
+        popup.show(component, 0, component.getHeight());
+    }
+
+    @Override
+    public void setIcons(List<ImageIcon> icons) {
+        this.icons= icons;
+    }
+    
+    @Override
+    public List<ImageIcon> getIcons() {
+        return this.icons;
+    }
+    
+    private ImageIcon getIcon(int index) {
+        if( this.icons == null || index<0 || index>this.icons.size() ) {
+            return null;
+        }
+        return this.icons.get(index);
+    }
+    
+    private JMenuItem createItem(final int index) {
+        JMenuItem item = new JMenuItem(Objects.toString(model.getElementAt(index), ""));
+        item.setEnabled(!readonly);
+        item.setIcon(this.getIcon(index));
+        item.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if( readonly ) {
+                    return;
+                }
+                setSelectedIndex(index);
+                ItemEvent ie = new ItemEvent(DropDownButton.this, 1, index, ItemEvent.SELECTED);
+                for (ItemListener itemListener : itemListeners) {
+                    if (itemListener != null) {
+                        itemListener.itemStateChanged(ie);
+                    }
+                }
+            }
+        });
+        return item;
+    }
+
+    @Override
+    public void setModel(ComboBoxModel model) {
+        this.model = model;
+    }
+
+    @Override
+    public ComboBoxModel getModel() {
+        return this.model;
+    }
+
+    @Override
+    public void setSelectedIndex(int i) {
+        if( model == null ) {
+            return;
+        }
+        String value=null;
+        if( i<0 ) {
+            this.component.setToolTipText(null);
+        } else {
+            value = Objects.toString(this.model.getElementAt(i), "");
+            this.component.setToolTipText(value);
+        }
+        if( StringUtils.isBlank(value) ) {
+            value = "     ";
+        }
+        this.setText(value);
+        this.selectedIndex = i;
+    }
+
+    private void setText(String s) {
+        if( this.visibleDropdownArrow ) {
+            if( !s.endsWith(" \u25BE")) {
+                this.component.setText(s+" \u25BE");
+            }
+        } else {
+            if( s.endsWith(" \u25BE")) {
+                this.component.setText(s.substring(0, s.length()-1));
+            }
+        }
+    }
+   
+   @Override
+    public Object getSelectedItem() {
+        if( model == null ) {
+            return null;
+        }
+        return this.model.getElementAt(selectedIndex);
+    }
+
+    @Override
+    public int getSelectedIndex() {
+        return this.selectedIndex;
+    }
+
+    @Override
+    public Object[] getSelectedObjects() {
+        if( model == null ) {
+            return null;
+        }
+        return new Object[]{this.getSelectedItem()};
+    }
+
+    @Override
+    public void addItemListener(ItemListener itemListener) {
+        this.itemListeners.add(itemListener);
+    }
+
+    @Override
+    public void removeItemListener(ItemListener l) {
+        this.itemListeners.remove(l);
+    }
+    
+}
Index: org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DropDownLabel.java
===================================================================
--- org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DropDownLabel.java	(revision 2009)
+++ org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DropDownLabel.java	(revision 2010)
@@ -1,6 +1,7 @@
 package org.gvsig.tools.swing.impl;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Cursor;
 import java.awt.Point;
 import java.awt.event.ActionEvent;
@@ -9,10 +10,12 @@
 import java.awt.event.ItemListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.lang.reflect.Method;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import javax.swing.AbstractButton;
 import javax.swing.ComboBoxModel;
 import javax.swing.ImageIcon;
 import javax.swing.JComponent;
@@ -27,32 +30,36 @@
  *
  * @author jjdelcerro
  */
+@SuppressWarnings("UseSpecificCatch")
 public class DropDownLabel implements DropDown {
     
-    private final JLabel label;
+    private final JComponent component;
     private final Set<ItemListener> itemListeners;
     private ComboBoxModel model;
     private int selectedIndex;
     private JPopupMenu popup;
     private List<ImageIcon>icons;
     private boolean readonly = false;
-    private final JLabel arrow;
-
-    public DropDownLabel(final JLabel label) {
-        this.label = label;
+    private final JLabel arrow;    
+    private Color disabledForeground = null;
+    private Color enabledForeground = null;
+    
+    
+    public DropDownLabel(final JComponent component) {
+        this.component = component;
         this.itemListeners = new HashSet<>();
-        this.label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-        this.label.addMouseListener(new MouseAdapter() {
+        this.component.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        this.component.addMouseListener(new MouseAdapter() {
             @Override
             public void mouseClicked(MouseEvent e) {
                 doShowPopup();
             }
         });
         this.icons=null;
-        this.label.setLayout(new BorderLayout(2,0));
+        this.component.setLayout(new BorderLayout(2,0));
         // http://www.unicode.org/charts/PDF/U25A0.pdf
         this.arrow = new JLabel("\u25BE");
-        this.label.add(arrow, BorderLayout.EAST);
+        this.component.add(arrow, BorderLayout.EAST);
         this.arrow.setVisible(false);
         this.arrow.addMouseListener(new MouseAdapter() {
             @Override
@@ -64,7 +71,7 @@
 
     @Override
     public JComponent asJComponent() {
-        return this.label;
+        return this.component;
     }
     
     @Override
@@ -74,11 +81,20 @@
     
     @Override
     public void setReadOnly(boolean readOnly) {
+        if( disabledForeground == null ) {
+            disabledForeground = UIManager.getColor("Label.disabledForeground");        
+            enabledForeground = UIManager.getColor("Label.foreground");        
+            if( this.component instanceof AbstractButton ) {
+                disabledForeground = UIManager.getColor("Button.disabledText");        
+                enabledForeground = UIManager.getColor("Button.foreground");        
+            }       
+        }
+        
         this.readonly = readOnly;
         if( readOnly ) {
-            label.setForeground(UIManager.getColor("Label.disabledForeground"));        
+            component.setForeground(disabledForeground);        
         } else {
-            label.setForeground(UIManager.getColor("Label.foreground"));        
+            component.setForeground(enabledForeground);        
         }
     }
 
@@ -94,7 +110,7 @@
     
     @Override
     public void setEnabled(boolean enabled) {
-        this.label.setEnabled(enabled);
+        this.component.setEnabled(enabled);
         this.arrow.setEnabled(enabled);
     }
 
@@ -106,8 +122,8 @@
         for (int i = 0; i < model.getSize(); i++) {
             this.popup.add(this.createItem(i));
         }
-        Point p = label.getLocationOnScreen();
-        popup.show(label, 0, label.getHeight());
+        Point p = component.getLocationOnScreen();
+        popup.show(component, 0, component.getHeight());
     }
 
     @Override
@@ -166,19 +182,35 @@
         }
         String value=null;
         if( i<0 ) {
-            this.label.setToolTipText(null);
+            this.component.setToolTipText(null);
         } else {
             value = Objects.toString(this.model.getElementAt(i), "");
-            this.label.setToolTipText(value);
+            this.component.setToolTipText(value);
         }
         if( StringUtils.isBlank(value) ) {
             value = "     ";
         }
-        this.label.setText(value);
+        this.setText(value);
         this.selectedIndex = i;
     }
 
-    @Override
+    private void setText(String s) {
+        if( this.component instanceof JLabel ) {
+            ((JLabel)this.component).setText(s);
+        } else if( this.component instanceof AbstractButton ) {
+            ((AbstractButton)this.component).setText(s);
+        } else {
+            try {
+                Class<? extends JComponent> theClass = this.component.getClass();
+                Method method = theClass.getMethod("setText", String.class);
+                method.invoke(this.component, s);
+            } catch(Throwable th) {
+                // Ignore
+            }
+        } 
+    }
+   
+   @Override
     public Object getSelectedItem() {
         if( model == null ) {
             return null;
Index: org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DefaultToolsSwingManager.java
===================================================================
--- org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DefaultToolsSwingManager.java	(revision 2009)
+++ org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DefaultToolsSwingManager.java	(revision 2010)
@@ -527,6 +527,18 @@
     }
 
     @Override
+    public DropDown createDropDown(AbstractButton button) {
+        DropDown c = new DropDownButton(button);
+        return c;
+    }
+
+    @Override
+    public DropDown createDropDown(JComponent component) {
+        DropDown c = new DropDownLabel(component);
+        return c;
+    }
+
+    @Override
     public CompoundIcon createCompoundIcon(Icon... icons) {
         DefaultCompoundIcon i = new DefaultCompoundIcon(icons);
         return i;
