シンプルカレンダー

シンプルカレンダー

macOS Mojava 10.14.6 / Xcode 11.3.1 / Swift 5.0

ビューの階層

[ビューの階層]
月間カレンダー。曜日は月曜始まり日曜終わり。週数は4週〜6週となる。月初は前月の月末日で埋め、月末は翌月の月初日で埋める。土曜日曜および祝日は日付の色を変える。祝日の情報は休日ファイルを作成して管理する。
月の移動ボタン(< 印)のクリックにより、翌月または前月のカレンダーを表示する。
選択中の日付は青い枠線で囲まれる。キーボードの矢印キーにより選択中の日付が移動する。日付けをクリックすると選択中になる。本アプリケーションでは用途はないが、機能拡張により、選択した日付に対し何らかの処理を行うというようなことを想定している。

クラス仕様

クラス構造図

[クラス構造図]

class UACalendar: NSObject

1ヶ月分のカレンダーの日付情報を保持する。
init( )
休日ファイルを読み込み、システム日付の月のカレンダーを作成する。
var daysOfCalender: Int
カレンダーに表示する日数:28 or 35 or 42
var firstDayIndex: Int
当月の初日(1日)の index
【要点】indexは当月カレンダーの日付の順番を表す。上記のカレンダーの例で言えば、index[0] は 2020/10/26、[6] は 2020/11/1、[41] は 2022/12/6 となる。
var lastDayIndex: Int = 0
当月の月末日(28日 or 29日 or 30日 or 31日)の index
var currentDateIndex: Int
システム日付の index:当月になければ -1 になる。
var year: Int
カレンダーの年を返す。
var yearOfWareki: Array<String>
カレンダーの和暦年を年号と年の配列として返す。 "令和" "02"
var month: Int
カレンダーの月を返す。
func date(index: Int) -> UACalendarDate
指定のインデックスの UACalendarDateオブジェクトを返す。
func createCalender(addMonth: Int)
当月のカレンダーの addMonth月後のカレンダーを作成する。負値を指定すれば addMonth月前となる。

class UACalendarDate: NSObject

カレンダーの日付情報
var year: Int
var month: Int
var day: Int
var yearMonthDay: Int
年月日の整数表現:yyyymmdd
var weekday: Int
曜日コード 日曜から始まる整数値(1〜7)
var youbi: String
曜日:"日"〜"土"
var thisMonthFlag: Bool
カレンダーの当月か否か
var firstDayFlag: Bool
月の初日(1日)か否か
var lastDayFlag: Bool
月の最終日か否か
var holidayFlag: Bool
休日か否か
var currentFlag: Bool
システム日付けか否か

class UAView: NSView

カレンダーを表示する。
init( point: NSPoint )
システム日付けの年月のカレンダーを作成し、指定されたビューの pointを起点にカレンダーを表示する。
var calendar: UACalendar
カレンダーオブジェクト
func arrangeControlViews()
見出し、ボタン、1ヶ月分の日付ビュー(UAItemViewオブジェクト)を作成し自身に配置する。カレンダーの週数は最大4なので、日付ビューは 42エントリ(7日 x 4週)を定義しておく。4週に満たない月のときは、日付ビューは非表示にする。
func putDateToIemView()
カレンダーオブジェクトの情報をもとに、日付ビューに日付けをセットする。
var selectedItemIndex:Int
選択中の日付の index
func clickPreButton()
前月ボタンのクリックで前月のカレンダーを表示する。
func clickNextButton()
翌月ボタンのクリックで翌月のカレンダーを表示する。
● UAItemViewDelegateプロトコルの実装
func moveDate( _ to: MoveTYpe )
MoveTYpeで指定された方向(Right, Left, Down, Up)に選択中の日付を移動する。
func selectDate( _ index: Int)
indexに指定された日付けを選択中にする。

class UAItemView: NSView

日付を表示する。
var index: Int
当月カレンダーの日付の順番。未使用のビューは -1 とする。
var aString: NSAttributedString?
日付文字列:土曜、日曜、休日は文字色を変える。当月か否かでフォントサイズを変える。
var myBackgroundColor: CGColor?
背景色:システム日付は色を変える。
var myBorderWidth: CGFloat
var myBorderColor: CGColor
枠線の色と太さ:選択中の日付は色と太さを変える。

protocol UAItemViewDelegate

func moveDate( _ to: MoveTYpe )
キーボードのキー Right, Left, Down, Up, tab が押されたときに起動する。MoveTYpeは方向(Right, Left, Down, Up)の列挙型。tabキーは Rightとなる。
func selectDate( _ index: Int)
日付けビューをクリックしたときに起動する。indexはカレンダーの並びの順番。

class FlippedView: NSView

var isFlipped:Bool
ビューのY軸を反転させ上側が原点にするため trueを返す。コンテントビューのクラスとする。

class UADateUtil: NSObject

日付に関するユーティリティ関数を提供。シングルトンクラス。
init( )
DateFormatter、Calendar、Localeを初期化する。(これらの毎回の初期化を避けるためシングルトンクラスにしたが、あまり意味がないような気がしている)
func date(date:Date, addDays:Int) -> Date
指定の日付から日数を加算した日付を返す
func date(date:Date, addMonths:Int) -> Date
指定の日付から月数を加算した日付を返す
func date(date:Date, addYears:Int) -> Date
指定の日付から年数を加算した日付を返す
func firstDate(date: Date) -> Date
指定の日の月の初日を返す
func lastDate(date: Date) -> Date
指定の日の月の末日を返す
func daysOfMonth(date: Date) -> Int
指定した日の月の日数
func intYear(date: Date) -> Int
指定した日付の年
func intMonth(date: Date) -> Int
指定した日付の月
func intDay(date: Date) -> Int
指定した日付の日
func intWeekday(date: Date) -> Int
指定した日付の曜日コード (日曜から始まる整数値1〜7)
func intDate(date: Date) -> Int
指定した日付の整数表現(yyyymmdd)
func isEqualDate(date1:Date, date2:Date) -> Bool
日付の大小比較
func yearOfWareki(date: Date) -> Array<String>
西暦年月 → 和暦年月の変換 ["令和","02"]

class UATextView: NSView

var text: NSMutableAttributedString?
textに指定した属性付き文字列をビューの中央に表示する。

holiday.json

休日ファイル

プロジェクトのダウンロード