⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractswingcalendar.java

📁 Rapla是一个灵活的多用户资源管理系统。它提供的一些功能有:日历GUI
💻 JAVA
字号:
/*--------------------------------------------------------------------------*
 | Copyright (C) 2006 Gereon Fassbender, Christopher Kohlhaas               |
 |                                                                          |
 | This program is free software; you can redistribute it and/or modify     |
 | it under the terms of the GNU General Public License as published by the |
 | Free Software Foundation. A copy of the license has been included with   |
 | these distribution in the COPYING file, if not go to www.fsf.org         |
 |                                                                          |
 | As a special exception, you are granted the permissions to link this     |
 | program with every library, which license fulfills the Open Source       |
 | Definition as published by the Open Source Initiative (OSI).             |
 *--------------------------------------------------------------------------*/
package org.rapla.components.calendarview.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.TimeZone;

import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

import org.rapla.components.calendarview.Block;
import org.rapla.components.calendarview.Builder;
import org.rapla.components.calendarview.CalendarView;
import org.rapla.components.calendarview.WeekdayMapper;
import org.rapla.components.layout.TableLayout;


public abstract class AbstractSwingCalendar extends JPanel implements CalendarView {
    static Border SLOTHEADER_BORDER = new EtchedBorder();
    int slotSize = 100;
    boolean bEditable = true;
    protected Collection excludeDays = Collections.EMPTY_SET;

    WeekdayMapper weekdayMapper;
    TimeZone timeZone;
    private Date startDate;
    private Date endDate;

    ArrayList listenerList = new ArrayList();

    JScrollPane scrollPane = new JScrollPane();
    JPanel jHeader = new JPanel();
    BoxLayout boxLayout1 = new BoxLayout(jHeader, BoxLayout.X_AXIS);
    JPanel jCenter = new JPanel();
    Locale locale;


    Collection builders = new ArrayList();

    /** Calendar used by the put block method */
    protected Calendar blockCalendar;

    AbstractSwingCalendar(boolean showScrollPane) {
        jHeader.setLayout(boxLayout1);
        jHeader.setOpaque( false );
        jCenter.setOpaque( false );
        if (showScrollPane) {
            setLayout(new BorderLayout());
            add(scrollPane,BorderLayout.CENTER);
            scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setViewportView(jCenter);
            scrollPane.setColumnHeaderView(jHeader);
            scrollPane.getVerticalScrollBar().setUnitIncrement(10);
            scrollPane.getHorizontalScrollBar().setUnitIncrement(10);
            scrollPane.setBorder(null);
        } else {
            setLayout(new TableLayout(new double[][] {
                    {TableLayout.PREFERRED,TableLayout.FILL}
                    ,{TableLayout.PREFERRED,TableLayout.FILL}
            }));
            add(jHeader,"1,0");
            add(jCenter,"1,1");
        }
        this.timeZone = TimeZone.getDefault();
        setLocale( Locale.getDefault() );
    }

    public void setTimeZone(TimeZone timeZone) {
        this.timeZone = timeZone;
        blockCalendar = createCalendar();
    }

    Calendar createCalendar() {
        return Calendar.getInstance(getTimeZone(),locale);
    }

    public TimeZone getTimeZone() {
        return timeZone;
    }

    public void setLocale(Locale locale) {
        this.locale = locale;
        weekdayMapper = new WeekdayMapper( locale );
        super.setLocale( locale);
        // Constructor called?
        if (timeZone != null) {
            setTimeZone( timeZone );
            blockCalendar = createCalendar();
        }
    }

    public void setToDate(Date date) {
        calcMinMaxDates( date );
    }

    protected void setStartDate( Date startDate )
    {
        this.startDate = startDate;
    }

    public Date getStartDate()
    {
        return startDate;
    }

    protected void setEndDate( Date endDate )
    {
        this.endDate = endDate;
    }

    public Date getEndDate()
    {
        return endDate;
    }

    public void setExcludeDays(Collection excludeDays) {
        this.excludeDays = excludeDays;
        if (getStartDate() != null)
            calcMinMaxDates( getStartDate() );
    }

    abstract void calcMinMaxDates(Date date);

    void checkBlock( Block bl ) {
        if ( !bl.getStart().before(this.getEndDate())) {
            throw new IllegalStateException("Start-date " +bl.getStart() + " must be before calendar end at " +this.getEndDate());
        }
    }

    public boolean isEditable() {
        return bEditable;
    }

    public void setEditable( boolean editable ) {
        bEditable = editable;
    }

    /**
       Width of a single slot in pixel.
    */
    public void setSlotSize(int slotSize) {
        this.slotSize = Math.max(40, Math.min(300,slotSize));
    }

    public int getSlotSize() {
        return slotSize;
    }

