/**
* FyLLGen - A Java based tool for collecting and distributing family data
*
* Copyright (C) 2007-2011 Christian Packenius
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.chris_soft.fyllgen.menu.edit;
import java.util.List;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import de.chris_soft.fyllgen.GUI;
import de.chris_soft.fyllgen.data.Family;
import de.chris_soft.fyllgen.data.OptionData;
import de.chris_soft.fyllgen.data.Person;
import de.chris_soft.fyllgen.data.Relationship;
import de.chris_soft.fyllgen.data.RelationshipPartners;
import de.chris_soft.fyllgen.utilities.SwtUtilities;
import de.chris_soft.fyllgen.widget.dialog.MultiPersonChoiceShell;
import de.chris_soft.fyllgen.widget.dialog.PersonChoiceShell;
/**
* Selection-Listener f�r das Erzeugen eines Partners der aktuellen Person.
* @author Christian Packenius, Juni 2008.
*/
public class InsertPartnerPerson implements Listener {
/**
* Event-Handler f�r Erzeugung eines Partners.
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event) {
// Vorneweg aktuelle Person merken.
Person current = Family.instance.getCurrentPerson();
// Dialog vorbereiten.
PersonChoiceShell pcs = new PersonChoiceShell(GUI.instance.shell, "Partner hinzuf�gen", "Als Partner eintragen",
"Neuen Partner erzeugen", 2, false, null, false);
// Die Person selbst kann sich nicht als Partner haben, auch die Eltern und
// Kinder nicht.
// Vorhandene Partner ebenfalls l�schen.
pcs.removePerson(current);
for (Person person : current.getChildren()) {
pcs.removePerson(person);
}
for (Person person : current.getParents()) {
pcs.removePerson(person);
}
for (Person person : current.getPartner()) {
pcs.removePerson(person);
}
// Zu junge/alte Personen l�schen.
if (!current.getValueView(Person.BIRTHDAY).endsWith("?")) {
// Wenn die Leute vor dieser Person starben, l�schen.
pcs.removePersonsBetweenDates(Person.DEATHDAY, "0.0.0", current.getValueView(Person.BIRTHDAY), null);
// Wenn die Leute erst nach dieser Person geboren wurden, l�schen.
pcs.removePersonsBetweenDates(Person.BIRTHDAY, current.getValueView(Person.DEATHDAY), "99.99.9999", new int[] {
0, 0, 10 });
}
// Dialog starten.
pcs.open();
Person partner = null;
String defaultRelationship = OptionData.instance.getComboKey(OptionData.DEFAULT_PARTNER_TYPE);
if (pcs.personChoice != null) {
// Es wurde eine vorhandene Person angew�hlt.
Family.instance.getCurrentPerson().addPartner(pcs.personChoice, defaultRelationship);
Family.instance.review();
partner = pcs.personChoice;
}
else if (pcs.newPersonName != null) {
partner = new Person();
partner.setValue(Person.NAME, pcs.newPersonName);
Family.instance.addNewPerson(partner);
Family.instance.getCurrentPerson().addPartner(partner, defaultRelationship);
Family.instance.setCurrentPerson(partner, 2);
}
else {
return;
}
// Kl�ren, welcher Art (Ehe?) die Partnerschaft ist.
askForMarriage(current, partner);
// Da nun ein Partner eingetragen wurde, auch f�r jedes Kind einzeln
// nachfragen, ob es dessen Kind ist.
String msgText = "Bei welchen der folgenden Personen soll <" + partner.getValueView(Person.NAME);
msgText += "> noch zus�tzlich als Elternteil eingetragen werden?";
MultiPersonChoiceShell mpcs = new MultiPersonChoiceShell(GUI.instance.shell, "Elternteil hinzuf�gen", msgText);
// Alle Kinder der aktuellen Person angeben.
Person[] children = current.getChildren();
for (Person child : children) {
if (!partner.hasChild(child)) {
mpcs.add(child, null, true, true);
}
}
// Dialog �ffnen.
mpcs.open();
// Hat der User den Dialog �ber den OK-Button verlassen?
if (mpcs.bPressedOkay) {
// Ja, also hier bei allen angeklickten Personen ebenfalls
// parent-child-Beziehung eintragen.
List<Person> list = mpcs.getCheckedPersons();
for (Person child : list) {
partner.addChild(child);
}
Family.instance.review();
}
}
/**
* Kl�rt, ob die zwei verheiratet sind.
*/
private void askForMarriage(Person current, Person partner) {
String currentPersonName = current.getValueView(Person.NAME);
String partnerName = partner.getValueView(Person.NAME);
String quest = "Sind " + currentPersonName + " und " + partnerName + " verheiratet?";
if (SwtUtilities.askYesNo(GUI.instance.shell, quest, "Frage zu den Partnern")) {
current.getRelationship(partner).setValue(Relationship.TYPE, RelationshipPartners.MARRIAGE);
Family.instance.review();
}
GUI.instance.selectTab(GUI.TAB_PARTNER);
}
}