1 19 20 28 29 package org.netbeans.modules.xml.schema.abe; 30 31 import java.awt.Color ; 32 import java.awt.Component ; 33 import java.awt.Dimension ; 34 import java.awt.Font ; 35 import java.awt.FontMetrics ; 36 import java.awt.Graphics ; 37 import java.awt.Rectangle ; 38 import java.awt.event.FocusEvent ; 39 import java.awt.event.FocusListener ; 40 import java.awt.event.HierarchyEvent ; 41 import java.awt.event.HierarchyListener ; 42 import java.awt.event.KeyAdapter ; 43 import java.awt.event.KeyEvent ; 44 import java.awt.event.MouseAdapter ; 45 import java.awt.event.MouseEvent ; 46 import javax.swing.JComponent ; 47 import javax.swing.JLabel ; 48 import javax.swing.JPanel ; 49 import javax.swing.JScrollPane ; 50 import javax.swing.JTextField ; 51 import javax.swing.SwingConstants ; 52 import javax.swing.SwingUtilities ; 53 import org.openide.util.NbBundle; 54 55 59 public class InplaceEditableLabel extends JLabel { 60 private static final long serialVersionUID = 7526472295622776147L; 61 boolean editMode = false; 62 public static final String PROPERTY_MODE_CHANGE = "PROPERTY_MODE_CHANGE"; 63 public enum Mode{ 64 EDIT, NORMAL 65 }; 66 boolean mouseOverMe = false; 67 boolean altKeyPressed = false; 68 private Color mouseOverColor; 69 private JComponent editorComponent; 70 JPanel glass; 71 73 public InplaceEditableLabel() { 74 super(); 75 setForeground(Color.BLUE); 76 setMouseOverColor(getForeground()); 77 setToolTipText(NbBundle.getMessage(InplaceEditableLabel.class, 78 "TTP_DEFAULT_INPLACE_EDIT")); 79 initialize(); 80 } 81 82 public InplaceEditableLabel(String str){ 83 this(); 84 super.setText(str); 85 } 86 87 public JScrollPane getScrollPane() { 88 return ((ABEBaseDropPanel) this.getParent()).context.getInstanceDesignerScrollPane(); 89 } 90 91 void initialize(){ 92 addMouseListener(new MouseAdapter (){ 93 public void mouseClicked(MouseEvent e) { 94 if( ( (e.isShiftDown() && (e.getClickCount() == 1) ) || 96 (e.getClickCount() > 1)) ){ 97 showEditor(); 99 }else if(drewLine){ 100 if(ctrlClickHandler != null) 102 ctrlClickHandler.handleCtrlClick(); 103 }else{ 104 InplaceEditableLabel.this.getParent().dispatchEvent(e); 105 } 106 } 107 108 public void mouseEntered(MouseEvent e) { 109 super.mouseEntered(e); 110 115 repaint(); 116 InplaceEditableLabel.this.getParent().dispatchEvent(e); 117 } 118 119 public void mouseExited(MouseEvent e) { 120 super.mouseExited(e); 121 124 InplaceEditableLabel.this.getParent().dispatchEvent(e); 125 } 126 127 public void mouseReleased(MouseEvent e) { 128 if(!drewLine) 129 InplaceEditableLabel.this.getParent().dispatchEvent(e); 130 } 131 132 public void mousePressed(MouseEvent e) { 133 if(!drewLine) 134 InplaceEditableLabel.this.getParent().dispatchEvent(e); 135 } 136 137 }); 138 } 139 140 boolean drewLine = false; 141 protected void paintComponent(Graphics g) { 142 drewLine = false; 143 if(mouseOverMe && altKeyPressed && (ctrlClickHandler != null) ){ 144 Color origC = getForeground(); 146 Font origF = getFont(); 147 setForeground(getMouseOverColor()); 148 Rectangle bounds = g.getClipBounds(); 150 super.paintComponent(g); 151 g.setColor(getMouseOverColor()); 152 int width = SwingUtilities.computeStringWidth(getFontMetrics(getFont()), getText()); 153 g.drawLine(bounds.x, bounds.y + bounds.height -1, 154 bounds.x + width, bounds.y + bounds.height -1); 155 setForeground(origC); 156 setFont(origF); 157 drewLine = true; 158 }else{ 159 super.paintComponent(g); 160 } 161 } 162 163 public Color getMouseOverColor() { 164 return mouseOverColor; 165 } 166 167 public void setMouseOverColor(Color mouseOverColor) { 168 this.mouseOverColor = mouseOverColor; 169 } 170 171 public void setText(String str){ 172 super.setText(str); 173 Font font = getFont(); 174 if(font != null){ 175 FontMetrics fm = getFontMetrics(font); 176 int width = SwingUtilities.computeStringWidth(fm, str); 177 setPreferredSize(new Dimension (width, getPreferredSize().height)); 178 } 179 if(editMode){ 180 hideEditor(); 182 } 183 } 184 185 public void showEditor(){ 186 firePropertyChange(PROPERTY_MODE_CHANGE, Mode.NORMAL, Mode.EDIT); 187 if((editorComponent == null) && (editInfoString == null)) 188 return; 189 190 editMode = true; 191 192 glass = NBGlassPaneAccessSupport.getNBGlassPane(this); 194 if(glass == null) 195 return; 196 if(editorComponent != null){ 197 Rectangle rect = SwingUtilities.convertRectangle(this.getParent(), 198 this.getBounds(), glass); 199 glass.add(editorComponent); 200 rect.width = this.getMinimumSize().width * wMagFactor + 5; 201 rect.height += 7; 202 editorComponent.setBounds(rect); 203 } 204 addInfoLabel(); 205 glass.setVisible(true); 206 207 208 if(editorComponent != null){ 209 editorComponent.addKeyListener(new KeyAdapter () { 210 public void keyTyped(KeyEvent e) { 211 super.keyTyped(e); 212 if(e.getKeyChar() == e.VK_ESCAPE) 213 hideEditor(); 214 if(e.getKeyChar() == e.VK_ENTER){ 215 if(validInput()) 216 hideEditor(); 217 } 218 } 219 }); 220 editorComponent.addFocusListener(new FocusListener (){ 221 public void focusLost(FocusEvent e) { 222 if(getParent() instanceof ABEBaseDropPanel){ 223 ABEBaseDropPanel acp = (ABEBaseDropPanel) getParent(); 225 if(acp.context.isUserInducedEventMode()) 226 return; 227 } 228 hideEditor(); 229 } 230 public void focusGained(FocusEvent e) { 231 } 232 }); 233 234 this.addHierarchyListener(new HierarchyListener () { 235 public void hierarchyChanged(HierarchyEvent e) { 236 try{ 238 hideEditor(); 239 }catch (Exception ex){ 240 } 242 } 243 }); 244 getScrollPane().setWheelScrollingEnabled(false); 246 editorComponent.requestFocusInWindow(); 247 } 248 } 249 250 251 public void hideEditor(){ 252 editMode = false; 253 getScrollPane().setWheelScrollingEnabled(true); 255 NBGlassPaneAccessSupport.disposeNBGlassPane(); 256 ((ABEBaseDropPanel) this.getParent()).context. 258 getComponentSelectionManager().refreshFocus(); 259 } 260 261 public void setInlineEditorComponent(JComponent editorComponent){ 262 this.editorComponent = editorComponent; 263 } 264 265 266 public Dimension getMaximumSize(){ 267 return super.getMinimumSize(); 268 } 269 270 public Dimension getMinimumSize(){ 271 return super.getPreferredSize(); 272 } 273 274 public Dimension getPreferredSize(){ 275 return super.getMinimumSize(); 276 } 277 278 String editInfoString = null; 279 InstanceUIContext context = null; 280 public void setEditInfoText(String editInfoString, InstanceUIContext context){ 281 this.editInfoString = editInfoString; 282 this.context = context; 283 } 284 285 private void addInfoLabel() { 286 if(editInfoString == null) 287 return; 288 JLabel infoLabel = new JLabel (UIUtilities.getImageIcon("bulb.png"), SwingConstants.LEFT); 289 infoLabel.setText(editInfoString); 290 Component panel = this.getParent(); 291 Rectangle rect = panel.getBounds(); 292 rect = SwingUtilities.convertRectangle(panel.getParent(), rect, glass); 293 rect.y -= 20; 294 Dimension dim = infoLabel.getPreferredSize(); 295 rect.width = dim.width; 296 rect.height = dim.height; 297 glass.add(infoLabel); 298 infoLabel.setBackground(new Color (255,255,220)); 299 infoLabel.setOpaque(true); 300 infoLabel.setBounds(rect); 301 } 302 303 int wMagFactor = 2; 304 public void setWidthMagnificationFactor(int factor){ 305 this.wMagFactor = factor; 306 } 307 308 InputValidator inputValidator; 309 String errorMessage; 310 public void setInputValidator(InputValidator iv, String errorMessage){ 311 this.inputValidator = iv; 312 this.errorMessage = errorMessage; 313 } 314 315 private boolean validInput(){ 316 if(editorComponent instanceof JTextField ){ 317 String str = ((JTextField )editorComponent).getText(); 318 if( (this.inputValidator != null) && (str != null) ){ 319 if(!this.inputValidator.isStringValid(str)){ 320 UIUtilities.showErrorMessageFor(errorMessage, 321 ((ABEBaseDropPanel) this.getParent()).context, glass, editorComponent); 322 return false; 323 }else{ 324 UIUtilities.hideGlassMessage(false); 325 } 326 } 327 } 328 return true; 329 } 330 331 CtrlClickHandler ctrlClickHandler; 332 public void addCtrlClickHandler(CtrlClickHandler ctrlClickHandler){ 333 this.ctrlClickHandler = ctrlClickHandler; 334 } 335 336 public interface CtrlClickHandler{ 337 public void handleCtrlClick(); 338 } 339 } 340 | Popular Tags |