📄 swingtableview.java
字号:
package org.rapla.plugin.tableview;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import org.rapla.components.calendar.DateChangeEvent;
import org.rapla.components.calendar.DateChangeListener;
import org.rapla.components.iolayer.ComponentPrinter;
import org.rapla.components.tablesorter.TableSorter;
import org.rapla.entities.domain.Reservation;
import org.rapla.entities.domain.ReservationHelper;
import org.rapla.framework.RaplaContext;
import org.rapla.framework.RaplaException;
import org.rapla.gui.CalendarModel;
import org.rapla.gui.MenuContext;
import org.rapla.gui.MenuFactory;
import org.rapla.gui.RaplaGUIComponent;
import org.rapla.gui.SwingCalendarView;
import org.rapla.gui.internal.common.CalendarAction;
import org.rapla.gui.toolkit.DateCellRenderer;
import org.rapla.gui.toolkit.RaplaMenu;
import org.rapla.gui.toolkit.RaplaMenuItem;
import org.rapla.gui.toolkit.RaplaPopupMenu;
import org.rapla.plugin.abstractcalendar.IntervallChooserPanel;
public class SwingTableView extends RaplaGUIComponent implements SwingCalendarView, Printable
{
ReservationTableModel reservationTableModel;
JTable table;
CalendarModel model;
IntervallChooserPanel dateChooser;
JComponent container;
TableSorter sorter;
public SwingTableView( RaplaContext context, CalendarModel model, final boolean editable ) throws RaplaException
{
super( context );
table = new JTable() {
private static final long serialVersionUID = 1L;
public String getToolTipText(MouseEvent e) {
if (!editable)
return null;
int rowIndex = rowAtPoint( e.getPoint() );
Reservation reservation = reservationTableModel.getReservationAt( sorter.modelIndex( rowIndex ));
return getInfoFactory().getToolTip( reservation );
}
};
if ( editable )
{
container = new JScrollPane( table);
container.setPreferredSize( new Dimension(600,800));
}
else
{
container = table;
}
this.model = model;
reservationTableModel = new ReservationTableModel( getLocale(),getI18n() );
sorter = new TableSorter( reservationTableModel, table.getTableHeader());
table.setModel( sorter );
table.getColumnModel().getColumn(1 ).setCellRenderer( new DateCellRenderer( getRaplaLocale()));
table.getColumnModel().getColumn(1 ).setMaxWidth( 120 );
table.getColumnModel().getColumn(1 ).setPreferredWidth( 120 );
table.getColumnModel().getColumn(2 ).setCellRenderer( new DateCellRenderer( getRaplaLocale()));
table.getColumnModel().getColumn(2 ).setMaxWidth( 120 );
table.getColumnModel().getColumn(2 ).setPreferredWidth( 120 );
if ( editable ) {
PopupTableHandler popupHandler = new PopupTableHandler();
container.addMouseListener( popupHandler);
table.addMouseListener( popupHandler );
}
dateChooser = new IntervallChooserPanel( context, model);
dateChooser.addDateChangeListener( new DateChangeListener() {
public void dateChanged( DateChangeEvent evt )
{
try {
update( );
} catch (RaplaException ex ){
showException( ex, getComponent());
}
}
});
reservationTableModel.setReservations( model.getReservations() );
if ( !editable)
{
Dimension size = table.getPreferredSize();
container.setBounds( 0,0,(int)600, (int)size.getHeight());
}
}
public void update() throws RaplaException
{
reservationTableModel.setReservations( model.getReservations() );
dateChooser.update();
}
public JComponent getDateSelection()
{
return dateChooser.getComponent();
}
public void scrollToStart()
{
}
public JComponent getComponent()
{
return container;
}
List getSelectedEvents() {
int[] rows = table.getSelectedRows();
List selectedEvents = new ArrayList();
for (int i=0;i<rows.length;i++)
{
Reservation reservation =reservationTableModel.getReservationAt( sorter.modelIndex(rows[i]) );
selectedEvents.add( reservation);
}
return selectedEvents;
}
class PopupTableHandler extends MouseAdapter {
void showPopup(MouseEvent me) {
Point p = new Point(me.getX(), me.getY());
List selectedEvents = getSelectedEvents();
try {
Object focusedObject = null;
if ( selectedEvents.size() == 1) {
focusedObject = selectedEvents.get( 0);
}
MenuContext menuContext = new MenuContext( getContext(), focusedObject,getComponent(),p);
menuContext.setSelectedObjects( selectedEvents);
RaplaPopupMenu menu= new RaplaPopupMenu();
// add the new reservations wizards
RaplaMenu newMenu = new RaplaMenu("new");
newMenu.setText(getString("new"));
MenuFactory menuFactory = (MenuFactory) getService(MenuFactory.ROLE);
menuFactory.addReservationWizards( newMenu, menuContext, null);
menu.add( newMenu );
RaplaMenuItem calendar = new RaplaMenuItem("calendar");
CalendarModel model = (CalendarModel) getService(CalendarModel.ROLE);
CalendarAction action = new CalendarAction( getContext(), getComponent(), model);
action.changeObjects( selectedEvents);
action.setStart( ReservationHelper.findFirst( selectedEvents ));
calendar.setAction( action );
menu.add( calendar );
// add the edit methods
menuFactory.addObjectMenu( menu, menuContext, null);
menu.show( table, p.x, p.y);
} catch (RaplaException ex) {
showException (ex,getComponent());
}
}
/** Implementation-specific. Should be private.*/
public void mousePressed(MouseEvent me) {
if (me.isPopupTrigger())
showPopup(me);
}
/** Implementation-specific. Should be private.*/
public void mouseReleased(MouseEvent me) {
if (me.isPopupTrigger())
showPopup(me);
}
/** we want to edit the reservation on double click*/
public void mouseClicked(MouseEvent me) {
List selectedEvents = getSelectedEvents();
if (me.getClickCount() > 1 && selectedEvents.size() == 1 )
{
Reservation reservation = (Reservation) selectedEvents.get( 0);
try {
getReservationController().edit( reservation );
} catch (RaplaException ex) {
showException (ex,getComponent());
}
}
}
}
private Object getFitWidthMode()
{
try {
Class printMode = Class.forName("javax.swing.JTable$PrintMode");
return printMode.getField("FIT_WIDTH").get( null);
} catch (Exception e) {
return null;
}
}
Printable printable = null;
/**
* @see java.awt.print.Printable#print(java.awt.Graphics, java.awt.print.PageFormat, int)
*/
public int print(Graphics graphics, PageFormat format, int page) throws PrinterException {
if ( page == 0) {
// We use reflection to make the following call
// this maintains 1.4 compatibilty
// printable = table.getPrintable( JTable.PrintMode.FIT_WIDTH,f1, null );
Object FIT_WIDTH = getFitWidthMode();
if ( FIT_WIDTH == null)
{
printable = new ComponentPrinter( container, true);
}
else
{
MessageFormat f1 = new MessageFormat( model.getNonEmptyTitle());
try
{
Method getPrintableMethod = JTable.class.getMethod("getPrintable", new Class[] {FIT_WIDTH.getClass(),MessageFormat.class, MessageFormat.class});
printable = (Printable)getPrintableMethod.invoke( table, new Object[] {FIT_WIDTH,f1, null });
} catch (Exception ex)
{
throw new PrinterException("Can't get printable of table " + ex.getMessage());
}
}
}
return printable.print( graphics, format, page);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -