svn changeset:11407/svn branch:6.3_ddtags/6.7.0.beta1
@@ -4,7 +4,7 @@ import java.util.Map; | |||
import com.vaadin.ui.Component; | |||
public abstract class DataBoundTransferable extends ComponentTransferable { | |||
public abstract class DataBoundTransferable extends TransferableImpl { | |||
public DataBoundTransferable(Component sourceComponent, | |||
Map<String, Object> rawVariables) { |
@@ -2,6 +2,8 @@ package com.vaadin.event; | |||
import java.util.Collection; | |||
import com.vaadin.ui.Component; | |||
public interface Transferable { | |||
public Object getData(String dataFlawor); | |||
@@ -10,4 +12,9 @@ public interface Transferable { | |||
public Collection<String> getDataFlawors(); | |||
/** | |||
* @return the component that created the Transferable | |||
*/ | |||
public Component getSourceComponent(); | |||
} |
@@ -6,11 +6,11 @@ import java.util.Map; | |||
import com.vaadin.ui.Component; | |||
public class ComponentTransferable implements Transferable { | |||
public class TransferableImpl implements Transferable { | |||
private Map<String, Object> rawVariables = new HashMap<String, Object>(); | |||
private Component sourceComponent; | |||
public ComponentTransferable(Component sourceComponent, | |||
public TransferableImpl(Component sourceComponent, | |||
Map<String, Object> rawVariables) { | |||
this.sourceComponent = sourceComponent; | |||
this.rawVariables = rawVariables; |
@@ -3,7 +3,7 @@ | |||
*/ | |||
package com.vaadin.event.dd.acceptCriteria; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.terminal.PaintException; | |||
import com.vaadin.terminal.PaintTarget; | |||
@@ -28,8 +28,8 @@ public class ComponentFilter extends ClientSideCriterion { | |||
} | |||
public boolean accepts(DragAndDropEvent dragEvent) { | |||
if (dragEvent.getTransferable() instanceof ComponentTransferable) { | |||
Component sourceComponent = ((ComponentTransferable) dragEvent | |||
if (dragEvent.getTransferable() instanceof TransferableImpl) { | |||
Component sourceComponent = ((TransferableImpl) dragEvent | |||
.getTransferable()).getSourceComponent(); | |||
for (Component c : component) { | |||
if (c == sourceComponent) { |
@@ -3,7 +3,7 @@ | |||
*/ | |||
package com.vaadin.event.dd.acceptCriteria; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.DropTarget; | |||
import com.vaadin.terminal.gwt.client.ui.dd.VSourceIsSameAsTarget; | |||
@@ -13,8 +13,8 @@ import com.vaadin.ui.Component; | |||
public class SourceIsSameAsTarget extends ClientSideCriterion { | |||
public boolean accepts(DragAndDropEvent dragEvent) { | |||
if (dragEvent.getTransferable() instanceof ComponentTransferable) { | |||
Component sourceComponent = ((ComponentTransferable) dragEvent | |||
if (dragEvent.getTransferable() instanceof TransferableImpl) { | |||
Component sourceComponent = ((TransferableImpl) dragEvent | |||
.getTransferable()).getSourceComponent(); | |||
DropTarget target = dragEvent.getDropTargetData().getTarget(); | |||
return sourceComponent == target; |
@@ -10,6 +10,7 @@ import com.google.gwt.user.client.DeferredCommand; | |||
import com.google.gwt.user.client.Element; | |||
import com.google.gwt.user.client.ui.Widget; | |||
import com.vaadin.terminal.gwt.client.ApplicationConnection; | |||
import com.vaadin.terminal.gwt.client.MouseEventDetails; | |||
import com.vaadin.terminal.gwt.client.Paintable; | |||
import com.vaadin.terminal.gwt.client.RenderInformation; | |||
import com.vaadin.terminal.gwt.client.UIDL; | |||
@@ -68,6 +69,9 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
paintable = VDragAndDropWrapper.this; | |||
} | |||
transferable.setData("mouseDown", new MouseEventDetails( | |||
event.getNativeEvent()).serialize()); | |||
startDrag.createDragImage( | |||
((Widget) paintable).getElement(), true); | |||
event.preventDefault(); // prevent text selection | |||
@@ -112,6 +116,7 @@ public class VDragAndDropWrapper extends VCustomComponent implements | |||
} | |||
ApplicationConnection.getConsole().log("HTML 5 Drag Enter"); | |||
VTransferable transferable = new VTransferable(); | |||
transferable.setDragSource(this); | |||
vaadinDragEvent = VDragAndDropManager.get().startDrag(transferable, | |||
event, false); |
@@ -534,8 +534,7 @@ public class VDragAndDropManager { | |||
mouseEventDetails.serialize()); | |||
} catch (Exception e) { | |||
// NOP, (at least oophm on Safari) can't serialize html dd event | |||
// to | |||
// mouseevent | |||
// to mouseevent | |||
} | |||
} else { | |||
currentDrag.getDropDetails().put("mouseEvent", null); |
@@ -1,11 +1,9 @@ | |||
package com.vaadin.terminal.gwt.server; | |||
import java.io.PrintWriter; | |||
import java.util.Collection; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.DragSource; | |||
@@ -179,30 +177,9 @@ public class DragAndDropService implements VariableOwner { | |||
if (sourceComponent != null && sourceComponent instanceof DragSource) { | |||
transferable = ((DragSource) sourceComponent) | |||
.getTransferable(variables); | |||
} else { | |||
if (transferable == null) { | |||
if (sourceComponent != null) { | |||
transferable = new ComponentTransferable(sourceComponent, | |||
variables); | |||
} else { | |||
transferable = new Transferable() { | |||
private Map<String, Object> td = new HashMap<String, Object>(); | |||
public Object getData(String dataFlawor) { | |||
return td.get(dataFlawor); | |||
} | |||
public void setData(String dataFlawor, Object value) { | |||
td.put(dataFlawor, value); | |||
} | |||
public Collection<String> getDataFlawors() { | |||
return td.keySet(); | |||
} | |||
}; | |||
} | |||
} | |||
} | |||
if (transferable == null) { | |||
transferable = new TransferableImpl(sourceComponent, variables); | |||
} | |||
return transferable; |
@@ -2,23 +2,27 @@ package com.vaadin.ui; | |||
import java.util.Map; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragSource; | |||
import com.vaadin.event.dd.DropHandler; | |||
import com.vaadin.event.dd.DropTarget; | |||
import com.vaadin.event.dd.DropTargetDetails; | |||
import com.vaadin.event.dd.DropTargetDetailsImpl; | |||
import com.vaadin.terminal.PaintException; | |||
import com.vaadin.terminal.PaintTarget; | |||
import com.vaadin.terminal.gwt.client.MouseEventDetails; | |||
import com.vaadin.terminal.gwt.client.ui.VDragAndDropWrapper; | |||
import com.vaadin.terminal.gwt.client.ui.dd.HorizontalDropLocation; | |||
import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; | |||
@ClientWidget(VDragAndDropWrapper.class) | |||
public class DragAndDropWrapper extends CustomComponent implements DropTarget, | |||
DragSource { | |||
public class DDWrapperTransferable extends ComponentTransferable { | |||
public class WrapperTransferable extends TransferableImpl { | |||
public DDWrapperTransferable(Component sourceComponent, | |||
public WrapperTransferable(Component sourceComponent, | |||
Map<String, Object> rawVariables) { | |||
super(sourceComponent, rawVariables); | |||
} | |||
@@ -33,6 +37,61 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, | |||
Component object = (Component) getData("component"); | |||
return object; | |||
} | |||
/** | |||
* @return the mouse down event that started the drag and drop operation | |||
*/ | |||
public MouseEventDetails getMouseDownEvent() { | |||
return MouseEventDetails.deSerialize((String) getData("mouseDown")); | |||
} | |||
} | |||
public class WrapperDropDetails extends DropTargetDetailsImpl { | |||
/** | |||
* | |||
*/ | |||
private static final long serialVersionUID = 1L; | |||
public WrapperDropDetails(Map<String, Object> rawDropData) { | |||
super(rawDropData); | |||
} | |||
/** | |||
* @return the absolute position of wrapper on the page | |||
*/ | |||
public Integer getAbsoluteLeft() { | |||
return (Integer) getData("absoluteLeft"); | |||
} | |||
/** | |||
* | |||
* @return the absolute position of wrapper on the page | |||
*/ | |||
public Integer getAbsoluteTop() { | |||
return (Integer) getData("absoluteTop"); | |||
} | |||
/** | |||
* @return details about the actual event that caused the event details. | |||
* Practically mouse move or mouse up. | |||
*/ | |||
public MouseEventDetails getMouseEvent() { | |||
return MouseEventDetails | |||
.deSerialize((String) getData("mouseEvent")); | |||
} | |||
public VerticalDropLocation verticalDropLocation() { | |||
return VerticalDropLocation | |||
.valueOf((String) getData("verticalLocation")); | |||
} | |||
public HorizontalDropLocation horizontalDropLocation() { | |||
return HorizontalDropLocation | |||
.valueOf((String) getData("horizontalLocation")); | |||
} | |||
} | |||
public enum DragStartMode { | |||
@@ -71,12 +130,11 @@ public class DragAndDropWrapper extends CustomComponent implements DropTarget, | |||
public DropTargetDetails translateDragDropDetails( | |||
Map<String, Object> clientVariables) { | |||
// TODO Auto-generated method stub | |||
return null; | |||
return new WrapperDropDetails(clientVariables); | |||
} | |||
public Transferable getTransferable(final Map<String, Object> rawVariables) { | |||
return new DDWrapperTransferable(this, rawVariables); | |||
return new WrapperTransferable(this, rawVariables); | |||
} | |||
public void setDragStartMode(DragStartMode dragStartMode) { |
@@ -2,7 +2,7 @@ package com.vaadin.ui; | |||
import java.util.Map; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.DataBoundTransferable; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
@@ -36,7 +36,10 @@ import com.vaadin.terminal.gwt.client.MouseEventDetails; | |||
* layouts wouldn't need changes (and have regression risk/ performance | |||
* penalty). | |||
* | |||
* @deprecated use {@link DragAndDropWrapper} instead | |||
* | |||
*/ | |||
@Deprecated | |||
@SuppressWarnings("serial") | |||
@ClientWidget(com.vaadin.terminal.gwt.client.ui.VDragDropPane.class) | |||
public class DragDropPane extends AbsoluteLayout implements DropTarget { | |||
@@ -76,8 +79,8 @@ public class DragDropPane extends AbsoluteLayout implements DropTarget { | |||
DragEventDetails ed = (DragEventDetails) event.getDropTargetData(); | |||
Transferable transferable = event.getTransferable(); | |||
if (transferable instanceof ComponentTransferable) { | |||
ComponentTransferable ctr = (ComponentTransferable) transferable; | |||
if (transferable instanceof TransferableImpl) { | |||
TransferableImpl ctr = (TransferableImpl) transferable; | |||
// use "component" (from DragDropPane) if available, else take | |||
// the source component | |||
Component component = (Component) ctr.getData("component"); |
@@ -1210,6 +1210,7 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, | |||
.getDropTargetData(); | |||
tree = (Tree) dragEvent.getDropTargetData().getTarget(); | |||
allowedItemIds = getAllowedItemIds(dragEvent, tree); | |||
return allowedItemIds.contains(dropTargetData.getItemIdOver()); | |||
} | |||
@@ -1,17 +1,138 @@ | |||
package com.vaadin.tests.dd; | |||
import com.vaadin.ui.DragDropPane; | |||
import com.vaadin.event.DataBoundTransferable; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.DropHandler; | |||
import com.vaadin.event.dd.acceptCriteria.AcceptAll; | |||
import com.vaadin.event.dd.acceptCriteria.AcceptCriterion; | |||
import com.vaadin.terminal.gwt.client.MouseEventDetails; | |||
import com.vaadin.ui.AbsoluteLayout; | |||
import com.vaadin.ui.Component; | |||
import com.vaadin.ui.DragAndDropWrapper; | |||
import com.vaadin.ui.Label; | |||
import com.vaadin.ui.Window; | |||
import com.vaadin.ui.AbsoluteLayout.ComponentPosition; | |||
import com.vaadin.ui.DragAndDropWrapper.DragStartMode; | |||
import com.vaadin.ui.DragAndDropWrapper.WrapperDropDetails; | |||
import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable; | |||
public class AcceptAnythingWindow extends Window { | |||
private AbsoluteLayout layout = new AbsoluteLayout(); | |||
public AcceptAnythingWindow() { | |||
setCaption("Drop anything here"); | |||
DragDropPane pane = new DragDropPane(); | |||
setContent(pane); | |||
pane.setSizeFull(); | |||
final DragAndDropWrapper wrapper = new DragAndDropWrapper(layout); | |||
wrapper.setDropHandler(new DropHandler() { | |||
public AcceptCriterion getAcceptCriterion() { | |||
return AcceptAll.get(); | |||
} | |||
public void drop(DragAndDropEvent event) { | |||
WrapperDropDetails ed = (WrapperDropDetails) event | |||
.getDropTargetData(); | |||
Transferable transferable = event.getTransferable(); | |||
TransferableImpl ctr = (TransferableImpl) transferable; | |||
// use "component" (from DragDropPane) if available, else | |||
// take | |||
// the source component | |||
Component component = ctr.getSourceComponent(); | |||
if (component == wrapper) { | |||
WrapperTransferable tr = (WrapperTransferable) transferable; | |||
component = tr.getDraggedComponent(); | |||
} | |||
if (component != null) { | |||
if (component.getParent() != layout) { | |||
if (transferable instanceof DataBoundTransferable) { | |||
// Item has been dragged, construct a Label from | |||
// Item id | |||
Label l = new Label(); | |||
l.setSizeUndefined(); | |||
l.setValue("ItemId : " | |||
+ ((DataBoundTransferable) transferable) | |||
.getItemId()); | |||
layout.addComponent(l); | |||
component = l; | |||
} else { | |||
// we have a component that is been dragged, add | |||
// it | |||
// to | |||
// this | |||
layout.addComponent(component); | |||
} | |||
Integer left = ed.getAbsoluteLeft(); | |||
Integer top = ed.getAbsoluteTop(); | |||
MouseEventDetails eventDetails = ed.getMouseEvent(); | |||
int clientX = eventDetails.getClientX(); | |||
int clientY = eventDetails.getClientY(); | |||
try { | |||
layout.getPosition(component).setTopValue( | |||
clientY - top); | |||
layout.getPosition(component).setLeftValue( | |||
clientX - left); | |||
} catch (Exception e) { | |||
// TODO: handle exception | |||
} | |||
} else { | |||
WrapperTransferable tr = (WrapperTransferable) transferable; | |||
// drag ended inside the this Pane | |||
MouseEventDetails start = tr.getMouseDownEvent(); | |||
MouseEventDetails eventDetails = ed.getMouseEvent(); | |||
int deltaX = eventDetails.getClientX() | |||
- start.getClientX(); | |||
int deltaY = eventDetails.getClientY() | |||
- start.getClientY(); | |||
ComponentPosition p = layout.getPosition(component); | |||
p.setTopValue(p.getTopValue() + deltaY); | |||
p.setLeftValue(p.getLeftValue() + deltaX); | |||
} | |||
} else { | |||
// drag coming outside of Vaadin | |||
String object = (String) transferable.getData("text/plain"); | |||
String content = (String) transferable | |||
.getData("fileContents"); | |||
Label l = new Label(); | |||
l.setCaption("Generated from HTML5 drag:"); | |||
if (object != null) { | |||
l.setValue(object); | |||
} else { | |||
l.setValue("HTML5 dd"); | |||
} | |||
l.setDescription(content); | |||
l.setSizeUndefined(); | |||
layout.addComponent(l); | |||
} | |||
return; | |||
} | |||
}); | |||
wrapper.setDragStartMode(DragStartMode.COMPONENT); | |||
wrapper.setSizeFull(); | |||
setContent(wrapper); | |||
setWidth("250px"); | |||
setHeight("100px"); | |||
} | |||
} |
@@ -1,6 +1,6 @@ | |||
package com.vaadin.tests.dd; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.acceptCriteria.AcceptCriterion; | |||
@@ -24,8 +24,8 @@ public class AcceptFromComponent extends Window { | |||
public boolean accepts(DragAndDropEvent dragEvent) { | |||
Transferable transferable = dragEvent.getTransferable(); | |||
if (transferable instanceof ComponentTransferable) { | |||
ComponentTransferable componentTransferrable = (ComponentTransferable) transferable; | |||
if (transferable instanceof TransferableImpl) { | |||
TransferableImpl componentTransferrable = (TransferableImpl) transferable; | |||
if (componentTransferrable.getSourceComponent() == tree1) { | |||
return true; | |||
} |
@@ -4,7 +4,7 @@ import java.util.Collection; | |||
import com.vaadin.data.Item; | |||
import com.vaadin.data.util.HierarchicalContainer; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.DataBoundTransferable; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
@@ -70,8 +70,8 @@ public class DDTest1 extends TestBase { | |||
// e.printStackTrace(); | |||
// } | |||
// System.out.println("Done get to work."); | |||
if (transferable instanceof ComponentTransferable) { | |||
ComponentTransferable ct = (ComponentTransferable) transferable; | |||
if (transferable instanceof TransferableImpl) { | |||
TransferableImpl ct = (TransferableImpl) transferable; | |||
Component component = (Component) ct | |||
.getData("component"); |
@@ -1,8 +1,6 @@ | |||
package com.vaadin.tests.dd; | |||
import java.util.Collection; | |||
import java.util.HashSet; | |||
import java.util.Set; | |||
import com.vaadin.data.Container; | |||
import com.vaadin.data.Item; | |||
@@ -19,6 +17,7 @@ import com.vaadin.event.dd.acceptCriteria.ComponentFilter; | |||
import com.vaadin.event.dd.acceptCriteria.IsDatabound; | |||
import com.vaadin.event.dd.acceptCriteria.Or; | |||
import com.vaadin.event.dd.acceptCriteria.OverTreeNode; | |||
import com.vaadin.event.dd.acceptCriteria.ServerSideCriterion; | |||
import com.vaadin.terminal.Resource; | |||
import com.vaadin.terminal.ThemeResource; | |||
import com.vaadin.tests.components.TestBase; | |||
@@ -28,6 +27,7 @@ import com.vaadin.ui.Table; | |||
import com.vaadin.ui.Tree; | |||
import com.vaadin.ui.Window; | |||
import com.vaadin.ui.AbstractSelect.AbstractSelectDropDetails; | |||
import com.vaadin.ui.Tree.TreeDropDetails; | |||
public class DDTest2 extends TestBase { | |||
@@ -70,13 +70,19 @@ public class DDTest2 extends TestBase { | |||
* explicitly defining them here), but demonstrates lazy initialization | |||
* option if rules are heavy. | |||
*/ | |||
final AcceptCriterion crit = new Tree.TreeDropCriterion() { | |||
final AcceptCriterion crit = new ServerSideCriterion() { | |||
public boolean accepts(DragAndDropEvent dragEvent) { | |||
@Override | |||
protected Set<Object> getAllowedItemIds(DragAndDropEvent dragEvent, | |||
Tree tree) { | |||
HashSet<Object> hashSet = new HashSet<Object>(tree.getItemIds()); | |||
return hashSet; | |||
TreeDropDetails dropTargetData = (TreeDropDetails) dragEvent | |||
.getDropTargetData(); | |||
Object itemIdOver = dropTargetData.getItemIdOver(); | |||
int i = r.nextInt(); | |||
if (i % 2 == 0) { | |||
return true; | |||
} | |||
return false; | |||
} | |||
}; | |||
@@ -15,7 +15,7 @@ import com.vaadin.ui.DragAndDropWrapper; | |||
import com.vaadin.ui.HorizontalLayout; | |||
import com.vaadin.ui.Label; | |||
import com.vaadin.ui.Window; | |||
import com.vaadin.ui.DragAndDropWrapper.DDWrapperTransferable; | |||
import com.vaadin.ui.DragAndDropWrapper.WrapperTransferable; | |||
import com.vaadin.ui.DragAndDropWrapper.DragStartMode; | |||
public class DDTest5 extends TestBase { | |||
@@ -98,8 +98,8 @@ public class DDTest5 extends TestBase { | |||
* here) | |||
*/ | |||
if (dropEvent.getTransferable() instanceof DDWrapperTransferable) { | |||
DDWrapperTransferable transferable = (DDWrapperTransferable) dropEvent | |||
if (dropEvent.getTransferable() instanceof WrapperTransferable) { | |||
WrapperTransferable transferable = (WrapperTransferable) dropEvent | |||
.getTransferable(); | |||
Component sourceComponent = transferable | |||
.getSourceComponent(); |
@@ -2,7 +2,7 @@ package com.vaadin.tests.dd; | |||
import java.util.Iterator; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.DropHandler; | |||
@@ -61,8 +61,8 @@ public class HorizontalLayoutSortableWithWrappers extends Window { | |||
public void drop(DragAndDropEvent dropEvent) { | |||
Transferable transferable = dropEvent.getTransferable(); | |||
if (transferable instanceof ComponentTransferable) { | |||
ComponentTransferable ct = (ComponentTransferable) transferable; | |||
if (transferable instanceof TransferableImpl) { | |||
TransferableImpl ct = (TransferableImpl) transferable; | |||
Component sourceComponent = ct.getSourceComponent(); | |||
if (sourceComponent instanceof WrappedLabel) { | |||
int index = 1; |
@@ -2,7 +2,7 @@ package com.vaadin.tests.dd; | |||
import java.util.Iterator; | |||
import com.vaadin.event.ComponentTransferable; | |||
import com.vaadin.event.TransferableImpl; | |||
import com.vaadin.event.Transferable; | |||
import com.vaadin.event.dd.DragAndDropEvent; | |||
import com.vaadin.event.dd.DropHandler; | |||
@@ -54,8 +54,8 @@ public class HorizontalSortableCssLayoutWithWrappers extends Window { | |||
public void drop(DragAndDropEvent dropEvent) { | |||
Transferable transferable = dropEvent.getTransferable(); | |||
if (transferable instanceof ComponentTransferable) { | |||
ComponentTransferable ct = (ComponentTransferable) transferable; | |||
if (transferable instanceof TransferableImpl) { | |||
TransferableImpl ct = (TransferableImpl) transferable; | |||
Component sourceComponent = ct.getSourceComponent(); | |||
if (sourceComponent instanceof WrappedLabel) { | |||
int index = 1; |