Mega Code Archive

 
Categories / Java / GWT
 

Editable Label class

package com.rntsoft.gwt.client; import com.google.gwt.user.client.*; import com.google.gwt.user.client.ui.*; import com.google.gwt.core.client.*; public class GWTClient implements EntryPoint{   public void onModuleLoad() {     EditableLabel label = new EditableLabel("editable label",true);     label.setText("click to edit me");               RootPanel.get().add(label);   } } /*  * Copyright 2006 Robert Hanson <iamroberthanson AT gmail.com>  *   * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *   *    http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ /*  * This code is part of the GWT Widget Library  */ /**  * Editable Label class, funcionality displays a Label UI   * Element until clicked on, then if element is set to be   * editable (default) then an editable area and Buttons are   * displayed instead.  *  * If the Label is not set to be word wrapped (default) then   * the editable area is a Text Box and clicking the OK button   * or hitting return key in the TextBox will display the Label with   * the updated text.   *  * If the Label is set to be word wrapped, using the setWordWrap(boolean)  * method, then the editable area is a Text Area and clicking the OK   * button will display the Label with the updated text.  *  * In both cases, clicking Cancel button or hitting Escape key in the   * TextBox/TextArea then the Label is displayed with original text.  *   * @author Adam Tacy  * @version 0.0.2  *   * Changes since version 0.0.1  * + made cancelLabelChange public [ref request id: 1518134]  * + made originalText have default value of empty string [to support ref request id: 1518134]   * *End*  */ class EditableLabel extends Composite implements HasWordWrap,                                                          HasText,                                                         HasHorizontalAlignment,                                                         SourcesClickEvents,                                                         SourcesChangeEvents,                                                         SourcesMouseEvents {     /**      * TextBox element to enable text to be changed if Label is not word wrapped      */     private TextBox changeText;     /**      * TextArea element to enable text to be changed if Label is wordwrapped      */     private TextArea changeTextArea;          /**      * Label element, which is initially is diplayed.      */     private Label text;          /**      * String element that contains the original text of a      * Label prior to it being edited.      */     private String originalText;     /**      * Simple button to confirm changes      */     private Widget confirmChange;          /**      * Simple button to cancel changes      */     private Widget cancelChange;          /**      * Flag to indicate that Label is in editing mode.      */     private boolean isEditing = false;          /**      * Flag to indicate that label can be edited.      */     private boolean isEditable = true;   ChangeListenerCollection changeListeners;          /**      * Default String value for OK button      */     private String defaultOkButtonText = "OK";          /**      * Default String value for Cancel button      */     private String defaultCancelButtonText = "Cancel";     /**      * Allows the setting of the isEditable flag, marking       * the label as editable or not.      *      * @param flag True or False value depending if the Label is to be editable or not      */     public void setEditable (boolean flag)     {         isEditable = flag;     }     /**      * Returns the value of the isEditable flag.      *      * @return      */     public boolean isFieldEditable ()     {         return isEditable;     }     /**      * Returns the value of the isEditing flag, allowing outside       * users to see if the Label is being edited or not.      *      * @return      */     public boolean isInEditingMode ()     {         return isEditing;     }     /**      * Change the displayed label to be a TextBox and copy label       * text into the TextBox.      *      */     private void changeTextLabel ()     {         if (isEditable) {             // Set up the TextBox             originalText = text.getText();                          // Change the view from Label to TextBox and Buttons             text.setVisible(false);             confirmChange.setVisible(true);             cancelChange.setVisible(true);             if (text.getWordWrap()){                 // If Label word wrapped use the TextArea to edit                 changeTextArea.setText(originalText);                 changeTextArea.setVisible(true);                 changeTextArea.setFocus(true);             } else {                 // Otherwise use the TextBox to edit.                 changeText.setText(originalText);                 changeText.setVisible(true);                 changeText.setFocus(true);             }                          //Set instance as being in editing mode.             isEditing = true;         }     }     /**      * Restores visibility of Label and hides the TextBox and Buttons      *      */     private void restoreVisibility ()     {         // Change appropriate visibilities         text.setVisible(true);         confirmChange.setVisible(false);         cancelChange.setVisible(false);         if(text.getWordWrap()){             // If Label is word wrapped hide the TextArea             changeTextArea.setVisible(false);         } else {             // Otherwise hide the TextBox             changeText.setVisible(false);         }         // Set isEditing flag to false as we are no longer editing         isEditing = false;     }     /**      * Sets the Label text to the new value, restores the       * display and calls the update method.      *      */     private void setTextLabel ()     {         if(text.getWordWrap()){             // Set the Label to be the text in the Text Box             text.setText(changeTextArea.getText());                 } else {             // Set the Label to be the text in the Text Box             text.setText(changeText.getText());         }         // Set the object back to display label rather than TextBox and Buttons         restoreVisibility();         // Call the update method provided in the Constructor         // (this could be anything from alerting the user through to         // Making an AJAX call to store the data.         //updater.onChange(this);         if (changeListeners!=null)changeListeners.fireChange(this);     }     /**      * Sets the Label text to the original value, restores the display.      *      */     public void cancelLabelChange ()     {         // Set the Label text back to what it was originally         text.setText(originalText);                  // Set the object back to display Label rather than TextBox and Buttons         restoreVisibility();     }     /**      * Creates the Label, the TextBox and Buttons.  Also associates      * the update method provided in the constructor with this instance.      *       * @param labelText The value of the initial Label.      * @param visibleLength The visible length (width) of the TextBox/TextArea.      * @param maxLength The maximum length of text in the TextBox.      * @param maxHeight The maximum number of visible lines of the TextArea      * @param okButtonText The text diplayed in the OK button.      * @param cancelButtonText The text displayed in the Cancel button.      */     private void createEditableLabel (String labelText,             String okButtonText, String cancelButtonText)     {         // Put everything in a VerticalPanel         FlowPanel instance = new FlowPanel();         // Create the Label element and add a ClickListener to call out Change method when clicked         text = new Label(labelText);         text.setStyleName("editableLabel-label");         text.addClickListener(new ClickListener()         {             public void onClick (Widget sender)             {                 changeTextLabel();             }         });         // Create the TextBox element used for non word wrapped Labels          // and add a KeyboardListener for Return and Esc key presses         changeText = new TextBox();         changeText.setStyleName("editableLabel-textBox");         changeText.addKeyboardListener(new KeyboardListenerAdapter()         {             public void onKeyPress (Widget sender, char keyCode, int modifiers)             {                 // If return then save, if Esc cancel the change, otherwise do nothing                 switch (keyCode) {                     case 13:                         setTextLabel();                         break;                     case 27:                         cancelLabelChange();                         break;                 }             }         });         // Create the TextAre element used for word-wrapped Labels          // and add a KeyboardListener for Esc key presses (not return in this case)         changeTextArea = new TextArea();         changeTextArea.setStyleName("editableLabel-textArea");                  changeTextArea.addKeyboardListener(new KeyboardListenerAdapter()         {             public void onKeyPress (Widget sender, char keyCode, int modifiers)             {                 // If Esc then cancel the change, otherwise do nothing                 switch (keyCode) {                     case 27:                         cancelLabelChange();                         break;                 }             }         });                           // Set up Confirmation Button         confirmChange = createConfirmButton(okButtonText);         if (!(confirmChange instanceof SourcesClickEvents)) {             throw new RuntimeException("Confirm change button must allow for click events");         }                  ((SourcesClickEvents) confirmChange).addClickListener(new ClickListener()         {             public void onClick (Widget sender)             {                 setTextLabel();             }         });         // Set up Cancel Button         cancelChange = createCancelButton(cancelButtonText);         if (!(cancelChange instanceof SourcesClickEvents)) {             throw new RuntimeException("Cancel change button must allow for click events");         }                  ((SourcesClickEvents)cancelChange).addClickListener(new ClickListener()         {             public void onClick (Widget sender)             {                 cancelLabelChange();             }         });                  // Put the buttons in a panel         FlowPanel buttonPanel = new FlowPanel();         buttonPanel.setStyleName("editableLabel-buttonPanel");         buttonPanel.add(confirmChange);         buttonPanel.add(cancelChange);                  // Add panels/widgets to the widget panel         instance.add(text);         instance.add(changeText);         instance.add(changeTextArea);         instance.add(buttonPanel);         // Set initial visibilities.  This needs to be after         // adding the widgets to the panel because the FlowPanel         // will mess them up when added.         text.setVisible(true);         changeText.setVisible(false);         changeTextArea.setVisible(false);         confirmChange.setVisible(false);         cancelChange.setVisible(false);         // Assume that this is a non word wrapped Label unless explicitly set otherwise         text.setWordWrap(false);                  // Set the widget that this Composite represents         initWidget(instance);     }     /**      * @param cancelButtonText      */     protected Widget createCancelButton (String cancelButtonText)     {         Button result = new Button();         result.setStyleName("editableLabel-buttons");         result.addStyleName("editableLabel-cancel");         result.setText(cancelButtonText);         return result;     }     /**      * @param okButtonText      */     protected Widget createConfirmButton (String okButtonText)     {         Button result = new Button();         result.setStyleName("editableLabel-buttons");         result.addStyleName("editableLabel-confirm");         result.setText(okButtonText);         return result;     }     /**      * Set the word wrapping on the label (if word wrapped then the editable      * field becomes a TextArea, if not then the editable field is a TextBox.      * @param b Boolean value, true means Label is word wrapped, false means it is not.       */     public void setWordWrap(boolean b) {         text.setWordWrap(b);     }     /**      * Return whether the Label is word wrapped or not.      */     public boolean getWordWrap() {         return text.getWordWrap();     }     /**      * Return the text value of the Label      */     public String getText() {         return text.getText();     }     /**      * Set the text value of the Label       */     public void setText(String newText) {         text.setText(newText);     }          /**      * Sets the number of visible lines for a word-wrapped editable label.      * @param number Number of visible lines.      * @throws RuntimeException if the editable label is not word-wrapped.      */public void setVisibleLines(int number){         if (text.getWordWrap()){             changeTextArea.setVisibleLines(number);          } else {             throw new RuntimeException("Cannnot set number of visible lines for a non word-wrapped Editable Label");         }     }          /**      * Get the number of Visible Lines of editable area of a word-wrapped editable Label.      * @return Number of Visible Lines.      * @throws RuntimeException If the Label is not word-wrapped.      */     public int getVisibleLines(){         if (text.getWordWrap()){             return changeTextArea.getVisibleLines();             } else {             throw new RuntimeException("Editable Label that is not word-wrapped has no number of Visible Lines");         }            }          /**      * Set maximum length of editable area.      * @param length Length of editable area.      */     public void setMaxLength(int length){         if (text.getWordWrap()){             changeTextArea.setCharacterWidth(length);         } else {             changeText.setMaxLength(length);             }     }     /**      * Get maximum length of editable area.      * @return maximum length of editable area.      */     public int getMaxLength(){         if (text.getWordWrap()){             return changeTextArea.getCharacterWidth();         } else {             return changeText.getMaxLength();            }     }     /**      * Set the visible length of the editable area.      * @throws RuntimeExcpetion If editable label is word wrapped.       */     public void setVisibleLength(int length){         if (text.getWordWrap()){             throw new RuntimeException("Cannnot set visible length for a word-wrapped Editable Label");         } else {             changeText.setVisibleLength(length);         }     }          /**      * Get the visible length of the editable area.      * @return Visible length of editable area if not a word wrapped label.      * @throws RuntimeExcpetion If editable label is word wrapped.       */     public int getVisibleLength(){         if (text.getWordWrap()){             throw new RuntimeException("Cannnot get visible length for a word-wrapped Editable Label");         } else {             return changeText.getVisibleLength();         }            }     /**      * Constructor that changes default text for buttons and allows the setting of the wordwrap property directly.      *       * @param labelText  The initial text of the label.      * @param onUpdate Handler object for performing actions once label is updated.      * @param okText Text for use in overiding the default OK button text.      * @param cancelText Text for use in overiding the default CANCEL button text.      * @param wordWrap Boolean representing if the label should be word wrapped or not      */     public EditableLabel (String labelText, String okText,             String cancelText, boolean wordWrap)     {         createEditableLabel(labelText, okText, cancelText);         text.setWordWrap(wordWrap);     }     /**      * Constructor that uses default text values for buttons and sets the word wrap property.        *       * @param labelText  The initial text of the label.      * @param onUpdate Handler object for performing actions once label is updated.      * @param wordWrap Boolean representing if the label should be word wrapped or not      */     public EditableLabel (String labelText, boolean wordWrap)     {           createEditableLabel(labelText, defaultOkButtonText, defaultCancelButtonText);           text.setWordWrap(wordWrap);     }               /**      * Constructor that changes default button text.      *       * @param labelText  The initial text of the label.      * @param onUpdate Handler object for performing actions once label is updated.      * @param okText Text for use in overiding the default OK button text.      * @param cancelText Text for use in overiding the default CANCEL button text.      */     public EditableLabel (String labelText, String okText,             String cancelText)     {         createEditableLabel(labelText, okText, cancelText);     }     /**      * Constructor that uses default text values for buttons.        *       * @param labelText The initial text of the label.      * @param onUpdate Handler object for performing actions once label is updated.      */     public EditableLabel (String labelText)     {           createEditableLabel(labelText, defaultOkButtonText, defaultCancelButtonText);     }   public HorizontalAlignmentConstant getHorizontalAlignment() {     return text.getHorizontalAlignment();   }   public void setHorizontalAlignment(HorizontalAlignmentConstant align) {     text.setHorizontalAlignment(align);   }   public void addClickListener(ClickListener listener) {     this.text.addClickListener(listener);   }   public void removeClickListener(ClickListener listener) {     this.text.removeClickListener(listener);   }   public void addMouseListener(MouseListener listener) {     this.text.addMouseListener(listener);        }   public void removeMouseListener(MouseListener listener) {     this.text.removeMouseListener(listener);     }      public void addChangeListener(ChangeListener listener) {     if (changeListeners == null){       changeListeners = new ChangeListenerCollection();     }     changeListeners.add(listener);   }   public void removeChangeListener(ChangeListener listener) {     if (changeListeners != null){       changeListeners.remove(listener);;     }   } }                     GWT-editableLabel.zip( 6 k)