Item item1 = container.getItem(o1);
Item item2 = container.getItem(o2);
+ /*
+ * Items can be null if the container is filtered. Null is considered
+ * "less" than not-null.
+ */
+ if (item1 == null) {
+ if (item2 == null) {
+ return 0;
+ } else {
+ return 1;
+ }
+ } else if (item2 == null) {
+ return -1;
+ }
+
for (int i = 0; i < sortPropertyIds.length; i++) {
int result = compareProperty(sortPropertyIds[i], sortDirections[i],
return isGecko;
}
+ public boolean isWebkit() {
+ return isAppleWebKit;
+ }
+
public boolean isFF2() {
return isGecko && version == 1.8;
}
private Timer layoutTimer;
+ private boolean enabled = true;
+
public VMenuBar() {
// Create an empty horizontal menubar
this(false);
if (client.updateComponent(this, uidl, true)) {
return;
}
+ this.enabled = !uidl.getBooleanAttribute("disabled");
// For future connections
this.client = client;
switch (DOM.eventGetType(e)) {
case Event.ONCLICK:
- if (targetItem.isEnabled()) {
+ if (isEnabled() && targetItem.isEnabled()) {
itemClick(targetItem);
}
break;
case Event.ONMOUSEOVER:
- if (targetItem.isEnabled()) {
+ if (isEnabled() && targetItem.isEnabled()) {
itemOver(targetItem);
}
break;
}
}
+ private boolean isEnabled() {
+ return enabled;
+ }
+
private void requestLayout() {
if (layoutTimer == null) {
layoutTimer = new Timer() {
@Override
protected <H extends EventHandler> HandlerRegistration registerHandler(
H handler, Type<H> type) {
- return addDomHandler(handler, type);
+ if ((Event.getEventsSunk(splitter) & Event.getTypeInt(type
+ .getName())) != 0) {
+ // If we are already sinking the event for the splitter we do
+ // not want to additionally sink it for the root element
+ return addHandler(handler, type);
+ } else {
+ return addDomHandler(handler, type);
+ }
}
+ @Override
+ public void onContextMenu(
+ com.google.gwt.event.dom.client.ContextMenuEvent event) {
+ Element target = event.getNativeEvent().getEventTarget().cast();
+ if (splitter.isOrHasChild(target)) {
+ super.onContextMenu(event);
+ }
+ };
+
@Override
protected void fireClick(NativeEvent event) {
- if (splitter.isOrHasChild((Element) event.getEventTarget().cast())) {
+ Element target = event.getEventTarget().cast();
+ if (splitter.isOrHasChild(target)) {
super.fireClick(event);
}
}
setHeight(MIN_SIZE + "px");
constructDom();
setOrientation(orientation);
- DOM.sinkEvents(splitter, (Event.MOUSEEVENTS));
DOM.sinkEvents(getElement(), (Event.MOUSEEVENTS));
}
}
clickEventHandler.handleEventHandlerRegistration(client);
-
if (uidl.hasAttribute("style")) {
componentStyleNames = uidl.getStringAttribute("style").split(" ");
} else {
case Event.ONMOUSEDOWN:
onMouseDown(event);
break;
+ case Event.ONMOUSEOUT:
+ // Dragging curtain interferes with click events if added in
+ // mousedown so we add it only when needed i.e., if the mouse moves
+ // outside the splitter.
+ if (resizing) {
+ showDraggingCurtain();
+ }
+ break;
case Event.ONMOUSEUP:
if (resizing) {
onMouseUp(event);
// Only fire click event listeners if the splitter isn't moved
if (!resized) {
super.onBrowserEvent(event);
+ } else if (DOM.eventGetType(event) == Event.ONMOUSEUP) {
+ // Reset the resized flag after a mouseup has occured so the next
+ // mousedown/mouseup can be interpreted as a click.
+ resized = false;
}
}
final Element trg = DOM.eventGetTarget(event);
if (trg == splitter || trg == DOM.getChild(splitter, 0)) {
resizing = true;
- resized = false;
- if (BrowserInfo.get().isGecko()) {
- showDraggingCurtain();
- }
DOM.setCapture(getElement());
origX = DOM.getElementPropertyInt(splitter, "offsetLeft");
origY = DOM.getElementPropertyInt(splitter, "offsetTop");
public void onMouseUp(Event event) {
DOM.releaseCapture(getElement());
- if (BrowserInfo.get().isGecko()) {
- hideDraggingCurtain();
- }
+ hideDraggingCurtain();
resizing = false;
onMouseMove(event);
updateSplitPositionToServer();
* iframe.
*/
private void showDraggingCurtain() {
+ if (!isDraggingCurtainRequired()) {
+ return;
+ }
if (draggingCurtain == null) {
draggingCurtain = DOM.createDiv();
DOM.setStyleAttribute(draggingCurtain, "position", "absolute");
DOM.setStyleAttribute(draggingCurtain, "height", "100%");
DOM.setStyleAttribute(draggingCurtain, "zIndex", ""
+ VOverlay.Z_INDEX);
+
DOM.appendChild(RootPanel.getBodyElement(), draggingCurtain);
}
}
+ /**
+ * A dragging curtain is required in Gecko and Webkit.
+ *
+ * @return true if the browser requires a dragging curtain
+ */
+ private boolean isDraggingCurtainRequired() {
+ return (BrowserInfo.get().isGecko() || BrowserInfo.get().isWebkit());
+ }
+
/**
* Hides dragging curtain
*/
if (item.isFormField()) {
// ignored, upload requests contains only files
} else {
- final String pid = name.split("_")[0];
+ int separatorPos = name.lastIndexOf("_");
+ final String pid = name.substring(0, separatorPos);
final Upload uploadComponent = (Upload) idPaintableMap
.get(pid);
if (uploadComponent == null) {
* @author marc\r
*/\r
@SuppressWarnings( { "serial", "unchecked" })\r
-@Deprecated\r
public class PortletApplicationContext extends WebApplicationContext implements\r
Serializable {\r
\r
\r
import com.vaadin.ui.Component;\r
import com.vaadin.ui.Label;\r
-import com.vaadin.ui.Layout;\r
import com.vaadin.ui.VerticalLayout;\r
import com.vaadin.ui.Window;\r
\r
}\r
\r
private Window window;\r
- private Layout layout;\r
+ private VerticalLayout layout;\r
\r
public TestBase() {\r
\r
}\r
\r
- protected Layout getLayout() {\r
+ protected VerticalLayout getLayout() {\r
return layout;\r
}\r
\r
--- /dev/null
+package com.vaadin.tests.components.splitpanel;
+
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.RichTextArea;
+import com.vaadin.ui.SplitPanel;
+
+public class SplitPanelWithRichTextArea extends TestBase {
+
+ @Override
+ protected void setup() {
+ SplitPanel sp = new SplitPanel();
+ sp.setSizeFull();
+ RichTextArea rta = new RichTextArea();
+ rta.setSizeFull();
+ Label label = new Label("One side of the panel");
+
+ sp.setFirstComponent(label);
+ sp.setSecondComponent(rta);
+
+ addComponent(sp);
+ sp.setSizeFull();
+ getLayout().setSizeFull();
+
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Dragging the splitter should work even if the cursor happens to move over the RichTextArea because of slow updates.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 3792;
+ }
+
+}
import com.vaadin.event.FieldEvents.FocusEvent;
import com.vaadin.event.FieldEvents.FocusListener;
import com.vaadin.tests.components.TestBase;
-import com.vaadin.tests.layouts.TestLayoutClickListeners.Log;
+import com.vaadin.tests.util.Log;
import com.vaadin.ui.TextField;
public class TextFieldFocusAndBlurListeners extends TestBase implements
package com.vaadin.tests.layouts;
-import java.util.ArrayList;
-import java.util.List;
-
import com.vaadin.event.LayoutEvents.LayoutClickEvent;
import com.vaadin.event.LayoutEvents.LayoutClickListener;
import com.vaadin.tests.components.AbstractTestCase;
+import com.vaadin.tests.util.Log;
import com.vaadin.ui.AbsoluteLayout;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
private Log log = new Log(5);
- public static class Log extends VerticalLayout {
- List<Label> eventLabels = new ArrayList<Label>();
-
- public Log(int nr) {
- for (int i = 0; i < nr; i++) {
- Label l = createEventLabel();
- eventLabels.add(l);
- addComponent(l);
- }
-
- setCaption("Events:");
- }
-
- public void clear() {
- for (Label l : eventLabels) {
- l.setValue("");
- }
- }
-
- public void log(String event) {
- int nr = eventLabels.size();
- for (int i = nr - 1; i > 0; i--) {
- eventLabels.get(i).setValue(eventLabels.get(i - 1).getValue());
- }
- eventLabels.get(0).setValue(event);
- }
-
- private Label createEventLabel() {
- Label l = new Label(" ", Label.CONTENT_XHTML);
- l.setWidth(null);
- return l;
- }
-
- }
-
@Override
public void init() {
Window w = new Window("main window");
super.setUp();\r
}\r
\r
+ public void testEmptyFilteredIndexedContainer() {\r
+ IndexedContainer ic = new IndexedContainer();\r
+\r
+ addProperties(ic);\r
+ populate(ic);\r
+\r
+ ic.addContainerFilter(PROPERTY_STRING_ID, "aasdfasdfasdf", true, false);\r
+ ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });\r
+\r
+ }\r
+\r
+ public void testFilteredIndexedContainer() {\r
+ IndexedContainer ic = new IndexedContainer();\r
+\r
+ addProperties(ic);\r
+ populate(ic);\r
+\r
+ ic.addContainerFilter(PROPERTY_STRING_ID, "a", true, false);\r
+ ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });\r
+ verifyOrder(ic,\r
+ new String[] { ITEM_ANOTHER_NULL, ITEM_DATA_MINUS1,\r
+ ITEM_DATA_MINUS1_NULL, ITEM_DATA_MINUS2,\r
+ ITEM_DATA_MINUS2_NULL, });\r
+ }\r
+\r
public void testIndexedContainer() {\r
IndexedContainer ic = new IndexedContainer();\r
\r
--- /dev/null
+package com.vaadin.tests.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.vaadin.ui.Label;\r
+import com.vaadin.ui.VerticalLayout;\r
+\r
+public class Log extends VerticalLayout {\r
+ List<Label> eventLabels = new ArrayList<Label>();\r
+\r
+ public Log(int nr) {\r
+ for (int i = 0; i < nr; i++) {\r
+ Label l = createEventLabel();\r
+ eventLabels.add(l);\r
+ addComponent(l);\r
+ }\r
+\r
+ setCaption("Events:");\r
+ }\r
+\r
+ public void clear() {\r
+ for (Label l : eventLabels) {\r
+ l.setValue("");\r
+ }\r
+ }\r
+\r
+ public void log(String event) {\r
+ int nr = eventLabels.size();\r
+ for (int i = nr - 1; i > 0; i--) {\r
+ eventLabels.get(i).setValue(eventLabels.get(i - 1).getValue());\r
+ }\r
+ eventLabels.get(0).setValue(event);\r
+ System.out.println(event);\r
+ }\r
+\r
+ private Label createEventLabel() {\r
+ Label l = new Label(" ", Label.CONTENT_XHTML);\r
+ l.setWidth(null);\r
+ return l;\r
+ }\r
+\r
+}\r