/*
* Copyright 2011 Sergey Skladchikov
*
* 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.
*/
package consulo.web.gwtUI.client.ui.advancedGwt;
import com.google.gwt.user.client.ui.*;
import org.gwt.advanced.client.ui.AdvancedWidget;
import org.gwt.advanced.client.ui.widget.LockingPanel;
import org.gwt.advanced.client.ui.widget.theme.ThemeImage;
/**
* By VISTALL. This is copy-paste version of {@link org.gwt.advanced.client.ui.widget.TextButtonPanel} with change:
* - use {@link ComboBoxSelectItem} as default widget - not text area
* - now we extends FlexTable - without SimplePanel, simplified tree
* <p/>
* <p/>
* This is a basic class for all text boxs with a button.
*
* @author <a href="mailto:sskladchikov@gmail.com">Sergey Skladchikov</a>
* @see WidgetComboBox
* @see org.gwt.advanced.client.ui.widget.DatePicker
* @since 1.2.0
*/
public abstract class WidgetButtonPanel extends FlexTable implements AdvancedWidget, HasEnabled {
/**
* a selected value box
*/
private ComboBoxSelectItem selectedValue;
/**
* a choice button
*/
private ToggleButton choiceButton;
/**
* a choice button image
*/
private Image choiceButtonImage;
/**
* this flag means whether it's possible to enter a custom text
*/
private final boolean customTextAllowed = false;
/**
* a falg meaning whether the widget locked
*/
private boolean locked;
/**
* a locking panel to lock the screen
*/
private LockingPanel lockingPanel;
/**
* choice button visibility flag
*/
private boolean choiceButtonVisible;
/**
* enabled panel controls flag
*/
private boolean enabled;
protected WidgetButtonPanel() {
setCellPadding(0);
setCellSpacing(0);
setWidget(0, 0, getSelectedValue());
setChoiceButtonVisible(true);
setStyleName("advanced-WidgetButtonPanel");
addComponentListeners();
}
@Override
protected void onAttach() {
super.onAttach();
prepareSelectedValue();
}
/**
* Getter for property 'customTextAllowed'.
*
* @return Value for property 'customTextAllowed'.
*/
@Deprecated
public boolean isCustomTextAllowed() {
return customTextAllowed;
}
/**
* Setter for property 'choiceButtonImage'.
*
* @param choiceButtonImage Value to set for property 'choiceButtonImage'.
*/
public void setChoiceButtonImage(Image choiceButtonImage) {
this.choiceButtonImage = choiceButtonImage;
}
/**
* Getter for property 'choiceButtonVisible'.
*
* @return Value for property 'choiceButtonVisible'.
*/
public boolean isChoiceButtonVisible() {
return choiceButtonVisible;
}
/**
* Setter for property 'choiceButtonVisible'.
*
* @param choiceButtonVisible Value to set for property 'choiceButtonVisible'.
*/
public void setChoiceButtonVisible(boolean choiceButtonVisible) {
if (!choiceButtonVisible && isChoiceButtonVisible()) {
removeCell(0, 1);
}
else if (choiceButtonVisible && !isChoiceButtonVisible()) {
setWidget(0, 1, getChoiceButton());
prepareChoiceButton();
}
this.choiceButtonVisible = choiceButtonVisible;
}
/**
* {@inheritDoc}
*
* @deprecated you don't have to use this method to display the widget any more
*/
@Override
public void display() {
}
/**
* Checks whether the controls palced on this panel are enabled.
*
* @return a result of check.
*/
@Override
public boolean isEnabled() {
return enabled;
}
/**
* Enables or disables the controls inside the panel.
*
* @param enabled is a flag that means whether the controls must be enabled.
*/
@Override
public void setEnabled(boolean enabled) {
this.enabled = enabled;
//getSelectedValue().setEnabled(enabled);
getChoiceButton().setEnabled(enabled);
}
/**
* Cleans all the data displayed in the widget.
*/
public void cleanSelection() {
getSelectedValue().clear();
}
/**
* This method should returns a default button image name.
*
* @return an image name.
*/
protected abstract String getDefaultImageName();
/**
* This method adds component listeners.
*/
protected abstract void addComponentListeners();
/**
* Prepares the selected value box for displaying.
*/
protected void prepareSelectedValue() {
SimplePanel selectedValue = getSelectedValue();
//selectedValue.setReadOnly(!isCustomTextAllowed());
selectedValue.setStyleName("selected-value");
setHeight("100%");
getCellFormatter().setHeight(0, 0, "100%");
getSelectedValue().setHeight("100%");
setWidth("100%");
getCellFormatter().setWidth(0, 0, "100%");
getSelectedValue().setWidth("100%");
}
/**
* Prepares the drop down button for displaying.
*/
protected void prepareChoiceButton() {
ToggleButton dropDownButton = getChoiceButton();
dropDownButton.getUpFace().setImage(getChoiceButtonImage());
dropDownButton.getDownFace().setImage(getChoiceButtonImage());
dropDownButton.setStyleName("choice-button");
}
/**
* Getter for property 'selectedValue'.
*
* @return Value for property 'selectedValue'.
*/
protected ComboBoxSelectItem getSelectedValue() {
if (selectedValue == null) {
selectedValue = new ComboBoxSelectItem();
}
return selectedValue;
}
/**
* Getter for property 'choiceButton'.
*
* @return Value for property 'choiceButton'.
*/
protected ToggleButton getChoiceButton() {
if (choiceButton == null) choiceButton = new ToggleButton();
return choiceButton;
}
/**
* Getter for property 'choiceButtonImage'.
*
* @return Value for property 'choiceButtonImage'.
*/
protected Image getChoiceButtonImage() {
if (choiceButtonImage == null) choiceButtonImage = new ThemeImage(getDefaultImageName());
return choiceButtonImage;
}
/**
* Getter for property 'locked'.
*
* @return Value for property 'locked'.
*/
public boolean isLocked() {
return locked;
}
/**
* This method locks the screen.
*/
public void lock() {
setLocked(true);
getLockingPanel().lock();
}
/**
* This method unlocks the screen and redisplays the widget.
*/
public void unlock() {
getLockingPanel().unlock();
setLocked(false);
}
/**
* Setter for property 'locked'.
*
* @param locked Value to set for property 'locked'.
*/
protected void setLocked(boolean locked) {
this.locked = locked;
}
/**
* Getter for property 'lockingPanel'.
*
* @return Value for property 'lockingPanel'.
*/
protected LockingPanel getLockingPanel() {
if (lockingPanel == null) lockingPanel = new LockingPanel();
return lockingPanel;
}
}