/*
Datei............: Aufg1109.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 21.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 11.09
Kommentare.......:

Diese Aufgabe war sicherlich nicht ganz einfach zu lösen, denn
der Umgang mit den Datumsklassen in Java ist nicht ganz 
unproblematisch. Hier wurden folgende Teillösungen implementiert:

- Das eingegebene Datum wird mit einem StringTokenizer geparst
  und in eine Variable des Typs GregorianCalendar umgewandelt.
- Die deutschen Monatsnamen für die Ausgabe der Titelzeile werden
  in einer Arraykonstanten gehalten.
- Auf die Bestandteile Tag, Monat und Jahr wird mit den Methoden
  get und set zugegriffen. Dabei ist zu beachten, daß der Monat
  von 0 bis 11 läuft und das Jahr vierstellig abgelegt wird.
- Der Wochentag des Monatsersten wird bestimmt, indem der Tag des
  Kalenderobjekts auf 1 gesetzt wird und durch Aufruf von get das
  Feld mit der Bezeichnung DAY_OF_WEEK abgefragt wird.
- Die Anzahl der Tage des ausgewählten Monats wird per Hand
  unter Berücksichtigung eines möglichen Schlatjahrs bestimmt.
- Die Ausgabe des Kalenders erfolgt in einer simplen Schleife über
  alle Tage des Monats, wobei jeweils nach dem Sonntag und am Ende
  der Schleife ein Zeilenumbruch ausgegeben wird.
*/
import java.util.*;

public class Aufg1109
{
  public static void main(String args[])
  {
	PrintedCalendar prcal = new PrintedCalendar(args);
	prcal.print();
  }
}

class PrintedCalendar
{
  //Konstanten
  static final String MONTHNAMES[] = {
	"Januar",
	"Februar",
	"März",
	"April",
	"Mai",
	"Juni",
	"Juli",
	"August",
	"September",
	"Oktober",
	"November",
	"Dezember"
  };

  //Instanzmerkmale
  GregorianCalendar cal;

  public PrintedCalendar(String args[])
  {
	createCalendar(args);
  }

  private void createCalendar(String args[])
  {
	//Alle Argumente in einem String zusammenfassen
	String argstring = "";
	for (int i = 0; i < args.length; ++i) {
	  argstring += args[i] + " ";
	}
	//String tokenisieren (muß das Format dd.mm.yy haben)
	StringTokenizer st = new StringTokenizer(argstring," \t\r\n.");
	if (st.countTokens() >= 3) {
	  int day = Integer.parseInt(st.nextToken());
	  int month = Integer.parseInt(st.nextToken());
	  int year = Integer.parseInt(st.nextToken());
	  cal = new GregorianCalendar(year, month - 1, day);
	}
  }

  public void print()
  {
	if (cal == null) {
	  System.out.println("could not construct calendar object");
	} else {
	  //Titelzeile ausgeben
	  String title = cal.get(Calendar.DATE) + ". ";
	  title += MONTHNAMES[cal.get(Calendar.MONTH)] + " ";
	  title += cal.get(Calendar.YEAR);
	  int lspaces = (28 - title.length()) / 2;
	  if (lspaces > 0) {
		System.out.print("              ".substring(0,lspaces));
		System.out.println(title);
	  }
	  System.out.println("----------------------------");
	  System.out.println(" Mo  Di  Mi  Do  Fr  Sa  So");
	  //Wochentag des ersten Tags im Monat bestimmen
	  int pos;
	  int currentday = cal.get(Calendar.DATE);
	  cal.set(Calendar.DATE, 1);
	  cal.setTime(cal.getTime());
	  int weekday = cal.get(Calendar.DAY_OF_WEEK);
	  if (weekday == Calendar.SUNDAY) {
		pos = 6;
	  } else {
		pos = weekday - 2;
	  }
	  //Die Lücke vor dem Ersten des Monats drucken
	  for (int i = 0; i < pos; ++i) {
		System.out.print("    ");
	  }
	  //Anzahl der Tage im Monat ermitteln
	  int month = cal.get(Calendar.MONTH);
	  int numdays = 30;
	  if (month == 1) { //Februar
		numdays -= cal.isLeapYear(cal.get(Calendar.YEAR))? 1 : 2;
	  } else if ((month <= 6 && month % 2 == 0) || 
                 (month > 6 && month % 2 == 1)) {
		numdays = 31;
	  }
	  //Die restlichen Tage drucken
	  int day;
	  for (day = 1; day <= numdays; ++day) {
		System.out.print(
		  (day == currentday ? ">" : " ") +
		  (day < 10 ? " " : "") + day +
		  (day == currentday ? "<" : " ")
        );
		if ((day + pos - 1) % 7 == 6) {
		  System.out.println();
		}
	  }
	  if ((day + pos - 1) % 7 != 0) {
		System.out.println();
	  }
	}
  }
}

