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

📄 appointmentcontroller.java

📁 Rapla是一个灵活的多用户资源管理系统。它提供的一些功能有:日历GUI
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/*--------------------------------------------------------------------------*
 | Copyright (C) 2006 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.gui.internal.edit.reservation;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.container.ContainerUtil;
import org.rapla.components.calendar.DateChangeEvent;
import org.rapla.components.calendar.DateChangeListener;
import org.rapla.components.calendar.RaplaCalendar;
import org.rapla.components.calendar.RaplaNumber;
import org.rapla.components.calendar.RaplaTime;
import org.rapla.components.layout.TableLayout;
import org.rapla.components.util.DateTools;
import org.rapla.entities.domain.Appointment;
import org.rapla.entities.domain.Repeating;
import org.rapla.entities.domain.RepeatingType;
import org.rapla.entities.domain.ReservationHelper;
import org.rapla.framework.RaplaContext;
import org.rapla.framework.RaplaException;
import org.rapla.framework.RaplaLocale;
import org.rapla.gui.RaplaGUIComponent;
import org.rapla.gui.internal.common.PeriodChooser;
import org.rapla.gui.toolkit.DialogUI;
import org.rapla.gui.toolkit.MonthChooser;
import org.rapla.gui.toolkit.RaplaButton;
import org.rapla.gui.toolkit.RaplaWidget;
import org.rapla.gui.toolkit.WeekdayChooser;

/** GUI for editing a single Appointment. */
public class AppointmentController extends RaplaGUIComponent
    implements
         Disposable
        ,RaplaWidget
{
    JPanel panel = new JPanel();

    SingleEditor singleEditor = new SingleEditor();

    JPanel repeatingSelection = new JPanel();
    JPanel repeatingContainer = new JPanel();
    RepeatingEditor repeatingEditor = new RepeatingEditor();

    Appointment appointment;
    Repeating repeating;

    ArrayList listenerList = new ArrayList();
    JPanel repeatingType = new JPanel();
    JRadioButton noRepeating = new JRadioButton();
    JRadioButton weeklyRepeating = new JRadioButton();
    JRadioButton dailyRepeating = new JRadioButton();
    JRadioButton monthlyRepeating = new JRadioButton();
    JRadioButton yearlyRepeating = new JRadioButton();
    
    CardLayout repeatingCard = new CardLayout();

    public AppointmentController(RaplaContext sm) throws RaplaException {
        super( sm);
        panel.setLayout(new BorderLayout());
        panel.add(repeatingType,BorderLayout.NORTH);
        repeatingType.setLayout(new BoxLayout(repeatingType,BoxLayout.X_AXIS));
        repeatingType.add(noRepeating);
        repeatingType.add(weeklyRepeating);
        repeatingType.add(dailyRepeating);
        repeatingType.add(monthlyRepeating);
        repeatingType.add(yearlyRepeating);

        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add( noRepeating );
        buttonGroup.add( weeklyRepeating );
        buttonGroup.add( dailyRepeating );
        buttonGroup.add( monthlyRepeating );
        buttonGroup.add( yearlyRepeating );

        panel.add(repeatingContainer,BorderLayout.CENTER);

        Border  emptyLineBorder = new Border() {
            Insets insets = new Insets(1,0,0,0);
            Color COLOR = Color.LIGHT_GRAY;
            public void paintBorder( Component c, Graphics g, int x, int y, int width, int height )
            {
                g.setColor( COLOR );
                g.drawLine(0,0, c.getWidth(), 0);

            }

            public Insets getBorderInsets( Component c )
            {
                return insets;
            }

            public boolean isBorderOpaque()
            {
                return true;
            }

        };

        Border outerBorder = (BorderFactory.createCompoundBorder(
                                                                 BorderFactory.createEmptyBorder(0,5,0,5)
                                                                 //,BorderFactory.createEmptyBorder()
                                                                 ,emptyLineBorder
                                                                 )
                              );

        repeatingContainer.setBorder(BorderFactory.createCompoundBorder(
                                                                outerBorder
                                                                ,BorderFactory.createEmptyBorder(10,5,10,5)
                                                                )
                             );
        repeatingContainer.setLayout(repeatingCard);
        repeatingContainer.add(singleEditor.getComponent(),"0");
        repeatingContainer.add(repeatingEditor.getComponent(),"1");

        singleEditor.initialize();
        repeatingEditor.initialize();
        ActionListener listener = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    switchRepeatings();
                }
            };
        noRepeating.addActionListener(listener);
        weeklyRepeating.addActionListener(listener);
        monthlyRepeating.addActionListener(listener);
        dailyRepeating.addActionListener(listener);
        yearlyRepeating.addActionListener(listener);
        noRepeating.setText(getString("no_repeating"));
        weeklyRepeating.setText(getString("weekly"));
        dailyRepeating.setText(getString("daily"));
        monthlyRepeating.setText(getString("monthly"));
        yearlyRepeating.setText(getString("yearly"));
    }

    private void switchRepeatings() {
        if (noRepeating.isSelected()) {
            repeatingCard.show(repeatingContainer,"0");
            singleEditor.mapFromAppointment();
            appointment.setRepeatingEnabled(false);
        } else {
            RepeatingType repeatingType;
            if ( monthlyRepeating.isSelected())
            {
                repeatingType = RepeatingType.MONTHLY;
            }
            else if ( yearlyRepeating.isSelected())
            {
                repeatingType = RepeatingType.YEARLY;
            }
            else if ( dailyRepeating.isSelected())
            {
                repeatingType= RepeatingType.DAILY;
            }                
            else
            {
                repeatingType = RepeatingType.WEEKLY;
            }
            ReservationHelper.makeRepeatingForPeriod(getPeriodModel(), appointment, repeatingType, 1 );
            repeatingEditor.mapFromAppointment();
            repeatingCard.show(repeatingContainer,"1");
        }
        fireAppointmentChanged();
    }

    public void setAppointment(Appointment appointment) {
        this.appointment = appointment;
        this.repeating = appointment.getRepeating();
        if (appointment.getRepeating() != null) {
            repeatingEditor.mapFromAppointment();
            repeatingCard.show(repeatingContainer,"1");
            if (repeating.isWeekly())
                weeklyRepeating.setSelected(true);
            if (repeating.isDaily())
                dailyRepeating.setSelected(true);
            if (repeating.isMonthly())
                monthlyRepeating.setSelected(true);
            if (repeating.isYearly())
                yearlyRepeating.setSelected(true);
        } else {
            singleEditor.mapFromAppointment();
            repeatingCard.show(repeatingContainer,"0");
            noRepeating.setSelected(true);
        }
    }

    public Appointment getAppointment() {
        return appointment;
    }

    public void dispose() {
    	ContainerUtil.dispose( singleEditor );
    	ContainerUtil.dispose( repeatingEditor );
    }

    public JComponent getComponent() {
        return panel;
    }

    /** registers new ChangeListener for this component.
     *  An ChangeEvent will be fired to every registered ChangeListener
     *  when the appointment changes.
     * @see javax.swing.event.ChangeListener
     * @see javax.swing.event.ChangeEvent
    */
    public void addChangeListener(ChangeListener listener) {
        listenerList.add(listener);
    }

    /** removes a listener from this component.*/
    public void removeChangeListener(ChangeListener listener) {
        listenerList.remove(listener);
    }

    public ChangeListener[] getChangeListeners() {
        return (ChangeListener[])listenerList.toArray(new ChangeListener[]{});
    }

    protected void fireAppointmentChanged() {
        if (listenerList.size() == 0)
            return;
        ChangeEvent evt = new ChangeEvent(this);
        ChangeListener[] listeners = getChangeListeners();
        for (int i = 0;i<listeners.length; i++) {
            listeners[i].stateChanged(evt);
        }
        getLogger().debug("appointment changed: " + appointment);
    }

    static double ROW_SIZE = 21;

    class SingleEditor implements DateChangeListener, Disposable {
        JPanel content = new JPanel();
        JLabel startLabel = new JLabel();
        RaplaCalendar startDate;
        JLabel startTimeLabel = new JLabel();
        RaplaTime startTime;
        JLabel endLabel = new JLabel();
        RaplaCalendar endDate;
        JLabel endTimeLabel = new JLabel();
        RaplaTime endTime;
        boolean listenerEnabled = true;

        public SingleEditor() {
            double pre =TableLayout.PREFERRED;
            double size[][] =
                {{pre, 5, pre, 10, pre,5,pre},  // Columns
                 {ROW_SIZE, 6, ROW_SIZE}}; // Rows
            TableLayout tableLayout = new TableLayout(size);
            content.setLayout(tableLayout);
        }

        public void initialize() {
            startDate =createRaplaCalendar();
            endDate = createRaplaCalendar();
            startTime = createRaplaTime();
            endTime = createRaplaTime();
            content.add(startLabel,"0,0,r,f");
            startLabel.setText(getString("start_date"));
            startTimeLabel.setText(getString("time_at"));
            endLabel.setText(getString("end_date"));
            endTimeLabel.setText(getString("time_at"));
            content.add(startDate,"2,0,f,f");
            content.add(startTimeLabel,"4,0,l,f");
            content.add(startTime,"6,0,f,f");
            content.add(endLabel,"0,2,l,f");
            content.add(endDate,"2,2,f,f");
            content.add(endTimeLabel,"4,2,r,f");
            content.add(endTime,"6,2,f,f");

            startDate.addDateChangeListener(this);
            startTime.addDateChangeListener(this);
            endDate.addDateChangeListener(this);
            endTime.addDateChangeListener(this);
        }

        public JComponent getComponent() {
            return content;
        }

        public void dispose() {
        }

        public void dateChanged(DateChangeEvent evt) {
            if (!listenerEnabled)
                return;
            try {
                listenerEnabled = false;
                RaplaLocale raplaLocale = getRaplaLocale();
                long duration = appointment.getEnd().getTime() - appointment.getStart().getTime();

                if (evt.getSource() == startDate || evt.getSource() == startTime) {
                    Date newStart = raplaLocale.toDate(startDate.getDate(),startTime.getTime());
                    Date newEnd = new Date(newStart.getTime() + duration);
                    endTime.setTime(newEnd);
                    endDate.setDate(newEnd);
                    getLogger().debug("endtime adjusted");
                }
                if (evt.getSource() == endTime) {
                    Date newEnd = raplaLocale.toDate(endDate.getDate(),endTime.getTime());
                    if (appointment.getStart().after(newEnd)) {
                        newEnd = DateTools.addDay(newEnd);
                        endDate.setDate(newEnd);
                        endTime.setTime(newEnd);
                        getLogger().debug("enddate adjusted");
                    }

⌨️ 快捷键说明

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