/** * 2014 Urs Zeidler */ package de.urszeidler.eclipse.shr5Management.impl; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.Map; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.util.BasicDiagnostic; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.DiagnosticChain; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.plugin.EcorePlugin; import org.eclipse.emf.ecore.util.EContentAdapter; import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList; import org.eclipse.emf.ecore.util.EObjectValidator; import org.eclipse.emf.ecore.util.InternalEList; import de.urszeidler.eclipse.shr5.Erlernbar; import de.urszeidler.eclipse.shr5.Shr5Package; import de.urszeidler.eclipse.shr5Management.AttributeChange; import de.urszeidler.eclipse.shr5Management.Changes; import de.urszeidler.eclipse.shr5Management.CharacterDiary; import de.urszeidler.eclipse.shr5Management.CharacterGenerator; import de.urszeidler.eclipse.shr5Management.IncreaseCharacterPart; import de.urszeidler.eclipse.shr5Management.ManagedCharacter; import de.urszeidler.eclipse.shr5Management.PersonaChange; import de.urszeidler.eclipse.shr5Management.PersonaMartialArtChange; import de.urszeidler.eclipse.shr5Management.PersonaValueChange; import de.urszeidler.eclipse.shr5Management.Shr5managementPackage; import de.urszeidler.eclipse.shr5Management.TrainingRange; import de.urszeidler.eclipse.shr5Management.TrainingRate; import de.urszeidler.eclipse.shr5Management.TrainingsTime; import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools; import de.urszeidler.eclipse.shr5Management.util.Shr5managementValidator; /** * <!-- begin-user-doc --> * An implementation of the model object '<em><b>Trainings Time</b></em>'. * <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link de.urszeidler.eclipse.shr5Management.impl.TrainingsTimeImpl#getDaysTrained <em>Days Trained</em>}</li> * <li>{@link de.urszeidler.eclipse.shr5Management.impl.TrainingsTimeImpl#getDaysRemains <em>Days Remains</em>}</li> * <li>{@link de.urszeidler.eclipse.shr5Management.impl.TrainingsTimeImpl#isTrainingComplete <em>Training Complete</em>}</li> * <li>{@link de.urszeidler.eclipse.shr5Management.impl.TrainingsTimeImpl#getTraining <em>Training</em>}</li> * </ul> * </p> * * @generated */ public class TrainingsTimeImpl extends CharacterChangeImpl implements TrainingsTime { /** * The default value of the '{@link #getDaysTrained() <em>Days Trained</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getDaysTrained() * @generated * @ordered */ protected static final int DAYS_TRAINED_EDEFAULT = 0; /** * The default value of the '{@link #getDaysRemains() <em>Days Remains</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getDaysRemains() * @generated * @ordered */ protected static final int DAYS_REMAINS_EDEFAULT = 0; /** * The default value of the '{@link #isTrainingComplete() <em>Training Complete</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #isTrainingComplete() * @generated * @ordered */ protected static final boolean TRAINING_COMPLETE_EDEFAULT = false; /** * The cached value of the '{@link #isTrainingComplete() <em>Training Complete</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #isTrainingComplete() * @generated * @ordered */ protected boolean trainingComplete = TRAINING_COMPLETE_EDEFAULT; /** * The cached value of the '{@link #getTraining() <em>Training</em>}' containment reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getTraining() * @generated * @ordered */ protected EList<TrainingRange> training; private EContentAdapter eContentAdapter; /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated not */ protected TrainingsTimeImpl() { super(); eContentAdapter = new EContentAdapter() { @Override public void notifyChanged(Notification notification) { super.notifyChanged(notification); Object feature = notification.getFeature(); if (Shr5managementPackage.Literals.PERSONA_CHANGE__CHANGEABLE.equals(feature) || Shr5managementPackage.Literals.TRAINING_RANGE__END.equals(feature) || Shr5managementPackage.Literals.TRAINING_RANGE__TRAINING_TIME.equals(feature) || Shr5managementPackage.Literals.PERSONA_MARTIAL_ART_CHANGE__STYLE.equals(feature) || Shr5managementPackage.Literals.PERSONA_MARTIAL_ART_CHANGE__TECHNIQUE.equals(feature)){ TrainingsTimeImpl.this.eNotify(new ENotificationImpl(TrainingsTimeImpl.this, Notification.SET, Shr5managementPackage.Literals.TRAININGS_TIME__DAYS_REMAINS, 1, 2)); TrainingsTimeImpl.this.eNotify(new ENotificationImpl(TrainingsTimeImpl.this, Notification.SET, Shr5managementPackage.Literals.TRAININGS_TIME__DAYS_TRAINED, 1, 2)); if(getDaysRemains()==0) setTrainingComplete(true); } } }; eContentAdapter.setTarget(this); this.eAdapters().add(eContentAdapter); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return Shr5managementPackage.Literals.TRAININGS_TIME; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated not */ public int getDaysTrained() { return calcTrainDays(); } // // /** // * <!-- begin-user-doc --> // * <!-- end-user-doc --> // * @generated not // */ // public void setDaysTrained(int newDaysTrained) { // int oldDaysTrained = daysTrained; // daysTrained = newDaysTrained; // if (eNotificationRequired()) // eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.TRAININGS_TIME__DAYS_TRAINED, oldDaysTrained, daysTrained)); // if (eNotificationRequired()) // eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.TRAININGS_TIME__DAYS_REMAINS, 1, 2)); // } @Override public void setChange(Changes newChange) { Changes oldChange = getChange(); super.setChange(newChange); if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.TRAININGS_TIME__DAYS_REMAINS, 1, 2)); if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.TRAININGS_TIME__DAYS_TRAINED, 1, 2)); if (newChange instanceof PersonaMartialArtChange) { PersonaMartialArtChange pac = (PersonaMartialArtChange)newChange; pac.eAdapters().add(eContentAdapter); } if (oldChange instanceof PersonaMartialArtChange) { PersonaMartialArtChange pac = (PersonaMartialArtChange)oldChange; pac.eAdapters().remove(eContentAdapter); } } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated not */ public int getDaysRemains() { Changes change2 = getChange(); EObject eContainer = eContainer(); ManagedCharacter character = null; if (eContainer instanceof CharacterDiary && eContainer.eContainer() instanceof ManagedCharacter) character = (ManagedCharacter)eContainer.eContainer(); if (change2 != null && character != null) { CharacterGenerator<?> chracterSource = character.getChracterSource(); IncreaseCharacterPart part = null; if (change2 instanceof PersonaMartialArtChange) { PersonaMartialArtChange pmac = (PersonaMartialArtChange)change2; if (pmac.getChangeable() != null) part = ShadowrunManagmentTools.findAdvancment( chracterSource.getGenerator().getCharacterAdvancements().getCharacterAdvancements(), Shr5Package.Literals.PERSONA_MARTIALART_STYLE); else part = ShadowrunManagmentTools.findAdvancment( chracterSource.getGenerator().getCharacterAdvancements().getCharacterAdvancements(), Shr5Package.Literals.PERSONA_MARTIALART_TECHNIQUE); } else if (change2 instanceof PersonaChange) { PersonaChange pc = (PersonaChange)change2; Erlernbar changeable = pc.getChangeable(); part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements().getCharacterAdvancements(), changeable); } else if (change2 instanceof AttributeChange) { part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements().getCharacterAdvancements(), EcorePackage.Literals.EATTRIBUTE); } if (part != null) { int to = ((PersonaValueChange)change2).getTo(); TrainingRate tr = (TrainingRate)ShadowrunManagmentTools.findMatchingRange(to, part.getRangeTableEntries()); int calcDays = ShadowrunManagmentTools.calcDays(tr); return (calcDays * to) - (getDaysTrained()); } } return -1; } private int calcTrainDays() { int t = 0; for (TrainingRange trainingRange : getTraining()) { t += trainingRange.getDaysTrained(); } return t; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public boolean isTrainingComplete() { return trainingComplete; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setTrainingComplete(boolean newTrainingComplete) { boolean oldTrainingComplete = trainingComplete; trainingComplete = newTrainingComplete; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.TRAININGS_TIME__TRAINING_COMPLETE, oldTrainingComplete, trainingComplete)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EList<TrainingRange> getTraining() { if (training == null) { training = new EObjectContainmentWithInverseEList<TrainingRange>(TrainingRange.class, this, Shr5managementPackage.TRAININGS_TIME__TRAINING, Shr5managementPackage.TRAINING_RANGE__TRAINING_TIME); } return training; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated not */ public boolean hasValidRange(DiagnosticChain diagnostics, Map<Object, Object> context) { EList<TrainingRange> training2 = getTraining(); if (training2.size() == 0) return true; TrainingRange overlappingSample = null; if (training2.size() == 1) return checkRange(training2.get(0)); Iterator<TrainingRange> iterator = training2.iterator(); TrainingRange tr = iterator.next(); Date baseDate = tr.getEnd(); while (iterator.hasNext()) { tr = iterator.next(); if (checkRange(tr) && tr.getEnd() != null && baseDate.before(tr.getEnd()) && !tr.getStart().before(baseDate) ) { baseDate = tr.getEnd(); }else{ overlappingSample = tr; } } if (overlappingSample !=null) { if (diagnostics != null) { diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR, Shr5managementValidator.DIAGNOSTIC_SOURCE, Shr5managementValidator.TRAININGS_TIME__HAS_VALID_RANGE, EcorePlugin.INSTANCE.getString("_UI_GenericInvariant_diagnostic", new Object[]{ "hasValidRange", EObjectValidator.getObjectLabel(overlappingSample, context) }), new Object[]{ overlappingSample })); } return false; } return true; } private boolean checkRange(TrainingRange trainingRange) { if (trainingRange.getStart() == null || trainingRange.getEnd() == null) return false; return trainingRange.getEnd().getTime()-trainingRange.getStart().getTime() >= 0 ; // return !trainingRange.getEnd().after(trainingRange.getStart()); //trainingRange.getStart().before(trainingRange.getEnd()); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @SuppressWarnings("unchecked") @Override public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case Shr5managementPackage.TRAININGS_TIME__TRAINING: return ((InternalEList<InternalEObject>)(InternalEList<?>)getTraining()).basicAdd(otherEnd, msgs); } return super.eInverseAdd(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case Shr5managementPackage.TRAININGS_TIME__TRAINING: return ((InternalEList<?>)getTraining()).basicRemove(otherEnd, msgs); } return super.eInverseRemove(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case Shr5managementPackage.TRAININGS_TIME__DAYS_TRAINED: return getDaysTrained(); case Shr5managementPackage.TRAININGS_TIME__DAYS_REMAINS: return getDaysRemains(); case Shr5managementPackage.TRAININGS_TIME__TRAINING_COMPLETE: return isTrainingComplete(); case Shr5managementPackage.TRAININGS_TIME__TRAINING: return getTraining(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @SuppressWarnings("unchecked") @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case Shr5managementPackage.TRAININGS_TIME__TRAINING_COMPLETE: setTrainingComplete((Boolean)newValue); return; case Shr5managementPackage.TRAININGS_TIME__TRAINING: getTraining().clear(); getTraining().addAll((Collection<? extends TrainingRange>)newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case Shr5managementPackage.TRAININGS_TIME__TRAINING_COMPLETE: setTrainingComplete(TRAINING_COMPLETE_EDEFAULT); return; case Shr5managementPackage.TRAININGS_TIME__TRAINING: getTraining().clear(); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case Shr5managementPackage.TRAININGS_TIME__DAYS_TRAINED: return getDaysTrained() != DAYS_TRAINED_EDEFAULT; case Shr5managementPackage.TRAININGS_TIME__DAYS_REMAINS: return getDaysRemains() != DAYS_REMAINS_EDEFAULT; case Shr5managementPackage.TRAININGS_TIME__TRAINING_COMPLETE: return trainingComplete != TRAINING_COMPLETE_EDEFAULT; case Shr5managementPackage.TRAININGS_TIME__TRAINING: return training != null && !training.isEmpty(); } return super.eIsSet(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override @SuppressWarnings("unchecked") public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException { switch (operationID) { case Shr5managementPackage.TRAININGS_TIME___HAS_VALID_RANGE__DIAGNOSTICCHAIN_MAP: return hasValidRange((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1)); } return super.eInvoke(operationID, arguments); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public String toString() { if (eIsProxy()) return super.toString(); StringBuffer result = new StringBuffer(super.toString()); result.append(" (trainingComplete: "); result.append(trainingComplete); result.append(')'); return result.toString(); } } // TrainingsTimeImpl