/*******************************************************************************
* Copyright 2011 Alex 'Ript' Malyshev <alexript@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.
******************************************************************************/
package net.autosauler.ballance.client.gui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.autosauler.ballance.client.Ballance_autosauler_net;
import net.autosauler.ballance.client.Services;
import net.autosauler.ballance.client.gui.images.Images;
import net.autosauler.ballance.client.gui.messages.M;
import net.autosauler.ballance.shared.UserRole;
import com.allen_sauer.gwt.log.client.Log;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayout;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
/**
* The Class DatabasePanel.
*/
public class DatabasePanel extends ContentPanel implements ClickHandler,
IDialogYesReceiver, IPaneWithMenu {
/**
* Gets the.
*
* @return the database panel
*/
public static DatabasePanel get() {
if (impl == null) {
impl = new DatabasePanel();
}
return impl;
}
/** The btn drop database. */
private Button btnDropDatabase;
/** The btn dump database. */
private Button btnDumpDatabase;
/** The btn restore database. */
private Button btnRestoreDatabase;
/** The btn global script. */
private Button btnGlobalScript;
/** The impl. */
private static DatabasePanel impl = null;
/** The settingspanel. */
private final DecoratorPanel settingspanel;
/** The setings list. */
private CellList<String> setingsList;
/** The settingvalue. */
private TextBox settingvalue;
/** The settings. */
private HashMap<String, String> settings = null;
/** The dumpfile. */
private TextBox dumpfile;
/** The restorefile. */
private TextBox restorefile;
/**
* Instantiates a new database panel.
*/
private DatabasePanel() {
super(new VBoxLayout());
add(createGlobalScriptPanel());
add(createDropDatabasePanel());
add(createDumpDatabasePanel());
settingspanel = createSettingsPanel();
add(settingspanel);
MainPanel.setCommInfo(true);
Services.database
.getSettings(new AsyncCallback<HashMap<String, String>>() {
@Override
public void onFailure(Throwable caught) {
MainPanel.setCommInfo(false);
settingspanel.clear();
Label err = new Label(caught.getMessage());
err.setVisible(false);
settingspanel.add(err);
effectAppear(err.getElement());
Log.error(caught.getMessage());
}
@Override
public void onSuccess(HashMap<String, String> result) {
MainPanel.setCommInfo(false);
settings = result;
settingspanel.clear();
final Button btn = new Button();
btn.setText(M.database.btnSoreChanges());
btn.setEnabled(false);
settingvalue = new TextBox();
settingvalue.setWidth("200px");
settingvalue.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
btn.setEnabled(true);
}
});
// create celllist
// ============================================
ProvidesKey<String> provider = new ProvidesKey<String>() {
@Override
public Object getKey(String item) {
return item == null ? null : item;
}
};
ListDataProvider<String> dataProvider = new ListDataProvider<String>();
dataProvider.setList(new ArrayList<String>(settings
.keySet()));
setingsList = new CellList<String>(new TextCell() {
}, provider);
setingsList.setPageSize(30);
setingsList
.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE);
setingsList
.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);
// Add a selection model so we can select cells.
final SingleSelectionModel<String> selectionModel = new SingleSelectionModel<String>(
provider);
setingsList.setSelectionModel(selectionModel);
selectionModel
.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(
SelectionChangeEvent event) {
settingvalue.setText(settings
.get(selectionModel
.getSelectedObject()));
}
});
dataProvider.addDataDisplay(setingsList);
// celllist created
// =======================================================
btn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String name = selectionModel
.getSelectedObject();
String value = settingvalue.getText().trim();
if (!value.isEmpty()) {
HashMap<String, String> values = new HashMap<String, String>();
values.put(name, value);
MainPanel.setCommInfo(true);
Services.database.setSettings(values,
new AsyncCallback<Void>() {
@Override
public void onFailure(
Throwable caught) {
MainPanel
.setCommInfo(false);
new AlertDialog(caught)
.show();
}
@Override
public void onSuccess(
Void result) {
MainPanel
.setCommInfo(false);
btn.setEnabled(false);
}
});
}
}
});
HorizontalPanel panel = new HorizontalPanel();
panel.setSpacing(4);
panel.setWidth("500px");
panel.setVisible(false);
panel.add(setingsList);
panel.setCellWidth(setingsList, "200px");
panel.add(settingvalue);
panel.add(btn);
settingspanel.add(panel);
effectAppear(panel.getElement());
}
});
}
/**
* Creates the drop database panel.
*
* @return the decorator panel
*/
private FieldSet createDropDatabasePanel() {
FieldSet fieldSet = new FieldSet();
fieldSet.setHeading(M.database.msgDropDatabaseTitle());
btnDropDatabase = new Button(M.database.btnExecute());
btnDropDatabase.addClickHandler(this);
fieldSet.add(btnDropDatabase);
return fieldSet;
}
/**
* Creates the dump database panel.
*
* @return the decorator panel
*/
private FieldSet createDumpDatabasePanel() {
VerticalPanel v = new VerticalPanel();
HorizontalPanel p = new HorizontalPanel();
p.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
p.setSpacing(6);
p.add(new Label(M.database.msgDumpDatabaseTitle()));
dumpfile = new TextBox(); // TODO: replace with list of old dump files
p.add(dumpfile);
btnDumpDatabase = new Button(M.database.btnExecute());
btnDumpDatabase.addClickHandler(this);
p.add(btnDumpDatabase);
v.add(p);
p = new HorizontalPanel();
p.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
p.setSpacing(6);
p.add(new Label(M.database.msgRestoreDatabaseTitle()));
restorefile = new TextBox();
p.add(restorefile);
btnRestoreDatabase = new Button(M.database.btnExecute());
btnRestoreDatabase.addClickHandler(this);
p.add(btnRestoreDatabase);
v.add(p);
FieldSet fieldSet = new FieldSet();
fieldSet.add(v);
return fieldSet;
}
/**
* Creates the global script panel.
*
* @return the decorator panel
*/
private FieldSet createGlobalScriptPanel() {
FieldSet fieldSet = new FieldSet();
fieldSet.setHeading(M.database.msgGlobalScript());
btnGlobalScript = new Button(M.database.btnGlobalScript());
btnGlobalScript.addClickHandler(this);
fieldSet.add(btnGlobalScript);
return fieldSet;
}
/**
* Creates the settings panel.
*
* @return the decorator panel
*/
private DecoratorPanel createSettingsPanel() {
DecoratorPanel panel = new DecoratorPanel();
Image spinner = new Image(Images.menu.spinner());
panel.setWidget(spinner);
return panel;
}
/**
* Effect appear.
*
* @param element
* the element
*/
private native void effectAppear(Element element) /*-{
new $wnd.Effect.Appear(element, {
queue : 'end'
});
}-*/;
@Override
public List<MenuItem> getHelpItems() {
return null;
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.client.gui.IPaneWithMenu#getPaneMenu()
*/
@Override
public com.extjs.gxt.ui.client.widget.menu.MenuBar getPaneMenu() {
return null;
}
/*
* (non-Javadoc)
*
* @see
* com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event
* .dom.client.ClickEvent)
*/
@Override
public void onClick(ClickEvent event) {
if (event.getSource().equals(btnDropDatabase)) {
new QuestionDialog(M.database.qstDropDatabase(), this, "dropdb")
.show();
} else if (event.getSource().equals(btnDumpDatabase)) {
UserRole role = Ballance_autosauler_net.sessionId.getUserrole();
if (role.isAdmin()) {
MainPanel.setCommInfo(true);
Services.database.dumpDatabase(dumpfile.getText().trim(),
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
MainPanel.setCommInfo(false);
new AlertDialog(caught).show();
}
@Override
public void onSuccess(Void result) {
MainPanel.setCommInfo(false);
}
});
}
} else if (event.getSource().equals(btnRestoreDatabase)) {
UserRole role = Ballance_autosauler_net.sessionId.getUserrole();
if (role.isAdmin()) {
MainPanel.setCommInfo(true);
Services.database.restoreDatabase(restorefile.getText().trim(),
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
MainPanel.setCommInfo(false);
new AlertDialog(caught).show();
}
@Override
public void onSuccess(Void result) {
MainPanel.setCommInfo(false);
}
});
}
} else if (event.getSource().equals(btnGlobalScript)) {
new ScriptEditor("global", null);
}
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.client.gui.IDialogYesReceiver#onDialogYesButtonClick
* (java.lang.String)
*/
@Override
public void onDialogYesButtonClick(String tag, Object tag2) {
if (tag.equals("dropdb")) {
UserRole role = Ballance_autosauler_net.sessionId.getUserrole();
if (role.isAdmin()) {
MainPanel.setCommInfo(true);
Services.database.dropDatabase(new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
new AlertDialog(caught).show();
MainPanel.setCommInfo(false);
}
@Override
public void onSuccess(Boolean result) {
if (result) {
Ballance_autosauler_net.logoutSequence();
MainPanel.setCommInfo(false);
} else {
MainPanel.setCommInfo(false);
new AlertDialog("Database error!").show();
}
}
});
}
}
}
}