/****************************************************************************
* Copyright (c) 2008 Jeremy Dowdall
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Jeremy Dowdall <jeremyd@aspencloud.com> - initial API and implementation
*****************************************************************************/
package org.eclipse.nebula.widgets.cdatetime;
import java.util.Calendar;
import java.util.Date;
import org.eclipse.nebula.cwt.v.IControlPainter;
import org.eclipse.nebula.cwt.v.VButton;
import org.eclipse.nebula.cwt.v.VButtonPainter;
import org.eclipse.nebula.cwt.v.VControl;
import org.eclipse.nebula.cwt.v.VLabelPainter;
import org.eclipse.nebula.cwt.v.VPanel;
import org.eclipse.nebula.cwt.v.VPanelPainter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Event;
public class CDateTimePainter implements IControlPainter {
protected CDateTime cdt;
protected IControlPainter buttonPainter;
protected IControlPainter labelPainter;
protected IControlPainter panelPainter;
public CDateTimePainter() {
buttonPainter = new VButtonPainter();
labelPainter = new VLabelPainter();
panelPainter = new VPanelPainter();
}
private void defaultPaintBackground(VControl control, Event e) {
switch(control.getType()) {
case Button:
buttonPainter.paintBackground(control, e);
break;
case Label:
labelPainter.paintBackground(control, e);
break;
case Panel:
panelPainter.paintBackground(control, e);
break;
}
}
private void defaultPaintBorders(VControl control, Event e) {
switch(control.getType()) {
case Button:
buttonPainter.paintBorders(control, e);
break;
case Label:
labelPainter.paintBorders(control, e);
break;
case Panel:
panelPainter.paintBorders(control, e);
break;
}
}
private void defaultPaintContent(VControl control, Event e) {
switch(control.getType()) {
case Button:
buttonPainter.paintContent(control, e);
break;
case Label:
labelPainter.paintContent(control, e);
break;
case Panel:
panelPainter.paintContent(control, e);
break;
}
}
public void dispose() {
buttonPainter.dispose();
labelPainter.dispose();
panelPainter.dispose();
}
protected VPanel getPicker() {
return cdt.picker;
}
protected final int indexOf(VControl control) {
Object obj = control.getData(CDT.Key.Index);
if(obj instanceof Integer) {
return (Integer) obj;
}
return -1;
}
protected final boolean isActive(VControl control) {
Object obj = control.getData(CDT.Key.Active);
if(obj instanceof Boolean) {
return (Boolean) obj;
}
return false;
}
protected final boolean isToday(VControl control) {
Object obj = control.getData(CDT.Key.Today);
if(obj instanceof Boolean) {
return (Boolean) obj;
}
return false;
}
public final void paintBackground(VControl control, Event e) {
switch((CDT.PickerPart) control.getData(CDT.PickerPart)) {
case ClearButton:
paintClearButtonBackground(control, e);
break;
case DateNow:
paintDateNowBackground(control, e);
break;
case DayButton:
paintDayButtonBackground(control, e);
break;
case DayOfWeekLabel:
paintDayOfWeekLabelBackground(control, e);
break;
case DayOfWeekPanel:
paintDayOfWeekPanelBackground(control, e);
break;
case DayPanel:
paintDayPanelBackground(control, e);
break;
case TodayButton:
paintFooterButtonBackground(control, e);
break;
case FooterPanel:
paintFooterPanelBackground(control, e);
break;
case HeaderPanel:
paintHeaderPanelBackground(control, e);
break;
case MonthLabel:
paintMonthLabelBackground(control, e);
break;
case MonthNext:
paintMonthNextBackground(control, e);
break;
case MonthPrev:
paintMonthPrevBackground(control, e);
break;
case YearLabel:
paintYearLabelBackground(control, e);
break;
case YearNext:
paintYearNextBackground(control, e);
break;
case YearPrev:
paintYearPrevBackground(control, e);
break;
default:
defaultPaintBackground(control, e);
break;
}
}
public final void paintBorders(VControl control, Event e) {
switch((CDT.PickerPart) control.getData(CDT.PickerPart)) {
case ClearButton:
paintClearButtonBorders(control, e);
break;
case DateNow:
paintDateNowBorders(control, e);
break;
case DayButton:
paintDayButtonBorders(control, e);
break;
case DayOfWeekLabel:
paintDayOfWeekLabelBorders(control, e);
break;
case DayOfWeekPanel:
paintDayOfWeekPanelBorders(control, e);
break;
case DayPanel:
paintDayPanelBorders(control, e);
break;
case TodayButton:
paintFooterButtonBorders(control, e);
break;
case FooterPanel:
paintFooterPanelBorders(control, e);
break;
case HeaderPanel:
paintHeaderPanelBorders(control, e);
break;
case MonthLabel:
paintMonthLabelBorders(control, e);
break;
case MonthNext:
paintMonthNextBorders(control, e);
break;
case MonthPrev:
paintMonthPrevBorders(control, e);
break;
case YearLabel:
paintYearLabelBorders(control, e);
break;
case YearNext:
paintYearNextBorders(control, e);
break;
case YearPrev:
paintYearPrevBorders(control, e);
break;
default:
defaultPaintBorders(control, e);
break;
}
}
protected void paintClearButtonBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintClearButtonBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintClearButtonContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
public final void paintContent(VControl control, Event e) {
switch((CDT.PickerPart) control.getData(CDT.PickerPart)) {
case ClearButton:
paintClearButtonContent(control, e);
break;
case DateNow:
paintDateNowContent(control, e);
break;
case DayButton:
paintDayButtonContent(control, e);
break;
case DayOfWeekLabel:
paintDayOfWeekLabelContent(control, e);
break;
case DayOfWeekPanel:
paintDayOfWeekPanelContent(control, e);
break;
case DayPanel:
paintDayPanelContent(control, e);
break;
case TodayButton:
paintFooterButtonContent(control, e);
break;
case FooterPanel:
paintFooterPanelContent(control, e);
break;
case HeaderPanel:
paintHeaderPanelContent(control, e);
break;
case MonthLabel:
paintMonthLabelContent(control, e);
break;
case MonthNext:
paintMonthNextContent(control, e);
break;
case MonthPrev:
paintMonthPrevContent(control, e);
break;
case YearLabel:
paintYearLabelContent(control, e);
break;
case YearNext:
paintYearNextContent(control, e);
break;
case YearPrev:
paintYearPrevContent(control, e);
break;
default:
defaultPaintContent(control, e);
break;
}
}
protected void paintDateNowBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintDateNowBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintDateNowContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintDayButtonBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintDayButtonBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintDayButtonContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintDayOfWeekLabelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintDayOfWeekLabelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintDayOfWeekLabelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintDayOfWeekPanelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintDayOfWeekPanelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintDayOfWeekPanelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintDayPanelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintDayPanelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
Calendar cal = cdt.getCalendarInstance();
VPanel picker = getPicker();
if(picker instanceof DatePicker) {
VButton[] days = ((DatePicker) picker).dayButtons;
for(int i = 1; i < days.length; i++) {
VButton day = days[i];
cal.setTime(day.getData(CDT.Key.Date, Date.class));
if(cal.get(Calendar.DAY_OF_MONTH) == 1 && !isActive(day) && !isActive(days[i-1])) {
Rectangle bounds = day.getBounds();
Rectangle pbounds = control.getBounds();
if(indexOf(day) % 7 != 0) {
e.gc.drawLine(bounds.x, bounds.y, bounds.x, bounds.y+bounds.height);
}
if(indexOf(day) > 7) {
e.gc.drawLine(bounds.x, bounds.y, pbounds.x+pbounds.width, bounds.y);
}
e.gc.drawLine(pbounds.x, bounds.y+bounds.height, bounds.x, bounds.y+bounds.height);
i += 28;
}
}
}
}
protected void paintDayPanelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintFooterButtonBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintFooterButtonBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintFooterButtonContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintFooterPanelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintFooterPanelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintFooterPanelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintHeaderPanelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintHeaderPanelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintHeaderPanelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintMonthLabelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintMonthLabelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintMonthLabelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintMonthNextBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintMonthNextBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintMonthNextContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintMonthPrevBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintMonthPrevBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintMonthPrevContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintYearLabelBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintYearLabelBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintYearLabelContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintYearNextBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintYearNextBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintYearNextContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
protected void paintYearPrevBackground(VControl control, Event e) {
defaultPaintBackground(control, e);
}
protected void paintYearPrevBorders(VControl control, Event e) {
defaultPaintBorders(control, e);
}
protected void paintYearPrevContent(VControl control, Event e) {
defaultPaintContent(control, e);
}
public final void setButtonPainter(IControlPainter painter) {
this.buttonPainter = painter;
}
void setCDateTime(CDateTime cdt) {
this.cdt = cdt;
}
public final void setLabelPainter(IControlPainter painter) {
this.labelPainter = painter;
}
public final void update(VControl control) {
switch((CDT.PickerPart) control.getData(CDT.PickerPart)) {
case ClearButton:
updateClearButton(control);
break;
case DateNow:
updateDateNow(control);
break;
case DayButton:
updateDayButton(control);
break;
case DayOfWeekLabel:
updateDayOfWeekLabel(control);
break;
case DayOfWeekPanel:
updateDayOfWeekPanel(control);
break;
case DayPanel:
updateDayPanel(control);
break;
case TodayButton:
updateFooterButton(control);
break;
case FooterPanel:
updateFooterPanel(control);
break;
case HeaderPanel:
updateHeaderPanel(control);
break;
case MonthLabel:
updateMonthLabel(control);
break;
case MonthNext:
updateMonthNext(control);
break;
case MonthPrev:
updateMonthPrev(control);
break;
case YearLabel:
updateYearLabel(control);
break;
case YearNext:
updateYearNext(control);
break;
case YearPrev:
updateYearPrev(control);
break;
}
}
protected void updateClearButton(VControl control) {
}
protected void updateDateNow(VControl control) {
control.setFill(control.getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
protected void updateDayButton(VControl control) {
if(isToday(control)) {
control.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_RED));
} else if(isActive(control)) {
control.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_BLACK));
} else {
control.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
}
}
protected void updateDayOfWeekLabel(VControl control) {
}
protected void updateDayOfWeekPanel(VControl control) {
control.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_WHITE));
}
protected void updateDayPanel(VControl control) {
control.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_WHITE));
}
protected void updateFooterButton(VControl control) {
}
protected void updateFooterPanel(VControl control) {
}
protected void updateHeaderPanel(VControl control) {
}
protected void updateMonthLabel(VControl control) {
}
protected void updateMonthNext(VControl control) {
control.setFill(control.getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
protected void updateMonthPrev(VControl control) {
control.setFill(control.getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
protected void updateYearLabel(VControl control) {
}
protected void updateYearNext(VControl control) {
control.setFill(control.getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
protected void updateYearPrev(VControl control) {
control.setFill(control.getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
}