/*******************************************************************************
* Copyright (c) 2013, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* René Brandstetter - Bug 411821 - [QuickAccess] Contribute SearchField
* through a fragment or other means
******************************************************************************/
package org.eclipse.e4.ui.model.internal;
/**
* A holder class for the full information to position an element in a list.
*
* @author René Brandstetter
*/
public final class PositionInfo {
/** The position type to use. */
private final Position position;
/**
* The additional positioning information which can be used to position an
* element relative to another element.
*/
private final String positionReference;
/**
* The {@link PositionInfo} which represent an insert at the beginning of
* the list.
*/
public static final PositionInfo FIRST = new PositionInfo(Position.FIRST, null);
/**
* The {@link PositionInfo} which represent an insert at the end of the
* list.
*/
public static final PositionInfo LAST = new PositionInfo(Position.LAST, null);
/**
* Creates an instance of the PositionInfo.
*
* @param position
* the kind of the positioning
* @param positionReference
* additional information which is need to position an element
* (e.g.: index, ID of another element)
* @throws NullPointerException
* if the <code>position</code> is <code>null</code>
*/
public PositionInfo(Position position, String positionReference) {
if (position == null) {
throw new NullPointerException("No position given!");
}
this.position = position;
this.positionReference = positionReference;
}
/**
* Returns the kind/type of positioning which should be used.
*
* @return the position
*/
public Position getPosition() {
return position;
}
/**
* Returns additional information which is needed to place an element.
*
* @return the positionReference, or <code>null</code> if no additional information is given
*/
public String getPositionReference() {
return positionReference;
}
/**
* Returns the additional information which is needed to place an element as
* an int.
*
* @return the positionReference as an int
* @throws NumberFormatException
* if the {@link #positionReference} can't be parsed to an int
* @throws NullPointerException
* if the {@link #positionReference} is <code>null</code>
*/
public int getPositionReferenceAsInteger() {
return Integer.parseInt(positionReference);
}
/**
* Creates a {@link PositionInfo} object out of the given positioning
* string.
*
* <p>
* <b>Examples for a positioning string:</b>
* <ul>
* <li><code>last</code> - place an element to the end of a list</li>
* <li><code>first</code> - place an element to the beginning of a list</li>
* <li><code>index:3</code> - place an element at the provided index 3 in a
* list</li>
* <li><code>before:org.eclipse.test.id</code> - place an element in a list
* in front of the element with the ID "org.eclipse.test.id"</li>
* <li><code>after:org.eclipse.test.id</code> - place an element in a list
* after the element with the ID "org.eclipse.test.id"</li>
* </ul>
* </p>
*
* @param positionInfo
* the positioning string
* @return a {@link PositionInfo} which holds all the data mentioned in the
* positioning string, or <code>null</code> if the positioning
* string doesn't hold a positioning information
*/
public static PositionInfo parse(String positionInfo) {
Position position = Position.find(positionInfo);
if (position != null) {
switch (position) {
case FIRST:
return PositionInfo.FIRST;
case LAST:
return PositionInfo.LAST;
default:
return new PositionInfo(position, positionInfo.substring(position.prefix.length()));
}
}
return null;
}
@Override
public String toString() {
StringBuilder back = new StringBuilder(position.prefix);
if (positionReference != null) {
back.append(positionReference);
}
return back.toString();
}
}