소스 검색

WidgetSet extending initial commit

svn changeset:2308/svn branch:trunk
tags/6.7.0.beta1
Marc Englund 16 년 전
부모
커밋
fc78593ebc

+ 14
- 0
src/com/itmill/toolkit/demo/reservation/gwt/WidgetSet.gwt.xml 파일 보기

@@ -0,0 +1,14 @@
<module>
<inherits name="com.itmill.toolkit.terminal.gwt.WidgetSetNoEntry" />
<inherits name='com.mapitz.gwt.googleMaps.GoogleMaps' />
<!-- Component stylesheets -->
<stylesheet src="component-themes/collection.css"/>

<!-- Specify the app entry point class. -->
<entry-point class="com.itmill.toolkit.demo.reservation.gwt.client.WidgetSet"/>
</module>

+ 34
- 0
src/com/itmill/toolkit/demo/reservation/gwt/client/WidgetSet.java 파일 보기

@@ -0,0 +1,34 @@
package com.itmill.toolkit.demo.reservation.gwt.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.demo.reservation.gwt.client.ui.IGoogleMap;
import com.itmill.toolkit.terminal.gwt.client.DefaultWidgetSet;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
public class WidgetSet extends DefaultWidgetSet {
public Widget createWidget(UIDL uidl) {
String className = resolveWidgetTypeName(uidl);
if ("com.itmill.toolkit.terminal.gwt.client.ui.IGoogleMap"
.equals(className)) {
return new IGoogleMap();
}
return super.createWidget(uidl);
}
protected String resolveWidgetTypeName(UIDL uidl) {
String tag = uidl.getTag();
if ("googlemap".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IGoogleMap";
}
return super.resolveWidgetTypeName(uidl);
}
public boolean isCorrectImplementation(Widget currentWidget, UIDL uidl) {
return GWT.getTypeName(currentWidget).equals(
resolveWidgetTypeName(uidl));
}
}

+ 91
- 0
src/com/itmill/toolkit/demo/reservation/gwt/client/ui/IGoogleMap.java 파일 보기

@@ -0,0 +1,91 @@
package com.itmill.toolkit.demo.reservation.gwt.client.ui;
import java.util.Iterator;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.mapitz.gwt.googleMaps.client.GLatLng;
import com.mapitz.gwt.googleMaps.client.GMap2;
import com.mapitz.gwt.googleMaps.client.GMap2EventManager;
import com.mapitz.gwt.googleMaps.client.GMap2Widget;
import com.mapitz.gwt.googleMaps.client.GMarker;
import com.mapitz.gwt.googleMaps.client.GMarkerEventClickListener;
import com.mapitz.gwt.googleMaps.client.GMarkerEventManager;
public class IGoogleMap extends GMap2Widget implements Paintable {
GMap2EventManager mapEventManager;
GMarkerEventManager markerEventManager;
GMap2 map;
public IGoogleMap() {
mapEventManager = GMap2EventManager.getInstance();
map = this.getGmap();
}
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
GLatLng pos = null;
for (Iterator it = uidl.getChildIterator(); it.hasNext();) {
UIDL u = (UIDL) it.next();
if (u.getTag().equals("markers")) {
for (Iterator m = u.getChildIterator(); m.hasNext();) {
UIDL umarker = (UIDL) m.next();
String html = umarker.getStringAttribute("html");
float x = umarker.getFloatAttribute("x");
float y = umarker.getFloatAttribute("y");
pos = new GLatLng(x, y);
GMarker marker = new GMarker(pos);
map.addOverlay(marker);
if (html != null) {
addMarkerPopup(marker, html);
}
}
}
}
if (uidl.hasAttribute("width")) {
setWidth(""+uidl.getIntAttribute("width"));
}
if (uidl.hasAttribute("height")) {
setHeight(""+uidl.getIntAttribute("height"));
}
if (uidl.hasAttribute("zoom")) {
map.setZoom(uidl.getIntAttribute("zoom"));
}
if (uidl.hasAttribute("centerX") && uidl.hasAttribute("centerY")) {
GLatLng center = new GLatLng(uidl.getFloatAttribute("centerX"),
uidl.getFloatAttribute("centerY"));
map.setCenter(center);
} else if (pos!=null) {
// use last marker position
map.setCenter(pos);
}
}
private void addMarkerPopup(GMarker marker, String html) {
if (markerEventManager == null) {
markerEventManager = GMarkerEventManager.getInstance();
}
markerEventManager.addOnClickListener(marker, new MarkerEventListener(
html));
}
private class MarkerEventListener implements GMarkerEventClickListener {
String html;
public MarkerEventListener(String html) {
this.html = html;
}
public void onClick(GMarker marker) {
marker.openInfoWindowHtml(html);
}
public void onDblClick(GMarker marker) {
}
}
}