    public void setBackground(Color color) {
        super.setBackground(color);
        if (scrollPane != null)
            scrollPane.setBackground(color);
        if (jCenter != null)
            jCenter.setBackground(color);
        if (jHeader != null)
            jHeader.setBackground(color);
    }

    public Iterator getBuilders() {
        return builders.iterator();
    }

    public void addBuilder(Builder b) {
        builders.add(b);
    }

    public void removeBuilder(Builder b) {
        builders.remove(b);
    }

    public void addCalendarViewListener(ViewListener listener) {
        listenerList.add(listener);
    }

    public void removeCalendarViewListener(ViewListener listener) {
        listenerList.remove(listener);
    }

    JScrollPane getScrollPane() {
        return scrollPane;
    }

    void scrollTo(int x, int y) {
        JViewport viewport = scrollPane.getViewport();
        Rectangle rect = viewport.getViewRect();

        int leftBound = rect.x;
        int upperBound = rect.y;
        int lowerBound = rect.y + rect.height;
        int rightBound = rect.x + rect.width;
        int maxX = viewport.getView().getWidth();
        int maxY = viewport.getView().getHeight();


        JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
        if ( y > lowerBound && lowerBound < maxY) {
            scrollBar.setValue(scrollBar.getValue() + 20);
        }
        if ( y < upperBound && upperBound >0) {
            scrollBar.setValue(scrollBar.getValue() - 20);
        }

        scrollBar = scrollPane.getHorizontalScrollBar();
        if ( x > rightBound && rightBound < maxX) {
            scrollBar.setValue(scrollBar.getValue() + 20);
        }
        if ( x < leftBound && leftBound >0) {
            scrollBar.setValue(scrollBar.getValue() - 20);
        }
    }

    public void rebuild(Builder builder) {
        try {
            addBuilder( builder);
            rebuild();
        } finally {
            removeBuilder( builder );
        }
    }

    public ViewListener[] getWeekViewListeners() {
        return (ViewListener[])listenerList.toArray(new ViewListener[]{});
    }

    final void fireSelectionChanged(Date start, Date end) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].selectionChanged(start,end);
        }
    }

    final void fireSelectionPopup(Component slot, Point p, Date start, Date end, int slotNr) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].selectionPopup(slot,p,start,end, slotNr);
        }
    }

    final void fireMoved(SwingBlock block, Point p, Date newTime) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].moved(block,p,newTime);
        }
    }

    final void fireResized(SwingBlock block, Point p, Date newStart, Date newEnd) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].resized(block,p,newStart,newEnd);
        }
    }

    void fireResized(SwingBlock block, Point p, Date newTime) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].moved(block,p,newTime);
        }
    }

    void fireBlockPopup(SwingBlock block, Point p) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].blockPopup(block,p);
        }
    }

    void fireBlockEdit(SwingBlock block, Point p) {
        // Fire the popup event
        ViewListener[] listeners = getWeekViewListeners();
        for (int i=0;i<listeners.length;i++) {
            listeners[i].blockEdit(block,p);
        }
    }

    /** formats the date and month in the selected locale and timeZone*/
    public static String formatDateMonth(Date date, Locale locale, TimeZone timeZone) {
        FieldPosition fieldPosition = new FieldPosition( DateFormat.YEAR_FIELD );
        StringBuffer buf = new StringBuffer();
        DateFormat format = DateFormat.getDateInstance( DateFormat.SHORT, locale);
        format.setTimeZone( timeZone );
        buf = format.format(date,
                           buf,
                           fieldPosition
                           );
        if ( fieldPosition.getEndIndex()<buf.length() ) {
            buf.delete( fieldPosition.getBeginIndex(), fieldPosition.getEndIndex()+1 );
        } else if ( (fieldPosition.getBeginIndex()>=0) ) {
            buf.delete( fieldPosition.getBeginIndex(), fieldPosition.getEndIndex() );
        }
        if (buf.charAt(buf.length()-1) == '/')
            return buf.substring(0,buf.length()-1);
        else
            return buf.toString();
    }

    /** formats the day of week, date and month in the selected locale and timeZone*/
    public static String formatDayOfWeekDateMonth(Date date, Locale locale, TimeZone timeZone) {
        SimpleDateFormat format =  new SimpleDateFormat("EEE", locale);
        format.setTimeZone(timeZone);
        return format.format(date) + " " + formatDateMonth( date,locale,timeZone ) ;
    }

    /** returns the name of the weekday */
    String formatDayOfWeek(Date date) {
        SimpleDateFormat format =  new SimpleDateFormat("EEEEE", locale);
        format.setTimeZone(getTimeZone());
        return format.format(date);
    }

    abstract int getDayCount();
    abstract DaySlot getDay(int num);
    abstract int calcSlotNr( int x, int y);
    abstract int getSlotNr( DaySlot slot);
    abstract int getRowsPerDay();
    abstract Date createDate( DaySlot slot, int row, boolean startOfRow);


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -