package org.openrosa.client.view;
import java.util.ArrayList;
import java.util.List;
import org.openrosa.client.controller.FormDesignerController;
import org.openrosa.client.controller.IFileListener;
import org.openrosa.client.model.FormDef;
import org.openrosa.client.controller.IFormSelectionListener;
import org.openrosa.client.util.FormUtil;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
/**
* This is the widget which we display in the design tab.
*
* @author daniel
*
*/
public class DesignTabWidget extends Composite implements IFormSelectionListener{
/** The main widget for the form designer. */
private ContentPanel panel;
/**
* Widget used on the right hand side of the form designer. This widget has the
* Properties, Xforms Source, Design Surface, LayoutXml, Language Xml
* and Model Xml tabs.
*/
private CenterPanel centerPanel = new CenterPanel(FormDesignerWidget.images);
/**
* Widget used on the left hand side of the form designer to display a list
* of forms and their pages, questions, etc.
*/
private FormsTreeView formsTreeView = new FormsTreeView(centerPanel);
/** The coordinator for execution of commands between the menu and tool bar, left and center panel. */
private FormDesignerController controller = new FormDesignerController(centerPanel,formsTreeView);
/** The splitter between the left and center panel. */
/** Flag to tell whether we in in the resize mode of the splitter. */
private boolean isResizing = false;
/** List of form item selection listeners. */
private List<IFormSelectionListener> formSelectionListeners = new ArrayList<IFormSelectionListener>();
public DesignTabWidget(IFileListener fileListener){
formsTreeView.showFormAsRoot(true);
formsTreeView.setFormDesignerListener(controller);
formsTreeView.addFormSelectionListener(this);
formsTreeView.addFormSelectionListener(centerPanel.getFormSelectionListener());
centerPanel.setFormActionListener(formsTreeView);
initDesigner(fileListener);
centerPanel.setFormChangeListener(formsTreeView);
}
private void initDesigner(IFileListener fileListener){
panel = new ContentPanel();
panel.setCollapsible(false);
panel.setFrame(true);
panel.setHeading("OpenRosa Form Designer");
BorderLayout layout = new BorderLayout();
panel.setLayout(layout);
panel.setBorders(false);
Toolbar toolbar = new Toolbar(controller,fileListener,this);
controller.setToolbar(toolbar);
//Context.addLocaleListChangeListener(toolbar);
panel.setTopComponent(toolbar.getToolBar());
BorderLayoutData leftData = new BorderLayoutData(LayoutRegion.WEST,300);
leftData.setSplit(true);
leftData.setCollapsible(true);
leftData.setMargins(new Margins(0,5,10,0));
//panel.setScrollMode(Scroll.AUTOY);
ContentPanel cp = new ContentPanel();
cp.setHeading("Form Tree View");
cp.add(formsTreeView);
cp.addStyleName("myFormTreeView");
FlowPanel stackPanel = new FlowPanel();
stackPanel.add(cp);
stackPanel.addStyleName("myFormTreeView");
FormUtil.maximizeWidget(stackPanel);
ScrollPanel scrollPanel = new ScrollPanel();
scrollPanel.setWidget(stackPanel);
panel.add(scrollPanel,leftData);
BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER,300);
centerData.setMargins(new Margins(0,0,10,0));
centerData.setSplit(true);
cp = new ContentPanel();
cp.expand();
cp.setHeading("Properties View");
centerPanel.setWidth("100%");
centerPanel.setHeight("100%");
cp.add(centerPanel);
panel.add(cp,centerData);
// panel.setSize(1500,768);
panel.expand();
layout.expand(LayoutRegion.CENTER);
layout.expand(LayoutRegion.WEST);
initWidget(panel);
DOM.sinkEvents(getElement(),DOM.getEventsSunk(getElement()) | Event.MOUSEEVENTS);
/*
panel = new VerticalPanel();
hsplitClient = new HorizontalSplitPanel();
hsplitClient.setLeftWidget(leftPanel);
hsplitClient.setRightWidget(centerPanel);
hsplitClient.setSplitPosition("25%");
//VerticalPanel panel = new VerticalPanel();
Toolbar toolbar = new Toolbar(FormDesignerWidget.images,controller);
Context.addLocaleListChangeListener(toolbar);
panel.add(toolbar);
panel.add(hsplitClient);
//dockPanel.add(panel, DockPanel.CENTER);
//FormUtil.maximizeWidget(panel);
//FormUtil.maximizeWidget(hsplitClient);
initWidget(panel);
DOM.sinkEvents(getElement(),DOM.getEventsSunk(getElement()) | Event.MOUSEEVENTS);
*/
}
/**
* @see com.google.gwt.user.client.WindowResizeListener#onWindowResized(int, int)
*/
public void onWindowResized(int width, int height){
int shortcutHeight = height - formsTreeView.getAbsoluteTop() - 5;//8;
if (shortcutHeight < 1)
shortcutHeight = 1;
//leftPanel.setHeight(shortcutHeight - 5 + PurcConstants.UNITS);
shortcutHeight = height - centerPanel.getAbsoluteTop() - 70;
if(shortcutHeight > 100){
//centerPanel.adjustHeight(shortcutHeight + PurcConstants.UNITS);
//centerPanel.onWindowResized(width, height);
//panel.setHeight(shortcutHeight+60+PurcConstants.UNITS);
panel.setHeight(height);
}
}
// @Override
// public void onBrowserEvent(Event event) {
// //TODO Firefox doesn't seem to give us mouse events when resizing.
// if(isResizing)
// centerPanel.onVerticalResize();
//
// isResizing = false;
// if(hsplitClient.isResizing()){
// isResizing = true;
// centerPanel.onVerticalResize();
// }
// }
public void loadForm(FormDef formDef){
formsTreeView.loadForm(formDef, true, false);
}
public void refreshForm(FormDef formDef){
formsTreeView.refreshForm(formDef);
}
public void addNewForm(){
formsTreeView.addNewForm();
}
public void commitChanges(){
centerPanel.commitChanges();
}
/**
* Adds a listener to form item selection events.
*
* @param formSelectionListener the listener to add.
*/
public void addFormSelectionListener(IFormSelectionListener formSelectionListener){
this.formSelectionListeners.add(formSelectionListener);
}
public void onFormItemSelected(Object formItem){
// for(int i=0; i<formSelectionListeners.size(); i++)
// formSelectionListeners.get(i).onFormItemSelected(formItem);
}
}