+ 7
- 0
src/com/itmill/toolkit/terminal/gwt/WidgetSet.gwt.xml 파일 보기

@@ -0,0 +1,7 @@
<module>
<source path="client"/>

<inherits name="com.itmill.toolkit.terminal.gwt.WidgetSetNoEntry"/>

<entry-point class="com.itmill.toolkit.terminal.gwt.client.DefaultWidgetSet"/>
</module>

src/com/itmill/toolkit/terminal/gwt/Client.gwt.xml → src/com/itmill/toolkit/terminal/gwt/WidgetSetNoEntry.gwt.xml 파일 보기

@@ -6,8 +6,8 @@

<inherits name="com.google.gwt.xml.XML"/>

<inherits name="com.google.gwt.json.JSON"/>
<inherits name="com.google.gwt.json.JSON"/>
<source path="client"/>
<source path="gwtwidgets"/>
@@ -16,7 +16,5 @@
<stylesheet src="component-themes/collection.css"/>

<!-- Specify the app entry point class. -->
<entry-point class="com.itmill.toolkit.terminal.gwt.client.ApplicationConnection"/>

</module>

+ 12
- 24
src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java 파일 보기

@@ -28,7 +28,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IView;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class ApplicationConnection implements EntryPoint, FocusListener {
public class ApplicationConnection implements FocusListener {

private String appUri;

@@ -42,38 +42,26 @@ public class ApplicationConnection implements EntryPoint, FocusListener {

private HashMap paintableToId = new HashMap();

private final WidgetFactory widgetFactory;
private final WidgetSet widgetSet;

private IContextMenu contextMenu = null;
private IView view = new IView();
public ApplicationConnection() {
widgetFactory = createWidgetFactory();
}

/**
* This is the entry point method.
*/
public void onModuleLoad() {

public ApplicationConnection(WidgetSet widgetSet) {
this.widgetSet = widgetSet;
appUri = getAppUri();
if(isDebugMode()) {
console = new DebugConsole();

if (isDebugMode()) {
console = new DebugConsole();
} else {
console = new NullConsole();
console = new NullConsole();
}

makeUidlRequest("repaintAll=1");
// TODO remove hardcoded id name
RootPanel.get("itmtk-ajax-window").add(view);
}
protected static WidgetFactory createWidgetFactory() {
return new DefaultWidgetFactory();
}

public static Console getConsole() {
@@ -367,10 +355,10 @@ public class ApplicationConnection implements EntryPoint, FocusListener {
boolean manageCaption) {

// Switch to correct implementation if needed
if (!widgetFactory.isCorrectImplementation(component, uidl)) {
if (!widgetSet.isCorrectImplementation(component, uidl)) {
Layout parent = getParentLayout(component);
if (parent != null) {
Widget w = widgetFactory.createWidget(uidl);
Widget w = widgetSet.createWidget(uidl);
parent.replaceChildComponent(component, w);
registerPaintable(uidl.getId(), (Paintable) w);
((Paintable) w).updateFromUIDL(uidl, this);
@@ -431,7 +419,7 @@ public class ApplicationConnection implements EntryPoint, FocusListener {
Widget w = (Widget) getPaintable(id);
if (w != null)
return w;
w = widgetFactory.createWidget(uidl);
w = widgetSet.createWidget(uidl);
registerPaintable(id, (Paintable) w);
return w;
}

+ 258
- 0
src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java 파일 보기

@@ -0,0 +1,258 @@
package com.itmill.toolkit.terminal.gwt.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ui.IButton;
import com.itmill.toolkit.terminal.gwt.client.ui.ICalendar;
import com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox;
import com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout;
import com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar;
import com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded;
import com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect;
import com.itmill.toolkit.terminal.gwt.client.ui.IForm;
import com.itmill.toolkit.terminal.gwt.client.ui.IFormLayout;
import com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout;
import com.itmill.toolkit.terminal.gwt.client.ui.ILabel;
import com.itmill.toolkit.terminal.gwt.client.ui.ILink;
import com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup;
import com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal;
import com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical;
import com.itmill.toolkit.terminal.gwt.client.ui.IPanel;
import com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField;
import com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar;
import com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable;
import com.itmill.toolkit.terminal.gwt.client.ui.ISelect;
import com.itmill.toolkit.terminal.gwt.client.ui.ISlider;
import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal;
import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical;
import com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging;
import com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet;
import com.itmill.toolkit.terminal.gwt.client.ui.ITextArea;
import com.itmill.toolkit.terminal.gwt.client.ui.ITextField;
import com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate;
import com.itmill.toolkit.terminal.gwt.client.ui.ITree;
import com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect;
import com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent;
import com.itmill.toolkit.terminal.gwt.client.ui.IUpload;
import com.itmill.toolkit.terminal.gwt.client.ui.IView;
import com.itmill.toolkit.terminal.gwt.client.ui.IWindow;

public class DefaultWidgetSet implements WidgetSet {

protected ApplicationConnection appConn;

/**
* This is the entry point method.
*/
public void onModuleLoad() {
appConn = new ApplicationConnection(this);
}

public Widget createWidget(UIDL uidl) {

String className = resolveWidgetTypeName(uidl);
if ("com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox"
.equals(className)) {
return new ICheckBox();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IButton"
.equals(className)) {
return new IButton();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IView"
.equals(className)) {
// TODO remove IView?
return new IView();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IWindow"
.equals(className)) {
return new IWindow();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical"
.equals(className)) {
return new IOrderedLayoutVertical();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal"
.equals(className)) {
return new IOrderedLayoutHorizontal();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ILabel"
.equals(className)) {
return new ILabel();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ILink"
.equals(className)) {
return new ILink();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout"
.equals(className)) {
return new IGridLayout();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITree"
.equals(className)) {
return new ITree();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup"
.equals(className)) {
return new IOptionGroup();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect"
.equals(className)) {
return new ITwinColSelect();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISelect"
.equals(className)) {
return new ISelect();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPanel"
.equals(className)) {
return new IPanel();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet"
.equals(className)) {
return new ITabsheet();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded"
.equals(className)) {
return new IEmbedded();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout"
.equals(className)) {
return new ICustomLayout();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextArea"
.equals(className)) {
return new ITextArea();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField"
.equals(className)) {
return new IPasswordField();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextField"
.equals(className)) {
return new ITextField();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging"
.equals(className)) {
return new ITablePaging();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable"
.equals(className)) {
return new IScrollTable();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar"
.equals(className)) {
return new IDateFieldCalendar();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"
.equals(className)) {
return new ICalendar();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate"
.equals(className)) {
return new ITextualDate();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar"
.equals(className)) {
return new IPopupCalendar();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISlider"
.equals(className)) {
return new ISlider();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IForm"
.equals(className)) {
return new IForm();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IFormLayout"
.equals(className)) {
return new IFormLayout();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IUpload"
.equals(className)) {
return new IUpload();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal"
.equals(className)) {
return new ISplitPanelHorizontal();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical"
.equals(className)) {
return new ISplitPanelVertical();
} else if ("com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect"
.equals(className)) {
return new IFilterSelect();
}
return new IUnknownComponent();

/*
* TODO: Class based impl, use when GWT supports return
* (Widget)GWT.create(resolveWidgetClass(uidl));
*/
}

protected String resolveWidgetTypeName(UIDL uidl) {

String tag = uidl.getTag();
if ("button".equals(tag)) {
if ("switch".equals(uidl.getStringAttribute("type"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox";
} else {
return "com.itmill.toolkit.terminal.gwt.client.ui.IButton";
}
} else if ("window".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IWindow";
} else if ("orderedlayout".equals(tag)) {
if ("horizontal".equals(uidl.getStringAttribute("orientation"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal";
} else {
return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical";
}
} else if ("label".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ILabel";
} else if ("link".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ILink";
} else if ("gridlayout".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout";
} else if ("tree".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITree";
} else if ("select".equals(tag)) {
if ("optiongroup".equals(uidl.getStringAttribute("style"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup";
} else if ("twincol".equals(uidl.getStringAttribute("style"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect";
} else {
return "com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect";
}
} else if ("panel".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IPanel";
} else if ("tabsheet".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet";
} else if ("embedded".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded";
} else if ("customlayout".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout";
} else if ("textfield".equals(tag)) {
if (uidl.hasAttribute("multiline")) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITextArea";
} else if (uidl.getBooleanAttribute("secret")) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField";
} else {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITextField";
}
} else if ("table".equals(tag)) {
if (uidl.hasAttribute("style")) {
if ("paging".equals(uidl.getStringAttribute("style"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging";
}
} else {
return "com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable";
}
} else if ("datefield".equals(tag)) {
if (uidl.hasAttribute("style")) {
if ("calendar".equals(uidl.getStringAttribute("style"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar";
} else if ("text".equals(uidl.getStringAttribute("style"))) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate";
}
} else {
return "com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar";
}
} else if ("calendarfield".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar";
} else if ("slider".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ISlider";
} else if ("form".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IForm";
} else if ("formlayout".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IFormLayout";
} else if ("upload".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.IUpload";
} else if ("hsplitpanel".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal";
} else if ("vsplitpanel".equals(tag)) {
return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical";
}

return "com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent";

/*
* TODO: use class based impl when GWT supports it
*/
}

public boolean isCorrectImplementation(Widget currentWidget, UIDL uidl) {
return GWT.getTypeName(currentWidget).equals(
resolveWidgetTypeName(uidl));
}

}

src/com/itmill/toolkit/terminal/gwt/client/WidgetFactory.java → src/com/itmill/toolkit/terminal/gwt/client/WidgetSet.java 파일 보기

@@ -1,15 +1,16 @@
package com.itmill.toolkit.terminal.gwt.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Widget;

public interface WidgetFactory {
public interface WidgetSet extends EntryPoint {

/** Create an uninitialized component that best matches given UIDL.
*
* @param uidl UIDL to be painted with returned component.
* @return New uninitialized and unregistered component that can paint given UIDL.
*/
Widget createWidget(UIDL uidl);
public Widget createWidget(UIDL uidl);

/** Test if the given component implementation conforms to UIDL.
*
@@ -17,5 +18,5 @@ public interface WidgetFactory {
* @param uidl UIDL to test against
* @return true iff createWidget would return a new component of the same class than currentWidget
*/
boolean isCorrectImplementation(Widget currentWidget, UIDL uidl);
public boolean isCorrectImplementation(Widget currentWidget, UIDL uidl);
}

+ 4
- 2
src/com/itmill/toolkit/terminal/gwt/server/ApplicationServlet.java 파일 보기

@@ -438,7 +438,7 @@ public class ApplicationServlet extends HttpServlet {
.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
page.write("<html>\n<head>\n<title>IT Mill Toolkit 5</title>\n" +
page.write("<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\">\n<head>\n<title>IT Mill Toolkit 5</title>\n" +
"<script type=\"text/javascript\">\n" +
" var itmtk = {\n" +
" appUri:'");
@@ -459,7 +459,9 @@ public class ApplicationServlet extends HttpServlet {
page.write("', pathInfo: '"+request.getPathInfo()+"'\n};\n" +
"</script>\n" +
"<script language='javascript' src='"+ (hasSlash ? "../" : "") + relative + "com.itmill.toolkit.terminal.gwt.Client/com.itmill.toolkit.terminal.gwt.Client.nocache.js'></script>" +
"<script src=\"http://maps.google.com/maps?file=api&amp;v=2\" type=\"text/javascript\"></script>"+
"<script language='javascript' src='"+ (hasSlash ? "../" : "") + relative + "com.itmill.toolkit.demo.reservation.gwt.WidgetSet/com.itmill.toolkit.demo.reservation.gwt.WidgetSet.nocache.js'></script>" +

"<link REL=\"stylesheet\" TYPE=\"text/css\" HREF=\""+request.getContextPath() + THEME_DIRECTORY_PATH+themeName+"/style.css\">" +
"</head>\n<body>\n" +

Loading…
취소
저장