[Seaside-dev] WAMiniCalendar rewrite
Philippe Marschall
philippe.marschall at gmail.com
Sun Feb 24 17:46:54 UTC 2008
Thanks for all the work, I'll have a look at it. I would appreciate it
if other vendors especially the Cincom people could have a look at it.
It would be great if this would allow us to get rid of the
Seaside:Date and Squeak:Date classes on Cincom Smalltalk.
Cheers
Philippe
2008/2/24, Paolo Bonzini <bonzini at gnu.org>:
> The attached changeset reimplements WAMiniCalendar to not use Squeak's
> additional date classes (except if one uses the #month and #month:
> accessors; for now in GNU Smalltalk they will not be available). In
> addition, to make the patch more palatable, it eases localization (one
> has to reimplement #monthNames and #weekDays).
>
> I checked that the methods I used, especially #addDays: and
> #subtractDays:, are available in VW too.
>
>
> Paolo
>
> WAComponent subclass: #WAMiniCalendar
> instanceVariableNames: 'monthIndex year date canSelectBlock selectBlock'
> classVariableNames: ''
> poolDictionaries: ''
> category: 'Seaside-Core-Components-Widgets'!
>
> WAMiniCalendar comment: 'WAMiniCalendar renders a monthly calendar. Users can navigate by month, year, or select a year and a month. Users can select a date in the calendar. Set canSelectBlock to control which dates a user can select. Use selectBlock to perform an action when a user selects a date. WAMiniCalendar>>date returns the selected date.
>
> Select "Mini Calendar" tab of the Functional Seaside Test Suite to run an example (http://127.0.0.1:xxxx/seaside/tests/alltests)
>
> Instance Variables:
> canSelectBlock <BlockClosure with date argument> return true if date argument should be rendered with a link, ie user can select that date
> date <WAValueHolder on a date> Selected date
> monthIndex <WAValueHolder on an Integer> Currently displayed month
> year <WAValueHolder on an Integer> Currently displayed year
> selectBlock <BlockClosure with date argument> called when user selects a date
>
> '!
>
> !WAMiniCalendar class methodsFor: 'testing'!
>
> canBeRoot
> ^true
> !
>
> example
> ^self new
> ! !
>
> !WAMiniCalendar methodsFor: 'testing'!
>
> canSelect: aDate
> ^canSelectBlock value: aDate
> ! !
>
> !WAMiniCalendar methodsFor: 'accessing'!
>
> canSelectBlock: aBlock
> canSelectBlock := aBlock
> !
>
> month
> ^Month month: self monthIndex year: self year
> !
>
> month: aMonth
> self monthIndex: aMonth monthIndex.
> self year: aMonth year.
> !
>
> selectBlock: aBlock
> selectBlock := aBlock
> !
>
> states
> ^Array with: date with: monthIndex with: year
> ! !
>
> !WAMiniCalendar methodsFor: 'accessing-delegated'!
>
> date
> ^date contents
> !
>
> date: aDate
> date contents: aDate.
> monthIndex contents: aDate monthIndex.
> year contents: aDate year
> !
>
> monthIndex
> ^monthIndex contents
> !
>
> monthIndex: anInteger
> monthIndex contents: anInteger
> !
>
> year
> ^year contents
> !
>
> year: anIntegerOrString
> year contents: ([anIntegerOrString asInteger] on: Error do: [:error | 1900])
> ! !
>
> !WAMiniCalendar methodsFor: 'initialization'!
>
> initialize
> super initialize.
> monthIndex := WAValueHolder with: Date today monthIndex.
> year := WAValueHolder with: Date today year.
> date := WAValueHolder new.
> canSelectBlock := [:value | true].
> selectBlock := [:value | self answer: value]
> ! !
>
> !WAMiniCalendar methodsFor: 'localization'!
>
> monthNames
> ^(1 to: 12) collect: [ :each | Date nameOfMonth: each ]
> !
>
> weekDays
> ^(1 to: 7) collect: [:i | (Date nameOfDay: i) first: 3]
> ! !
>
> !WAMiniCalendar methodsFor: 'private'!
>
> monthName
> ^(Date nameOfMonth: self monthIndex)
> !
>
> monthHeading
> ^self monthName , ' ' , self year toString
> !
>
> weeksDo: aBlock
> | day nextMonth |
> day := Date newDay: 1 monthIndex: self monthIndex year: self year.
> day := day subtractDays: day dayOfWeek.
> nextMonth := (self monthIndex \\ 12) + 1.
> [ day monthIndex = nextMonth ] whileFalse: [
> aBlock value: day.
> day := day addDays: 7 ]
> ! !
>
> !WAMiniCalendar methodsFor: 'rendering'!
>
> renderCellForDate: aDate on: html
> html tableData:
> [(aDate monthIndex = self monthIndex and: [ aDate year = self year ])
> ifTrue:
> [html span
> class: (self date = aDate ifTrue: ['calendarArchiveDate']);
> with: [(self canSelect: aDate)
> ifTrue:
> [html anchor
> callback: [self select: aDate];
> with: aDate dayOfMonth]
> ifFalse: [html text: aDate dayOfMonth]]]]
> !
>
> renderContentOn: html
> html div
> class: 'calendar';
> with:
> [html span
> class: 'calendarCaption';
> with: [self renderMonthHeadingOn: html].
> html table:
> [html tableRow
> class: 'calendarTitle';
> with: [self weekDays do: [:each | html tableData: each]].
> self weeksDo: [:week | self renderRowForWeek: week on: html]].
> self renderMonthNavigationOn: html.
> html
> space;
> space.
> self renderYearNavigationOn: html]
> !
>
> renderMonthHeadingOn: html
> html form:
> [html select
> list: (1 to: 12);
> on: #monthIndex of: self;
> labels: [:index | Date nameOfMonth: index].
> html textInput
> maxLength: 4;
> on: #year of: self.
> html submitButton text: 'Refresh']
> !
>
> renderMonthNavigationOn: html
> | tab |
> tab := #(12 1 2 3 4 5 6 7 8 9 10 11 12 1).
> html span
> class: 'calendarPrevious';
> with:
> [html anchor
> callback: [
> self monthIndex = 1
> ifTrue: [ self monthIndex: 12; year: self year - 1]
> ifFalse: [ self monthIndex: self monthIndex - 1 ]];
> with: ((self monthNames at: (tab at: self monthIndex)) first: 3)].
> html space.
> html span
> class: 'calendarNext';
> with:
> [html anchor
> callback: [
> self monthIndex = 12
> ifTrue: [ self monthIndex: 1; year: self year + 1]
> ifFalse: [ self monthIndex: self monthIndex + 1 ]];
> with: ((self monthNames at: (tab at: self monthIndex + 2)) first: 3)].
> !
>
> renderRowForWeek: initialDay on: html
> html
> tableRow: [0 to: 6 do: [:each |
> self renderCellForDate: (initialDay addDays: each) on: html]]
> !
>
> renderYearNavigationOn: html
> html span
> class: 'calendarPrevious';
> with:
> [html anchor
> callback: [self year: self year - 1];
> with: self year - 1].
> html space.
> html span
> class: 'calendarNext';
> with:
> [html anchor
> callback: [self year: self year + 1];
> with: self year + 1]
> ! !
>
> !WAMiniCalendar methodsFor: 'action'!
>
> select: aDate
> self date: aDate.
> selectBlock value: aDate
> ! !
>
>
> _______________________________________________
> seaside-dev mailing list
> seaside-dev at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/seaside-dev
>
>
More information about the seaside-dev
mailing list