001: package org.rapla.plugin.tableview;
002:
003: import java.awt.Dimension;
004: import java.awt.Graphics;
005: import java.awt.Point;
006: import java.awt.event.MouseAdapter;
007: import java.awt.event.MouseEvent;
008: import java.awt.print.PageFormat;
009: import java.awt.print.Printable;
010: import java.awt.print.PrinterException;
011: import java.lang.reflect.Method;
012: import java.text.MessageFormat;
013: import java.util.ArrayList;
014: import java.util.List;
015:
016: import javax.swing.JComponent;
017: import javax.swing.JScrollPane;
018: import javax.swing.JTable;
019:
020: import org.rapla.components.calendar.DateChangeEvent;
021: import org.rapla.components.calendar.DateChangeListener;
022: import org.rapla.components.iolayer.ComponentPrinter;
023: import org.rapla.components.tablesorter.TableSorter;
024: import org.rapla.entities.domain.Reservation;
025: import org.rapla.entities.domain.ReservationHelper;
026: import org.rapla.framework.RaplaContext;
027: import org.rapla.framework.RaplaException;
028: import org.rapla.gui.CalendarModel;
029: import org.rapla.gui.MenuContext;
030: import org.rapla.gui.MenuFactory;
031: import org.rapla.gui.RaplaGUIComponent;
032: import org.rapla.gui.SwingCalendarView;
033: import org.rapla.gui.internal.common.CalendarAction;
034: import org.rapla.gui.toolkit.DateCellRenderer;
035: import org.rapla.gui.toolkit.RaplaMenu;
036: import org.rapla.gui.toolkit.RaplaMenuItem;
037: import org.rapla.gui.toolkit.RaplaPopupMenu;
038: import org.rapla.plugin.abstractcalendar.IntervallChooserPanel;
039:
040: public class SwingTableView extends RaplaGUIComponent implements
041: SwingCalendarView, Printable {
042: ReservationTableModel reservationTableModel;
043:
044: JTable table;
045: CalendarModel model;
046: IntervallChooserPanel dateChooser;
047: JComponent container;
048: TableSorter sorter;
049:
050: public SwingTableView(RaplaContext context, CalendarModel model,
051: final boolean editable) throws RaplaException {
052: super (context);
053: table = new JTable() {
054: private static final long serialVersionUID = 1L;
055:
056: public String getToolTipText(MouseEvent e) {
057: if (!editable)
058: return null;
059: int rowIndex = rowAtPoint(e.getPoint());
060: Reservation reservation = reservationTableModel
061: .getReservationAt(sorter.modelIndex(rowIndex));
062: return getInfoFactory().getToolTip(reservation);
063: }
064: };
065: if (editable) {
066: container = new JScrollPane(table);
067: container.setPreferredSize(new Dimension(600, 800));
068: } else {
069: container = table;
070: }
071: this .model = model;
072: reservationTableModel = new ReservationTableModel(getLocale(),
073: getI18n());
074: sorter = new TableSorter(reservationTableModel, table
075: .getTableHeader());
076: table.setModel(sorter);
077: table.getColumnModel().getColumn(1).setCellRenderer(
078: new DateCellRenderer(getRaplaLocale()));
079: table.getColumnModel().getColumn(1).setMaxWidth(120);
080: table.getColumnModel().getColumn(1).setPreferredWidth(120);
081: table.getColumnModel().getColumn(2).setCellRenderer(
082: new DateCellRenderer(getRaplaLocale()));
083: table.getColumnModel().getColumn(2).setMaxWidth(120);
084: table.getColumnModel().getColumn(2).setPreferredWidth(120);
085: if (editable) {
086: PopupTableHandler popupHandler = new PopupTableHandler();
087: container.addMouseListener(popupHandler);
088: table.addMouseListener(popupHandler);
089: }
090:
091: dateChooser = new IntervallChooserPanel(context, model);
092: dateChooser.addDateChangeListener(new DateChangeListener() {
093: public void dateChanged(DateChangeEvent evt) {
094: try {
095: update();
096: } catch (RaplaException ex) {
097: showException(ex, getComponent());
098: }
099: }
100: });
101:
102: reservationTableModel.setReservations(model.getReservations());
103:
104: if (!editable) {
105: Dimension size = table.getPreferredSize();
106: container
107: .setBounds(0, 0, (int) 600, (int) size.getHeight());
108: }
109:
110: }
111:
112: public void update() throws RaplaException {
113: reservationTableModel.setReservations(model.getReservations());
114: dateChooser.update();
115: }
116:
117: public JComponent getDateSelection() {
118: return dateChooser.getComponent();
119: }
120:
121: public void scrollToStart() {
122:
123: }
124:
125: public JComponent getComponent() {
126: return container;
127: }
128:
129: List getSelectedEvents() {
130: int[] rows = table.getSelectedRows();
131: List selectedEvents = new ArrayList();
132: for (int i = 0; i < rows.length; i++) {
133: Reservation reservation = reservationTableModel
134: .getReservationAt(sorter.modelIndex(rows[i]));
135: selectedEvents.add(reservation);
136: }
137: return selectedEvents;
138: }
139:
140: class PopupTableHandler extends MouseAdapter {
141:
142: void showPopup(MouseEvent me) {
143: Point p = new Point(me.getX(), me.getY());
144: List selectedEvents = getSelectedEvents();
145: try {
146: Object focusedObject = null;
147: if (selectedEvents.size() == 1) {
148: focusedObject = selectedEvents.get(0);
149: }
150: MenuContext menuContext = new MenuContext(getContext(),
151: focusedObject, getComponent(), p);
152: menuContext.setSelectedObjects(selectedEvents);
153: RaplaPopupMenu menu = new RaplaPopupMenu();
154:
155: // add the new reservations wizards
156: RaplaMenu newMenu = new RaplaMenu("new");
157: newMenu.setText(getString("new"));
158: MenuFactory menuFactory = (MenuFactory) getService(MenuFactory.ROLE);
159: menuFactory.addReservationWizards(newMenu, menuContext,
160: null);
161: menu.add(newMenu);
162:
163: RaplaMenuItem calendar = new RaplaMenuItem("calendar");
164: CalendarModel model = (CalendarModel) getService(CalendarModel.ROLE);
165: CalendarAction action = new CalendarAction(
166: getContext(), getComponent(), model);
167: action.changeObjects(selectedEvents);
168: action.setStart(ReservationHelper
169: .findFirst(selectedEvents));
170: calendar.setAction(action);
171: menu.add(calendar);
172:
173: // add the edit methods
174: menuFactory.addObjectMenu(menu, menuContext, null);
175: menu.show(table, p.x, p.y);
176: } catch (RaplaException ex) {
177: showException(ex, getComponent());
178: }
179: }
180:
181: /** Implementation-specific. Should be private.*/
182: public void mousePressed(MouseEvent me) {
183: if (me.isPopupTrigger())
184: showPopup(me);
185: }
186:
187: /** Implementation-specific. Should be private.*/
188: public void mouseReleased(MouseEvent me) {
189: if (me.isPopupTrigger())
190: showPopup(me);
191: }
192:
193: /** we want to edit the reservation on double click*/
194: public void mouseClicked(MouseEvent me) {
195: List selectedEvents = getSelectedEvents();
196: if (me.getClickCount() > 1 && selectedEvents.size() == 1) {
197: Reservation reservation = (Reservation) selectedEvents
198: .get(0);
199: try {
200: getReservationController().edit(reservation);
201: } catch (RaplaException ex) {
202: showException(ex, getComponent());
203: }
204: }
205: }
206: }
207:
208: private Object getFitWidthMode() {
209: try {
210: Class printMode = Class
211: .forName("javax.swing.JTable$PrintMode");
212: return printMode.getField("FIT_WIDTH").get(null);
213: } catch (Exception e) {
214: return null;
215: }
216: }
217:
218: Printable printable = null;
219:
220: /**
221: * @see java.awt.print.Printable#print(java.awt.Graphics, java.awt.print.PageFormat, int)
222: */
223: public int print(Graphics graphics, PageFormat format, int page)
224: throws PrinterException {
225: if (page == 0) {
226: // We use reflection to make the following call
227: // this maintains 1.4 compatibilty
228: // printable = table.getPrintable( JTable.PrintMode.FIT_WIDTH,f1, null );
229: Object FIT_WIDTH = getFitWidthMode();
230: if (FIT_WIDTH == null) {
231: printable = new ComponentPrinter(container, true);
232: } else {
233: MessageFormat f1 = new MessageFormat(model
234: .getNonEmptyTitle());
235: try {
236: Method getPrintableMethod = JTable.class.getMethod(
237: "getPrintable", new Class[] {
238: FIT_WIDTH.getClass(),
239: MessageFormat.class,
240: MessageFormat.class });
241: printable = (Printable) getPrintableMethod
242: .invoke(table, new Object[] { FIT_WIDTH,
243: f1, null });
244: } catch (Exception ex) {
245: throw new PrinterException(
246: "Can't get printable of table "
247: + ex.getMessage());
248: }
249: }
250: }
251: return printable.print(graphics, format, page);
252: }
253:
254: }
|