mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 22:37:15 +00:00
Deleted drag-sort-listview library
This commit is contained in:
1 parent
728f06e4c4
commit
4233e33756
8 files changed
+18
-770
No files matched your search
@@ -1,14 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="tests-jvm/src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry exported="true" kind="lib" path="libs/drag-sort-listview-0.6.1-SNAPSHOT.jar"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.json.simple"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
||||
<classpathentry kind="lib" path="/com.sap.sailing.targetplatform.base/plugins/target-test/mockito-core-1.10.14.jar"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="tests-jvm/src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.json.simple"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
||||
<classpathentry kind="lib" path="/com.sap.sailing.targetplatform.base/plugins/target-test/mockito-core-1.10.14.jar"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
Binary file not shown.
-329
@@ -1,329 +0,0 @@
|
||||
package com.sap.sailing.racecommittee.app.ui.fragments.dialogs;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Loader;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.AdapterView.OnItemLongClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.mobeta.android.dslv.DragSortController;
|
||||
import com.mobeta.android.dslv.DragSortListView;
|
||||
import com.sap.sailing.android.shared.logging.ExLog;
|
||||
import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
|
||||
import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.CompetitorStore;
|
||||
import com.sap.sailing.domain.base.SharedDomainFactory;
|
||||
import com.sap.sailing.domain.common.MaxPointsReason;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.data.DataManager;
|
||||
import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
|
||||
import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
|
||||
import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorPositioningListAdapter;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorsAdapter;
|
||||
import com.sap.sailing.racecommittee.app.ui.comparators.NaturalNamedComparator;
|
||||
import com.sap.sse.common.Named;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
|
||||
public class PositioningFragment extends RaceDialogFragment {
|
||||
|
||||
private DragSortListView positioningListView;
|
||||
private ListView competitorListView;
|
||||
private DragSortController dragSortController;
|
||||
|
||||
private CompetitorsAdapter competitorsAdapter;
|
||||
private CompetitorPositioningListAdapter positioningAdapter;
|
||||
|
||||
protected List<Competitor> competitors;
|
||||
protected CompetitorResults positionedCompetitors;
|
||||
protected Comparator<Named> competitorComparator;
|
||||
|
||||
private int dragStartMode = DragSortController.ON_DRAG;
|
||||
private boolean removeEnabled = true;
|
||||
private int removeMode = DragSortController.FLING_REMOVE;
|
||||
private boolean sortEnabled = true;
|
||||
private boolean dragEnabled = true;
|
||||
|
||||
private boolean isDialog() {
|
||||
return getDialog() != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
if (isDialog()) {
|
||||
getDialog().setTitle(R.string.set_positionings);
|
||||
}
|
||||
return inflater.inflate(R.layout.race_positioning_view, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
if (isDialog()) {
|
||||
Button okButton = (Button) getView().findViewById(R.id.buttonPositionOk);
|
||||
okButton.setVisibility(Button.VISIBLE);
|
||||
okButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
getRaceState().setFinishPositioningConfirmed(MillisecondsTimePoint.now());
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
competitors = new ArrayList<Competitor>();
|
||||
Util.addAll(getRace().getCompetitors(), competitors);
|
||||
competitorComparator = new NaturalNamedComparator();
|
||||
Collections.sort(competitors, competitorComparator);
|
||||
competitorsAdapter = new CompetitorsAdapter(getActivity(), R.layout.welter_grid_competitor_cell, competitors);
|
||||
|
||||
loadCompetitors();
|
||||
|
||||
positionedCompetitors = initializeFinishPositioningList();
|
||||
deletePositionedCompetitorsFromUnpositionedList();
|
||||
positioningAdapter = new CompetitorPositioningListAdapter(getActivity(), R.layout.welter_positioning_item,
|
||||
positionedCompetitors);
|
||||
|
||||
positioningListView = (DragSortListView) getView().findViewById(R.id.dragSortListPositioning);
|
||||
positioningListView.setAdapter(positioningAdapter);
|
||||
positioningListView.setDropListener(new DragSortListView.DropListener() {
|
||||
|
||||
@Override
|
||||
public void drop(int from, int to) {
|
||||
if (from != to) {
|
||||
com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item = positioningAdapter.getItem(from);
|
||||
setItemToNewPositioning(from, to, item);
|
||||
getRaceState().setFinishPositioningListChanged(MillisecondsTimePoint.now(), positionedCompetitors);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
positioningListView.setRemoveListener(new DragSortListView.RemoveListener() {
|
||||
|
||||
@Override
|
||||
public void remove(int toBeRemoved) {
|
||||
com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item = positioningAdapter.getItem(toBeRemoved);
|
||||
onCompetitorRemovedFromPositioningList(item);
|
||||
}
|
||||
});
|
||||
|
||||
positioningListView.setOnItemLongClickListener(new OnItemLongClickListener() {
|
||||
|
||||
@Override
|
||||
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
|
||||
createMaxPointsReasonSelectionDialog(positionedCompetitors.get(position));
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
dragSortController = buildDragSortController(positioningListView);
|
||||
positioningListView.setFloatViewManager(dragSortController);
|
||||
positioningListView.setOnTouchListener(dragSortController);
|
||||
positioningListView.setDragEnabled(dragEnabled);
|
||||
|
||||
competitorListView = (ListView) getView().findViewById(R.id.gridViewPositioning);
|
||||
competitorListView.setAdapter(competitorsAdapter);
|
||||
|
||||
competitorListView.setOnItemClickListener(new OnItemClickListener() {
|
||||
|
||||
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
|
||||
Competitor competitor = (Competitor) competitorsAdapter.getItem(position);
|
||||
ExLog.i(getActivity(), "RaceFinishingFragment", "Grid is clicked at position " + position + " for competitor "
|
||||
+ competitor.getName());
|
||||
onCompetitorClickedOnGrid(competitor);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a DragSortController and thereby defines the behaviour of the drag sort list
|
||||
*/
|
||||
public DragSortController buildDragSortController(DragSortListView dragSortListView) {
|
||||
DragSortController controller = new DragSortController(dragSortListView);
|
||||
controller.setDragHandleId(R.id.drag_handle);
|
||||
controller.setFlingHandleId(R.id.drag_handle);
|
||||
controller.setRemoveEnabled(removeEnabled);
|
||||
controller.setSortEnabled(sortEnabled);
|
||||
controller.setDragInitMode(dragStartMode);
|
||||
controller.setRemoveMode(removeMode);
|
||||
controller.setBackgroundColor(getActivity().getResources().getColor(R.color.welter_medium_blue));
|
||||
return controller;
|
||||
}
|
||||
|
||||
private void loadCompetitors() {
|
||||
getActivity().setProgressBarIndeterminateVisibility(true);
|
||||
|
||||
// invalidate all competitors of this race
|
||||
ReadonlyDataManager dataManager = OnlineDataManager.create(getActivity());
|
||||
SharedDomainFactory domainFactory = dataManager.getDataStore().getDomainFactory();
|
||||
for (Competitor competitor : getRace().getCompetitors()) {
|
||||
domainFactory.getCompetitorStore().allowCompetitorResetToDefaults(competitor);
|
||||
}
|
||||
|
||||
Loader<?> competitorLoaders = getLoaderManager().initLoader(0, null,
|
||||
dataManager.createCompetitorsLoader(getRace(), new LoadClient<Collection<Competitor>>() {
|
||||
|
||||
@Override
|
||||
public void onLoadFailed(Exception reason) {
|
||||
getActivity().setProgressBarIndeterminateVisibility(false);
|
||||
String toastText = getString(R.string.competitor_load_error);
|
||||
Toast.makeText(getActivity(), String.format(toastText, reason.toString()),
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadSucceeded(Collection<Competitor> data, boolean isCached) {
|
||||
if (!isCached) {
|
||||
getActivity().setProgressBarIndeterminateVisibility(false);
|
||||
}
|
||||
onLoadCompetitorsSucceeded(data);
|
||||
}
|
||||
|
||||
}));
|
||||
// Force load to get non-cached remote competitors...
|
||||
competitorLoaders.forceLoad();
|
||||
}
|
||||
|
||||
protected void onLoadCompetitorsSucceeded(Collection<Competitor> data) {
|
||||
competitors.clear();
|
||||
competitors.addAll(data);
|
||||
Collections.sort(competitors, competitorComparator);
|
||||
deleteObsoleteCompetitorsFromPositionedList(data);
|
||||
deletePositionedCompetitorsFromUnpositionedList();
|
||||
competitorsAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void deleteObsoleteCompetitorsFromPositionedList(Collection<Competitor> validCompetitors) {
|
||||
List<com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>> toBeDeleted = new ArrayList<com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>>();
|
||||
for (com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> positionedItem : positionedCompetitors) {
|
||||
if (!validCompetitors.contains(getCompetitorStore().getExistingCompetitorById(positionedItem.getA()))) {
|
||||
toBeDeleted.add(positionedItem);
|
||||
}
|
||||
}
|
||||
positionedCompetitors.removeAll(toBeDeleted);
|
||||
}
|
||||
|
||||
private void deletePositionedCompetitorsFromUnpositionedList() {
|
||||
for (com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> positionedItem : positionedCompetitors) {
|
||||
Competitor competitor = getCompetitorStore().getExistingCompetitorById(positionedItem.getA());
|
||||
competitors.remove(competitor);
|
||||
}
|
||||
}
|
||||
|
||||
private CompetitorResults initializeFinishPositioningList() {
|
||||
CompetitorResults positionings = getRaceState().getFinishPositioningList();
|
||||
return positionings == null ? new CompetitorResultsImpl() : positionings;
|
||||
}
|
||||
|
||||
private void setItemToNewPositioning(int from, int to, com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item) {
|
||||
positioningAdapter.remove(item);
|
||||
positioningAdapter.insert(item, to);
|
||||
}
|
||||
|
||||
private void createMaxPointsReasonSelectionDialog(final com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_AlertDialog);
|
||||
final CharSequence[] maxPointsReasons = getAllMaxPointsReasons();
|
||||
builder.setTitle(R.string.select_penalty_reason).setItems(maxPointsReasons,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int position) {
|
||||
setMaxPointsReasonForItem(item, maxPointsReasons[position]);
|
||||
}
|
||||
});
|
||||
builder.create().show();
|
||||
}
|
||||
|
||||
private CharSequence[] getAllMaxPointsReasons() {
|
||||
List<CharSequence> result = new ArrayList<CharSequence>();
|
||||
for (MaxPointsReason reason : MaxPointsReason.values()) {
|
||||
result.add(reason.name());
|
||||
}
|
||||
return result.toArray(new CharSequence[result.size()]);
|
||||
}
|
||||
|
||||
protected void setMaxPointsReasonForItem(com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item,
|
||||
CharSequence maxPointsReasonName) {
|
||||
MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName.toString());
|
||||
com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> newItem = new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(
|
||||
item.getA(), item.getB(), maxPointsReason);
|
||||
int currentIndexOfItem = positionedCompetitors.indexOf(item);
|
||||
replaceItemInPositioningList(currentIndexOfItem, item, newItem);
|
||||
|
||||
if (!maxPointsReason.equals(MaxPointsReason.NONE)) {
|
||||
setCompetitorToBottomOfPositioningList(newItem);
|
||||
}
|
||||
getRaceState().setFinishPositioningListChanged(MillisecondsTimePoint.now(), positionedCompetitors);
|
||||
}
|
||||
|
||||
private void replaceItemInPositioningList(int currentIndexOfItem,
|
||||
com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item, com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> newItem) {
|
||||
positioningAdapter.remove(item);
|
||||
positioningAdapter.insert(newItem, currentIndexOfItem);
|
||||
}
|
||||
|
||||
private void setCompetitorToBottomOfPositioningList(com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item) {
|
||||
int currentIndex = positionedCompetitors.indexOf(item);
|
||||
int lastIndex = positionedCompetitors.size() - 1;
|
||||
setItemToNewPositioning(currentIndex, lastIndex, item);
|
||||
}
|
||||
|
||||
protected void onCompetitorClickedOnGrid(Competitor competitor) {
|
||||
addNewCompetitorToPositioningList(competitor);
|
||||
removeCompetitorFromGrid(competitor);
|
||||
getRaceState().setFinishPositioningListChanged(MillisecondsTimePoint.now(), positionedCompetitors);
|
||||
}
|
||||
|
||||
protected void removeCompetitorFromGrid(Competitor competitor) {
|
||||
competitors.remove(competitor);
|
||||
Collections.sort(competitors, competitorComparator);
|
||||
competitorsAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void addNewCompetitorToPositioningList(Competitor competitor) {
|
||||
|
||||
positionedCompetitors.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(competitor.getId(), competitor
|
||||
.getName(), MaxPointsReason.NONE));
|
||||
positioningAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
protected void onCompetitorRemovedFromPositioningList(com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item) {
|
||||
Competitor competitor = getCompetitorStore().getExistingCompetitorById(item.getA());
|
||||
addNewCompetitorToCompetitorList(competitor);
|
||||
removeCompetitorFromPositionings(item);
|
||||
getRaceState().setFinishPositioningListChanged(MillisecondsTimePoint.now(), positionedCompetitors);
|
||||
}
|
||||
|
||||
private void addNewCompetitorToCompetitorList(Competitor competitor) {
|
||||
competitors.add(competitor);
|
||||
Collections.sort(competitors, competitorComparator);
|
||||
competitorsAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
protected void removeCompetitorFromPositionings(com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason> item) {
|
||||
positionedCompetitors.remove(item);
|
||||
positioningAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private CompetitorStore getCompetitorStore() {
|
||||
return DataManager.create(getActivity()).getDataStore().getDomainFactory().getCompetitorStore();
|
||||
}
|
||||
|
||||
}
|
||||
-419
@@ -1,419 +0,0 @@
|
||||
package com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Loader;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.AdapterView.OnItemLongClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.GridView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.mobeta.android.dslv.DragSortController;
|
||||
import com.mobeta.android.dslv.DragSortListView;
|
||||
import com.sap.sailing.domain.base.ControlPoint;
|
||||
import com.sap.sailing.domain.base.ControlPointWithTwoMarks;
|
||||
import com.sap.sailing.domain.base.CourseBase;
|
||||
import com.sap.sailing.domain.base.Mark;
|
||||
import com.sap.sailing.domain.base.Waypoint;
|
||||
import com.sap.sailing.domain.base.impl.ControlPointWithTwoMarksImpl;
|
||||
import com.sap.sailing.domain.base.impl.CourseDataImpl;
|
||||
import com.sap.sailing.domain.base.impl.WaypointImpl;
|
||||
import com.sap.sailing.domain.common.PassingInstruction;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.data.DataManager;
|
||||
import com.sap.sailing.racecommittee.app.data.InMemoryDataStore;
|
||||
import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
|
||||
import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.coursedesign.CourseElementListAdapter;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.coursedesign.CourseListDataElement;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.coursedesign.DraggableCourseElementListAdapter;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.coursedesign.MarkGridAdapter;
|
||||
import com.sap.sailing.racecommittee.app.ui.comparators.NaturalNamedComparator;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.utils.ESSMarkImageHelper;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
|
||||
public class ESSCourseDesignDialog extends RaceDialogFragment {
|
||||
// private final static String TAG =
|
||||
// ESSCourseDesignDialogFragment.class.getName();
|
||||
|
||||
private static int MarksLoaderId = 0;
|
||||
|
||||
private List<Mark> aMarkList;
|
||||
private MarkGridAdapter gridAdapter;
|
||||
private List<CourseListDataElement> courseElements;
|
||||
private List<CourseListDataElement> previousCourseElements;
|
||||
private DraggableCourseElementListAdapter courseElementAdapter;
|
||||
private CourseElementListAdapter previousCourseElementAdapter;
|
||||
private DragSortListView newCourseListView;
|
||||
private ListView previousCourseListView;
|
||||
|
||||
private DragSortController dragSortController;
|
||||
|
||||
private Button publishButton;
|
||||
private Button unpublishButton;
|
||||
private Button takePreviousButton;
|
||||
|
||||
private ReadonlyDataManager dataManager;
|
||||
|
||||
private int dragStartMode = DragSortController.ON_DRAG;
|
||||
private boolean removeEnabled = true;
|
||||
private int removeMode = DragSortController.FLING_REMOVE;
|
||||
private boolean sortEnabled = true;
|
||||
private boolean dragEnabled = true;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.race_choose_ess_course_design_view, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
getDialog().setTitle(getActivity().getText(R.string.course_design_dialog_title));
|
||||
dataManager = DataManager.create(getActivity());
|
||||
aMarkList = new ArrayList<Mark>();
|
||||
courseElements = new ArrayList<CourseListDataElement>();
|
||||
previousCourseElements = new ArrayList<CourseListDataElement>();
|
||||
gridAdapter = new MarkGridAdapter(getActivity(), aMarkList, ESSMarkImageHelper.getInstance());
|
||||
courseElementAdapter = new DraggableCourseElementListAdapter(getActivity(), courseElements,
|
||||
ESSMarkImageHelper.getInstance());
|
||||
previousCourseElementAdapter = new CourseElementListAdapter(getActivity(), previousCourseElements,
|
||||
ESSMarkImageHelper.getInstance());
|
||||
loadMarks();
|
||||
fillPreviousCourseElementsWithLastPublishedCourseDesign();
|
||||
GridView gridView = (GridView) getView().findViewById(R.id.gridViewAssets);
|
||||
gridView.setAdapter(gridAdapter);
|
||||
gridView.setOnItemClickListener(new OnItemClickListener() {
|
||||
|
||||
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
|
||||
Mark mark = (Mark) gridAdapter.getItem(position);
|
||||
Log.i("CourseDesign", "Grid is clicked at position " + position + " for buoy " + mark.getName());
|
||||
onMarkClickedOnGrid(mark);
|
||||
}
|
||||
});
|
||||
newCourseListView = (DragSortListView) getView().findViewById(R.id.listViewNewCourse);
|
||||
newCourseListView.setAdapter(courseElementAdapter);
|
||||
newCourseListView.setDropListener(new DragSortListView.DropListener() {
|
||||
@Override
|
||||
public void drop(int from, int to) {
|
||||
if (from != to) {
|
||||
CourseListDataElement item = courseElementAdapter.getItem(from);
|
||||
courseElementAdapter.remove(item);
|
||||
courseElementAdapter.insert(item, to);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
newCourseListView.setRemoveListener(new DragSortListView.RemoveListener() {
|
||||
@Override
|
||||
public void remove(int toBeRemoved) {
|
||||
CourseListDataElement item = courseElementAdapter.getItem(toBeRemoved);
|
||||
courseElementAdapter.remove(item);
|
||||
}
|
||||
});
|
||||
|
||||
newCourseListView.setOnItemLongClickListener(new OnItemLongClickListener() {
|
||||
@Override
|
||||
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
|
||||
CourseListDataElement courseElement = courseElementAdapter.getItem(position);
|
||||
createPassingInstructionDialog(courseElement);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
dragSortController = buildDragSortController(newCourseListView);
|
||||
newCourseListView.setFloatViewManager(dragSortController);
|
||||
newCourseListView.setOnTouchListener(dragSortController);
|
||||
newCourseListView.setDragEnabled(dragEnabled);
|
||||
|
||||
if (getRace().getCourseDesign() != null) {
|
||||
fillCourseElementsInList();
|
||||
}
|
||||
|
||||
previousCourseListView = (ListView) getView().findViewById(R.id.listViewPreviousCourse);
|
||||
previousCourseListView.setAdapter(previousCourseElementAdapter);
|
||||
|
||||
takePreviousButton = (Button) getView().findViewById(R.id.takePreviousCourseDesignButton);
|
||||
takePreviousButton.setOnClickListener(new OnClickListener() {
|
||||
public void onClick(View arg0) {
|
||||
if (!previousCourseElements.isEmpty()) {
|
||||
if (!courseElements.isEmpty()) {
|
||||
createUsePreviousCourseDialog();
|
||||
} else {
|
||||
copyPreviousToNewCourseDesign();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(getActivity(), "No course available to copy", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
publishButton = (Button) getView().findViewById(R.id.publishCourseDesignButton);
|
||||
publishButton.setOnClickListener(new OnClickListener() {
|
||||
public void onClick(View arg0) {
|
||||
try {
|
||||
CourseBase courseData = convertCourseElementsToACourseData();
|
||||
sendCourseDataAndDismiss(courseData);
|
||||
} catch (IllegalStateException ex) {
|
||||
if (ex.getMessage().equals("Missing second mark")) {
|
||||
Toast.makeText(getActivity(),
|
||||
"The selected passing instructions require two buoys. Please select the second buoy.",
|
||||
Toast.LENGTH_LONG).show();
|
||||
} else if (ex.getMessage().equals("Each waypoints needs passing instructions")) {
|
||||
Toast.makeText(
|
||||
getActivity(),
|
||||
"A waypoint has no passing instructions. Please select the passing instruction by clicking long on the waypoint.",
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
} catch (IllegalArgumentException ex) {
|
||||
Toast.makeText(getActivity(), "The course design has to have at least one waypoint.",
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
unpublishButton = (Button) getView().findViewById(R.id.unpublishCourseDesignButton);
|
||||
unpublishButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
CourseBase emptyCourse = new CourseDataImpl("Unpublished course design");
|
||||
sendCourseDataAndDismiss(emptyCourse);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a DragSortController and thereby defines the behavior of the drag sort list
|
||||
*/
|
||||
public DragSortController buildDragSortController(DragSortListView dragSortListView) {
|
||||
DragSortController controller = new DragSortController(dragSortListView);
|
||||
controller.setDragHandleId(R.id.drag_handle);
|
||||
controller.setFlingHandleId(R.id.drag_handle);
|
||||
controller.setRemoveEnabled(removeEnabled);
|
||||
controller.setSortEnabled(sortEnabled);
|
||||
controller.setDragInitMode(dragStartMode);
|
||||
controller.setRemoveMode(removeMode);
|
||||
controller.setBackgroundColor(getActivity().getResources().getColor(R.color.welter_medium_blue));
|
||||
return controller;
|
||||
}
|
||||
|
||||
private void fillPreviousCourseElementsWithLastPublishedCourseDesign() {
|
||||
CourseBase lastPublishedCourseDesign = InMemoryDataStore.INSTANCE.getLastPublishedCourseDesign();
|
||||
if (lastPublishedCourseDesign != null) {
|
||||
fillPreviousCourseElementsInList(lastPublishedCourseDesign);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadMarks() {
|
||||
Loader<?> marksLoader = getLoaderManager().restartLoader(MarksLoaderId, null,
|
||||
dataManager.createMarksLoader(getRace(), new LoadClient<Collection<Mark>>() {
|
||||
@Override
|
||||
public void onLoadFailed(Exception reason) {
|
||||
Toast.makeText(getActivity(), String.format("Marks: %s", reason.toString()), Toast.LENGTH_LONG)
|
||||
.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadSucceeded(Collection<Mark> data, boolean isCached) {
|
||||
onLoadMarksSucceeded(data);
|
||||
}
|
||||
}));
|
||||
// ignore any cached results and force a remote load of the marks,
|
||||
// because we always need the most current.
|
||||
marksLoader.forceLoad();
|
||||
}
|
||||
|
||||
protected void onLoadMarksSucceeded(Collection<Mark> data) {
|
||||
aMarkList.clear();
|
||||
aMarkList.addAll(data);
|
||||
Collections.sort(aMarkList, new NaturalNamedComparator());
|
||||
gridAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void fillPreviousCourseElementsInList(CourseBase previousCourseData) {
|
||||
if (previousCourseData != null) {
|
||||
previousCourseElements.clear();
|
||||
previousCourseElements.addAll(convertCourseDesignToCourseElements(previousCourseData));
|
||||
previousCourseElementAdapter.notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void fillCourseElementsInList() {
|
||||
courseElements.clear();
|
||||
courseElements.addAll(convertCourseDesignToCourseElements(getRace().getCourseDesign()));
|
||||
courseElementAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
protected List<CourseListDataElement> convertCourseDesignToCourseElements(CourseBase courseData) {
|
||||
List<CourseListDataElement> elementList = new ArrayList<CourseListDataElement>();
|
||||
for (Waypoint waypoint : courseData.getWaypoints()) {
|
||||
ControlPoint controlPoint = waypoint.getControlPoint();
|
||||
if (controlPoint instanceof Mark) {
|
||||
CourseListDataElement element = new CourseListDataElement();
|
||||
element.setLeftMark((Mark) controlPoint);
|
||||
element.setPassingInstructions(waypoint.getPassingInstructions());
|
||||
elementList.add(element);
|
||||
} else if (controlPoint instanceof ControlPointWithTwoMarks) {
|
||||
ControlPointWithTwoMarks controlPointTwoMarks = (ControlPointWithTwoMarks) controlPoint;
|
||||
CourseListDataElement element = new CourseListDataElement();
|
||||
element.setLeftMark(controlPointTwoMarks.getLeft());
|
||||
element.setRightMark(controlPointTwoMarks.getRight());
|
||||
element.setPassingInstructions(waypoint.getPassingInstructions());
|
||||
elementList.add(element);
|
||||
}
|
||||
}
|
||||
return elementList;
|
||||
}
|
||||
|
||||
protected void sendCourseDataAndDismiss(CourseBase courseDesign) {
|
||||
getRaceState().setCourseDesign(MillisecondsTimePoint.now(), courseDesign);
|
||||
saveChangedCourseDesignInCache(courseDesign);
|
||||
dismiss();
|
||||
}
|
||||
|
||||
private void saveChangedCourseDesignInCache(CourseBase courseDesign) {
|
||||
if (!Util.isEmpty(courseDesign.getWaypoints())) {
|
||||
InMemoryDataStore.INSTANCE.setLastPublishedCourseDesign(courseDesign);
|
||||
}
|
||||
}
|
||||
|
||||
protected CourseBase convertCourseElementsToACourseData() throws IllegalStateException, IllegalArgumentException {
|
||||
// TODO find a proper name for the highly flexible ESS courses to be shown on the regatta overview page
|
||||
CourseBase design = new CourseDataImpl("Course");
|
||||
List<Waypoint> waypoints = new ArrayList<Waypoint>();
|
||||
for (CourseListDataElement courseElement : courseElements) {
|
||||
if ((courseElement.getPassingInstructions().equals(PassingInstruction.Gate)
|
||||
|| courseElement.getPassingInstructions().equals(PassingInstruction.Line) || courseElement
|
||||
.getPassingInstructions().equals(PassingInstruction.Offset))) {
|
||||
if (courseElement.getRightMark() != null) {
|
||||
String cpwtmName = "ControlPointWithTwoMarks " + courseElement.getLeftMark().getName() + " / "
|
||||
+ courseElement.getRightMark().getName();
|
||||
ControlPointWithTwoMarks cpwtm = new ControlPointWithTwoMarksImpl(courseElement.getLeftMark(),
|
||||
courseElement.getRightMark(), cpwtmName);
|
||||
Waypoint waypoint = new WaypointImpl(cpwtm, courseElement.getPassingInstructions());
|
||||
|
||||
waypoints.add(waypoint);
|
||||
} else {
|
||||
throw new IllegalStateException("Missing second mark");
|
||||
}
|
||||
} else if (courseElement.getPassingInstructions().equals(PassingInstruction.None)) {
|
||||
throw new IllegalStateException("Each waypoints needs passing instructions");
|
||||
} else {
|
||||
Waypoint waypoint = new WaypointImpl(courseElement.getLeftMark(),
|
||||
courseElement.getPassingInstructions());
|
||||
|
||||
waypoints.add(waypoint);
|
||||
}
|
||||
|
||||
}
|
||||
if (waypoints.isEmpty()) {
|
||||
throw new IllegalArgumentException("The course design to be published has no waypoints.");
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (Waypoint waypoint : waypoints) {
|
||||
design.addWaypoint(i++, waypoint);
|
||||
}
|
||||
|
||||
return design;
|
||||
}
|
||||
|
||||
private void createUsePreviousCourseDialog() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setTitle(getString(R.string.use_previous_course_dialog_title));
|
||||
builder.setMessage(getString(R.string.use_previous_course_dialog_message));
|
||||
builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
copyPreviousToNewCourseDesign();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
// do nothing
|
||||
}
|
||||
});
|
||||
builder.create();
|
||||
builder.show();
|
||||
}
|
||||
|
||||
protected void copyPreviousToNewCourseDesign() {
|
||||
courseElements.clear();
|
||||
courseElements.addAll(previousCourseElements);
|
||||
courseElementAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
protected void onMarkClickedOnGrid(Mark mark) {
|
||||
if (courseElements.isEmpty()) {
|
||||
addNewCourseElementToList(mark);
|
||||
} else {
|
||||
CourseListDataElement twoMarksCourseElement = getFirstTwoMarksCourseElementWithoutRightMark();
|
||||
if (twoMarksCourseElement != null) {
|
||||
twoMarksCourseElement.setRightMark(mark);
|
||||
courseElementAdapter.notifyDataSetChanged();
|
||||
} else {
|
||||
addNewCourseElementToList(mark);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private CourseListDataElement getFirstTwoMarksCourseElementWithoutRightMark() {
|
||||
for (CourseListDataElement courseElement : courseElements) {
|
||||
if ((courseElement.getPassingInstructions().equals(PassingInstruction.Gate)
|
||||
|| courseElement.getPassingInstructions().equals(PassingInstruction.Line) || courseElement
|
||||
.getPassingInstructions().equals(PassingInstruction.Offset))
|
||||
&& courseElement.getRightMark() == null) {
|
||||
return courseElement;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void addNewCourseElementToList(Mark mark) {
|
||||
CourseListDataElement courseElement = new CourseListDataElement();
|
||||
courseElement.setLeftMark(mark);
|
||||
createPassingInstructionDialog(courseElement);
|
||||
}
|
||||
|
||||
private void createPassingInstructionDialog(final CourseListDataElement courseElement) {
|
||||
List<String> instructions = new ArrayList<String>();
|
||||
for (PassingInstruction instruction : PassingInstruction.relevantValues()) {
|
||||
instructions.add(instruction.name());
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_AlertDialog);
|
||||
builder.setTitle(R.string.pick_a_rounding_direction).setItems(R.array.rounding_directions,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int position) {
|
||||
PassingInstruction pickedDirection = PassingInstruction.relevantValues()[position];
|
||||
onPassingInstructionPicked(courseElement, pickedDirection);
|
||||
}
|
||||
});
|
||||
builder.create().show();
|
||||
}
|
||||
|
||||
protected void onPassingInstructionPicked(CourseListDataElement courseElement, PassingInstruction pickedDirection) {
|
||||
courseElement.setPassingInstructions(pickedDirection);
|
||||
if (!courseElements.contains(courseElement)) {
|
||||
courseElements.add(courseElement);
|
||||
}
|
||||
courseElementAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -7,7 +7,7 @@ import android.widget.Button;
|
||||
|
||||
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PositioningFragment;
|
||||
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
@@ -23,7 +23,7 @@ public class ESSFinishedRaceFragment extends BaseFinishedRaceFragment<ESSRacingP
|
||||
public void onClick(View v) {
|
||||
PositioningFragment fragment = new PositioningFragment();
|
||||
fragment.setArguments(PositioningFragment.createArguments(getRace()));
|
||||
fragment.show(getFragmentManager(), null);
|
||||
// fragment.show(getFragmentManager(), null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+2
-2
@@ -7,7 +7,7 @@ import android.widget.Button;
|
||||
|
||||
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.league.LeagueRacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PositioningFragment;
|
||||
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
@@ -23,7 +23,7 @@ public class LeagueFinishedRaceFragment extends BaseFinishedRaceFragment<LeagueR
|
||||
public void onClick(View v) {
|
||||
PositioningFragment fragment = new PositioningFragment();
|
||||
fragment.setArguments(PositioningFragment.createArguments(getRace()));
|
||||
fragment.show(getFragmentManager(), null);
|
||||
// fragment.show(getFragmentManager(), null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import android.os.Bundle;
|
||||
|
||||
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PositioningFragment;
|
||||
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
|
||||
-3
@@ -6,7 +6,6 @@ import com.sap.sailing.racecommittee.app.domain.ManagedRace;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByMapCourseDesignDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByNameCourseDesignDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ESSCourseDesignDialog;
|
||||
|
||||
public class CourseDesignerChooser {
|
||||
|
||||
@@ -17,8 +16,6 @@ public class CourseDesignerChooser {
|
||||
switch (mode) {
|
||||
case BY_MAP:
|
||||
return new ByMapCourseDesignDialog();
|
||||
case BY_MARKS:
|
||||
return new ESSCourseDesignDialog();
|
||||
case BY_NAME:
|
||||
default:
|
||||
return new ByNameCourseDesignDialog();
|
||||
|
||||
Reference in new issue
Block a user