Kalendarz gregoriaństki w Javie - proszę o wytłumaczenie działania kodu

0
import java.text.DateFormatSymbols;
import java.util.*;

/**
 * @version 1.4 2007-04-07
 * @author Cay Horstmann
 */

public class CalendarTest
{
   public static void main(String[] args)
   {
      // Konstrukcja i ustawienie obiektu d oraz jego inicjacja aktualną datą.
      GregorianCalendar d = new GregorianCalendar();

      int today = d.get(Calendar.DAY_OF_MONTH);
      int month = d.get(Calendar.MONTH);

      // Ustawienie d na początek miesiąca.
      d.set(Calendar.DAY_OF_MONTH, 1);

      int weekday = d.get(Calendar.DAY_OF_WEEK);

      // Pobranie pierwszego dnia tygodnia (poniedziałek w Polsce).
      int firstDayOfWeek = d.getFirstDayOfWeek();

      // Określenie odpowiedniego wcięcia pierwszego wiersza.
      int indent = 0;
      while (weekday != firstDayOfWeek)
      {
         indent++;
         d.add(Calendar.DAY_OF_MONTH, -1);
         weekday = d.get(Calendar.DAY_OF_WEEK);
      }

      // Drukowanie nazw dni tygodnia.
      String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
      do
      {
         System.out.printf("%4s", weekdayNames[weekday]);
         d.add(Calendar.DAY_OF_MONTH, 1);
         weekday = d.get(Calendar.DAY_OF_WEEK);
      }
      while (weekday != firstDayOfWeek);
      System.out.println();

      for (int i = 1; i <= indent; i++)
         System.out.print("    ");

      d.set(Calendar.DAY_OF_MONTH, 1);
      do
      {
         // Drukowanie dnia.
         int day = d.get(Calendar.DAY_OF_MONTH);
         System.out.printf("%3d", day);

         // Oznaczenie bieżącego dnia znakiem *.
         if (day == today) System.out.print("*");
         else System.out.print(" "	);

         // Ustawienie d na kolejny dzień.
         d.add(Calendar.DAY_OF_MONTH, 1);
         weekday = d.get(Calendar.DAY_OF_WEEK);

         // Rozpoczęcie nowego wiersza na początku tygodnia.
         if (weekday == firstDayOfWeek) System.out.println();
      }
      while (d.get(Calendar.MONTH) == month);
      // Pętla kończy działanie, jeśli d jest pierwszym dniem następnego miesiąca.

      // Wydruk końcowego znaku nowego wiersza w razie potrzeby.
      if (weekday != firstDayOfWeek) System.out.println();
   }
}

Nie rozumiem tego:

       // Określenie odpowiedniego wcięcia pierwszego wiersza.
      int indent = 0;
      while (weekday != firstDayOfWeek)
      {
         indent++;
         d.add(Calendar.DAY_OF_MONTH, -1);
         weekday = d.get(Calendar.DAY_OF_WEEK);
      }

Wcięcie = 0
Jeśli dzień tygodnia nie jest równy pierwszemu dniu miesiąca - czyli w Polsce wszystko inne, niż poniedziałek to wcięcie rośnie no i tego nie kumam:

 d.add(Calendar.DAY_OF_MONTH, -1);

Oraz prosiłbym o wytłumaczenie w miarę najprościej dalszej części, czyt.

   // Drukowanie nazw dni tygodnia.
      String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
      do
      {
         System.out.printf("%4s", weekdayNames[weekday]);
         d.add(Calendar.DAY_OF_MONTH, 1);
         weekday = d.get(Calendar.DAY_OF_WEEK);
      }
      while (weekday != firstDayOfWeek);
      System.out.println();

      for (int i = 1; i <= indent; i++)
         System.out.print("    ");

      d.set(Calendar.DAY_OF_MONTH, 1);
      do
      {
         // Drukowanie dnia.
         int day = d.get(Calendar.DAY_OF_MONTH);
         System.out.printf("%3d", day);

         // Oznaczenie bieżącego dnia znakiem *.
         if (day == today) System.out.print("*");
         else System.out.print(" ");

         // Ustawienie d na kolejny dzień.
         d.add(Calendar.DAY_OF_MONTH, 1);
         weekday = d.get(Calendar.DAY_OF_WEEK);

         // Rozpoczęcie nowego wiersza na początku tygodnia.
         if (weekday == firstDayOfWeek) System.out.println();
      }
      while (d.get(Calendar.MONTH) == month);
0

Nie rozumiem tego:

   // Określenie odpowiedniego wcięcia pierwszego wiersza.
  int indent = 0;
  while (weekday != firstDayOfWeek)
  {
     indent++;
     d.add(Calendar.DAY_OF_MONTH, -1);
     weekday = d.get(Calendar.DAY_OF_WEEK);
  }

W pętli cofasz się o jeden dzień

d.add(Calendar.DAY_OF_MONTH, -1);

dopóki nie dotrzesz do poniedziałku (pierwszego dnia tygodnia).

1 użytkowników online, w tym zalogowanych: 0, gości: 1