/*############################################################################
# Copyright 2010 North Carolina State University #
# #
# 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 opus.gwt.management.console.client.deployer;
import java.util.HashMap;
import opus.gwt.management.console.client.ClientFactory;
import opus.gwt.management.console.client.event.AsyncRequestEvent;
import opus.gwt.management.console.client.event.PanelTransitionEvent;
import opus.gwt.management.console.client.event.UpdateDBOptionsEvent;
import opus.gwt.management.console.client.event.UpdateDBOptionsEventHandler;
import opus.gwt.management.console.client.overlays.DBOptions;
import opus.gwt.management.console.client.resources.ProjectDeployerCss.ProjectDeployerStyle;
import opus.gwt.management.console.client.tools.TooltipPanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.http.client.URL;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class DatabaseOptionsPanel extends Composite {
private static DatabaseOptionsUiBinder uiBinder = GWT.create(DatabaseOptionsUiBinder.class);
interface DatabaseOptionsUiBinder extends UiBinder<Widget, DatabaseOptionsPanel> {}
private HashMap<String, String> dbOptions;
private boolean optionsFlag;
private boolean postgresAutoConfig;
private EventBus eventBus;
@UiField HTMLPanel dbFieldsPanel;
@UiField TextBox nameTextBox;
@UiField TextBox passwordTextBox;
@UiField TextBox hostTextBox;
@UiField TextBox portTextBox;
@UiField ListBox dbengineListBox;
@UiField Button nextButton;
@UiField Button previousButton;
@UiField HTMLPanel databaseOptionsPanel;
@UiField TooltipPanel active;
@UiField ProjectDeployerStyle deployer;
public DatabaseOptionsPanel(ClientFactory clientFactory) {
initWidget(uiBinder.createAndBindUi(this));
this.eventBus = clientFactory.getEventBus();
postgresAutoConfig = false;
dbOptions = new HashMap<String, String>();
registerHandlers();
checkForDBOptions();
setTooltipInitialState();
}
private void registerHandlers(){
eventBus.addHandler(UpdateDBOptionsEvent.TYPE,
new UpdateDBOptionsEventHandler(){
public void onUpdateDBOptions(UpdateDBOptionsEvent event){
handleDBOptions(event.getDBOptionsData());
}
});
}
public void reset(){
nameTextBox.setText("");
passwordTextBox.setText("");
hostTextBox.setText("");
portTextBox.setText("");
}
public void handleDBOptions(DBOptions dbOptionsData){
optionsFlag = false;
String[] options = dbOptionsData.getAllowedDatabases().split(",");
for(String option : options){
dbOptions.put(option, option);
}
postgresAutoConfig = dbOptionsData.getAutoPostgresConfig();
setupDBOptions();
}
private void checkForDBOptions(){
eventBus.fireEvent(new AsyncRequestEvent("handleDBOptions"));
}
private void setupDBOptions(){
if( optionsFlag ){
dbOptions.put("sqlite3", "sqlite3");
dbOptions.put("postgresql", "postgresql_psycopg2");
dbOptions.put("mysql", "mysql");
dbOptions.put("oracle", "oracle");
}
for(String key : dbOptions.keySet()){
if( key == "sqlite3" ){
dbengineListBox.insertItem(key, dbOptions.get(key), 0);
dbengineListBox.setSelectedIndex(0);
} else {
dbengineListBox.addItem(key, dbOptions.get(key));
}
}
setDBOptionParams();
}
private void setDBOptionParams(){
String item = dbengineListBox.getItemText(dbengineListBox.getSelectedIndex());
if( item.equals("sqlite3") ){
dbFieldsPanel.setVisible(false);
} else if( postgresAutoConfig && item.equals("postgresql_psycopg2") ) {
dbFieldsPanel.setVisible(false);
} else {
dbFieldsPanel.setVisible(true);
}
}
public void setFocus(){
dbengineListBox.setFocus(true);
}
public String getPostData(){
StringBuffer postData = new StringBuffer();
postData.append("&dbengine=");
postData.append( URL.encodeQueryString(dbengineListBox.getValue(dbengineListBox.getSelectedIndex())));
postData.append("&dbname=");
postData.append( URL.encodeQueryString(nameTextBox.getValue()));
postData.append("&dbpassword=");
postData.append( URL.encodeQueryString(passwordTextBox.getValue()));
postData.append("&dbhost=");
postData.append( URL.encodeQueryString(hostTextBox.getValue()));
postData.append("&dbport=");
postData.append( URL.encodeQueryString(portTextBox.getValue()));
return postData.toString();
}
@UiHandler("dbengineListBox")
void handleDBEngineListBox(ChangeEvent event){
setDBOptionParams();
}
@UiHandler("nextButton")
void handleNextButton(ClickEvent event){
//if(validateFields()){
eventBus.fireEvent(new PanelTransitionEvent(PanelTransitionEvent.TransitionTypes.NEXT, this));
//}
}
@UiHandler("previousButton")
void handlePreviousButton(ClickEvent event){
eventBus.fireEvent(new PanelTransitionEvent(PanelTransitionEvent.TransitionTypes.PREVIOUS, this));
}
@UiHandler("nameTextBox")
void handleNameTextBoxOnFocus(FocusEvent event) {
active.setVisible(true);
int x = getTooltipPosition(nameTextBox)[0];
int y = getTooltipPosition(nameTextBox)[1];
setTooltipPosition(x, y);
setTooltipText("Enter the database username.");
}
@UiHandler("passwordTextBox")
void handlePasswordTextBoxOnFocus(FocusEvent event) {
int x = getTooltipPosition(passwordTextBox)[0];
int y = getTooltipPosition(passwordTextBox)[1];
setTooltipPosition(x, y);
setTooltipText("Enter the password for the user.");
}
@UiHandler("hostTextBox")
void handleHostTextBoxOnFocus(FocusEvent event) {
int x = getTooltipPosition(hostTextBox)[0];
int y = getTooltipPosition(hostTextBox)[1];
setTooltipPosition(x, y);
setTooltipText("Enter the host for the database.");
}
@UiHandler("portTextBox")
void handlePortTextBoxOnFocus(FocusEvent event) {
int x = getTooltipPosition(portTextBox)[0];
int y = getTooltipPosition(portTextBox)[1];
setTooltipPosition(x, y);
setTooltipText("Enter the port for the database.");
}
@UiHandler("nameTextBox")
void handleNameTextBoxOnChange(KeyUpEvent event) {
nameTextBox.removeStyleName(deployer.redBorder());
}
@UiHandler("passwordTextBox")
void handlePasswordTextBoxOnChange(KeyUpEvent event) {
passwordTextBox.removeStyleName(deployer.redBorder());
}
@UiHandler("hostTextBox")
void handleHostTextBoxOnChange(KeyUpEvent event) {
hostTextBox.removeStyleName(deployer.redBorder());
}
@UiHandler("portTextBox")
void handlePortTextBoxOnChange(KeyUpEvent event) {
portTextBox.removeStyleName(deployer.redBorder());
}
private boolean validateFields(){
if(!dbengineListBox.isItemSelected(0)){
if(nameTextBox.getText().isEmpty()
|| passwordTextBox.getText().isEmpty()
|| hostTextBox.getText().isEmpty()
|| portTextBox.getText().isEmpty()) {
highlightFields();
Window.alert("All fields must be filled out.");
return false;
} else {
return true;
}
} else {
return true;
}
}
/**
* Highlight fields that are incorrect
*/
private void highlightFields() {
if(nameTextBox.getText().isEmpty()) {
nameTextBox.setStyleName(deployer.redBorder());
}
if(passwordTextBox.getText().isEmpty()) {
passwordTextBox.setStyleName(deployer.redBorder());
}
if(hostTextBox.getText().isEmpty()) {
hostTextBox.setStyleName(deployer.redBorder());
}
if(portTextBox.getText().isEmpty()) {
portTextBox.setStyleName(deployer.redBorder());
}
}
/**
* Set the tooltips initial state on page load
*/
private void setTooltipInitialState() {
active.setVisible(false);
}
/**
* Set the position of a tooltip relative to the browser window
* @param x the x coordinate
* @param y the y coordinate
*/
private void setTooltipPosition(int x, int y) {
active.setPopupPosition(x, y);
}
/**
* Set the text of a tooltip
* @param text the text to set
*/
private void setTooltipText(String text) {
active.hide();
active.setText(text);
active.show();
}
/**
* Return the tooltip position as an array in for them [x, y]
* @param textbox the textbox to get the position of
* @return tooltip position
*/
private int[] getTooltipPosition(TextBox textbox) {
int[] pos = new int[2];
pos[0] = textbox.getAbsoluteLeft() + textbox.getOffsetWidth() + 5;
pos[1] = textbox.getAbsoluteTop() + 2;
return pos;
}
/**
* Return the tooltip position as an array in for them [x, y]
* @param textbox the textbox to get the position of
* @return tooltip position
*/
private int[] getTooltipPosition(PasswordTextBox textbox) {
int[] pos = new int[2];
pos[0] = textbox.getAbsoluteLeft() + textbox.getOffsetWidth() + 5;
pos[1] = textbox.getAbsoluteTop() + 2;
return pos;
}
}