/**
*
*/
package org.sinnlabs.dbvim.ui;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import org.apache.commons.lang3.StringEscapeUtils;
import org.sinnlabs.dbvim.config.ConfigLoader;
import org.sinnlabs.dbvim.model.DBConnection;
import org.sinnlabs.dbvim.model.Form;
import org.sinnlabs.dbvim.ui.modeltree.FormTreeNode;
import org.sinnlabs.dbvim.ui.modeltree.ModelTreeNode;
import org.sinnlabs.dbvim.ui.modeltree.ModelTreeRenderer;
import org.sinnlabs.dbvim.ui.modeltree.TableTreeNode;
import org.sinnlabs.dbvim.zk.model.DeveloperFactory;
import org.sinnlabs.dbvim.zk.model.IDeveloperStudio;
import org.sinnlabs.zk.ui.CodeMirror;
import org.w3c.dom.Document;
import org.w3c.tidy.Tidy;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.MouseEvent;
import org.zkoss.zk.ui.select.Selectors;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zul.Button;
import org.zkoss.zul.Idspace;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Tree;
import org.zkoss.zul.Treeitem;
/**
* Class represents tree that contains all server objects (forms, menus, etc)
* @author peter.liverovsky
*
*/
public class ModelTree extends Idspace {
/**
*
*/
private static final long serialVersionUID = -5752242522968789687L;
@Wire
protected Tree trModelTree;
@Wire
protected Button btnAddConnection;
@Wire
protected Toolbarbutton btnRefresh;
@Wire
protected Toolbarbutton btnDelete;
@Wire
protected Toolbarbutton btnEditFormXML;
public ModelTree() throws SQLException {
IDeveloperStudio developer = DeveloperFactory.getInstance();
/* create the ui */
Executions.createComponents("/components/modeltree.zul", this, null);
Selectors.wireComponents(this, this, false);
this.trModelTree.clear();
this.trModelTree.setItemRenderer(new ModelTreeRenderer(developer));
this.trModelTree.setModel(new ModelTreeNode());
addEventListeners();
}
private void btnAddConnection_Click() {
final AddConnectionDialog dialog = new AddConnectionDialog();
dialog.addEventListener(Events.ON_CLOSE, new EventListener<Event>() {
@Override
public void onEvent(Event arg0) throws Exception {
if (dialog.getSelectedAction() == AddConnectionDialog.DD_OK) {
DBConnection conn = new DBConnection(dialog.getName(),
dialog.getConnectionString(), dialog.getClassName());
ConfigLoader.getInstance().getDBConnections().create(conn);
RefreshTree();
}
}
});
this.appendChild(dialog);
dialog.doModal();
}
/**
* Edit xml form definitions
* @throws UnsupportedEncodingException
*/
private void btnEditFormXML_onClick() throws UnsupportedEncodingException {
final Treeitem selected = trModelTree.getSelectedItem();
if (selected != null) {
Object value = selected.getValue();
// Check selected item type
if (value instanceof FormTreeNode) {
final Form frm = (Form) ((FormTreeNode)value).getForm();
final ExpandWindow dialog = new ExpandWindow();
dialog.setMode(CodeMirror.XML);
dialog.setText(StringEscapeUtils.escapeXml10(beautyHTML(frm.getView())));
dialog.addEventListener(Events.ON_CLOSE, new EventListener<Event>() {
@Override
public void onEvent(Event arg0) throws Exception {
if (dialog.getSelectedAction() == ExpandWindow.DD_OK) {
frm.setView(beautyHTML(dialog.getText()));
ConfigLoader.getInstance().getForms().update(frm);
}
}
});
this.appendChild(dialog);
dialog.doModal();
}
}
}
private String beautyHTML(String html) throws UnsupportedEncodingException {
Tidy tidy = new Tidy();
tidy.setInputEncoding("UTF-8");
tidy.setOutputEncoding("UTF-8");
tidy.setWraplen(Integer.MAX_VALUE);
tidy.setXmlOut(true);
tidy.setXmlTags(true);
tidy.setSmartIndent(true);
ByteArrayInputStream inputStream = new ByteArrayInputStream(html.getBytes("UTF-8"));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Document doc = tidy.parseDOM(inputStream, null);
tidy.pprint(doc, outputStream);
return outputStream.toString("UTF-8");
}
private void RefreshTree() throws SQLException {
trModelTree.clear();
trModelTree.setModel(new ModelTreeNode());
}
/**
* Get the selected table
* @return The selected table or null
*/
public TableTreeNode getSelectedTable() {
Treeitem item = trModelTree.getSelectedItem();
if (item == null)
return null;
Object val = item.getValue();
if (val == null)
return null;
if(val instanceof TableTreeNode) {
return (TableTreeNode) val;
}
return null;
}
private void addEventListeners() {
btnAddConnection.addEventListener(Events.ON_CLICK,
new EventListener<MouseEvent>() {
@Override
public void onEvent(MouseEvent e) throws Exception {
btnAddConnection_Click();
}
});
/* refresh tree model */
btnRefresh.addEventListener(Events.ON_CLICK, new EventListener<MouseEvent>() {
@Override
public void onEvent(MouseEvent e) throws Exception {
RefreshTree();
}
});
btnEditFormXML.addEventListener(Events.ON_CLICK, new EventListener<MouseEvent>() {
@Override
public void onEvent(MouseEvent arg0) throws Exception {
btnEditFormXML_onClick();
}
});
/* Delete selected tree item */
btnDelete.addEventListener(Events.ON_CLICK, new EventListener<MouseEvent>() {
@Override
public void onEvent(MouseEvent e) throws Exception {
final Treeitem selected = trModelTree.getSelectedItem();
if (selected != null) {
Messagebox.show("Do you really want to delete object?", "Delete object",
Messagebox.YES | Messagebox.NO,
Messagebox.QUESTION, new EventListener<Event>() {
@Override
public void onEvent(Event evnt) throws Exception {
if (Messagebox.ON_YES.equals(evnt.getName())) {
Object value = selected.getValue();
// Check selected item type
if (value instanceof DBConnection) {
ConfigLoader.getInstance().getDBConnections()
.delete((DBConnection) value);
RefreshTree();
}
if (value instanceof FormTreeNode) {
Form frm = (Form) ((FormTreeNode)value).getForm();
ConfigLoader.getInstance().getForms()
.delete(frm);
RefreshTree();
}
}
}
});
} // if
}
});
}
}