📄 appointmentcontroller.java
字号:
/*--------------------------------------------------------------------------*
| 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 + -