📄 multicalendarview.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.common;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
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 org.rapla.components.layout.TableLayout;
import org.rapla.components.util.Tools;
import org.rapla.framework.RaplaContext;
import org.rapla.framework.RaplaException;
import org.rapla.gui.RaplaGUIComponent;
import org.rapla.gui.SwingCalendarView;
import org.rapla.gui.ViewFactory;
import org.rapla.gui.toolkit.IdentifiableMenuEntry;
import org.rapla.gui.toolkit.RaplaMenu;
import org.rapla.gui.toolkit.RaplaMenuItem;
import org.rapla.gui.toolkit.RaplaWidget;
import org.rapla.plugin.RaplaExtensionPoints;
public class MultiCalendarView extends RaplaGUIComponent
implements
RaplaWidget
{
private JPanel page = new JPanel();
private JPanel header = new JPanel();
Map viewMenuItems = new HashMap();
JComboBox viewChooser;
// Default view, when no plugin defined
private SwingCalendarView currentView = new SwingCalendarView() {
JLabel noViewDefined = new JLabel("No view defined");
public JComponent getDateSelection()
{
return null;
}
public void scrollToStart()
{
}
public JComponent getComponent()
{
return noViewDefined;
}
public void update( ) throws RaplaException
{
}
};
private CalendarSelectionModel model;
final Map map;
/** renderer for weekdays in month-view */
boolean editable = true;
boolean listenersEnabled = true;
public MultiCalendarView(RaplaContext context,CalendarSelectionModel model) throws RaplaException {
this( context, model, true);
}
public MultiCalendarView(RaplaContext context,CalendarSelectionModel model, boolean editable) throws RaplaException {
super( context);
this.editable = editable;
map = getContainer().lookupServicesFor(RaplaExtensionPoints.CALENDAR_VIEW_EXTENSION);
this.model = model;
String[] ids = getIds();
{
ViewFactory factory = findFactory( model.getViewId());
if ( factory == null)
{
if ( ids.length != 0 ) {
String firstId = ids[0];
model.setViewId( firstId );
factory = findFactory( firstId );
}
}
}
RaplaMenu view = (RaplaMenu) getContext().lookup( InternMenus.VIEW_MENU_ROLE);
if ( !view.hasId( "views") )
{
addMenu( model, ids, view );
}
addTypeChooser( ids );
header.setLayout(new BorderLayout());
//header.add( dateChooser.getComponent(), BorderLayout.CENTER );
//header.add( viewChooser, BorderLayout.WEST );
header.setBorder( BorderFactory.createRaisedBevelBorder());
page.setLayout(new TableLayout( new double[][]{
{TableLayout.PREFERRED, TableLayout.FILL}
,{TableLayout.PREFERRED, TableLayout.FILL}}));
//page.add( header, BorderLayout.NORTH);
page.add( viewChooser, "0,0,0,0,f,f");
page.setBackground( Color.white );
//page.add( new JPanel(), "0,1,1,1,f,f");
update();
}
private void addTypeChooser( String[] ids )
{
viewChooser = new JComboBox( ids);
viewChooser.setVisible( viewChooser.getModel().getSize() > 0);
viewChooser.setSelectedItem( getModel().getViewId() );
viewChooser.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if ( !listenersEnabled )
return;
String viewId = (String) ((JComboBox)evt.getSource()).getSelectedItem();
try {
selectView( viewId );
} catch (RaplaException ex) {
showException(ex, page);
}
}
}
);
viewChooser.setRenderer( new DefaultListCellRenderer() {
private static final long serialVersionUID = 1L;
public Component getListCellRendererComponent(JList arg0, Object selectedItem, int index, boolean arg3, boolean arg4) {
super.getListCellRendererComponent( arg0, selectedItem, index, arg3, arg4);
if ( selectedItem == null) {
setIcon( null );
} else {
ViewFactory factory = findFactory( (String)selectedItem);
setText( factory.getName() );
setIcon( factory.getIcon());
}
return this;
}
});
}
private void addMenu( CalendarSelectionModel model, String[] ids, RaplaMenu view )
{
RaplaMenu viewMenu = new RaplaMenu("views");
viewMenu.setText(getString("show_as"));
view.insertBeforeId( viewMenu, "view_save");
ButtonGroup group = new ButtonGroup();
for (int i=0;i<ids.length;i++)
{
String id = ids[i];
RaplaMenuItem viewItem = new RaplaMenuItem( id);
if ( id.equals( model.getViewId()))
{
viewItem.setIcon( getIcon("icon.radio"));
}
else
{
viewItem.setIcon( getIcon("icon.empty"));
}
group.add( viewItem );
ViewFactory factory = findFactory( id );
viewItem.setText( factory.getName() );
viewMenu.add( viewItem );
viewItem.setSelected( id.equals( getModel().getViewId()));
viewMenuItems.put( id, viewItem );
viewItem.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if ( !listenersEnabled )
return;
String viewId = (String) ((IdentifiableMenuEntry)evt.getSource()).getId();
try {
selectView( viewId );
} catch (RaplaException ex) {
showException(ex, page);
}
}
});
}
}
private ViewFactory findFactory(String id) {
for (Iterator it = map.values().iterator();it.hasNext();) {
ViewFactory factory = (ViewFactory ) it.next();
if ( factory.getViewId().equals( id ) ) {
return factory;
}
}
return null;
}
private void selectView(String viewId) throws RaplaException {
listenersEnabled = false;
try {
getModel().setViewId( viewId );
update();
getSelectedCalendar().scrollToStart();
if ( viewMenuItems.size() > 0) {
for ( Iterator it = viewMenuItems.values().iterator();it.hasNext();)
{
RaplaMenuItem item = (RaplaMenuItem) it.next();
if ( item.isSelected() )
{
item.setIcon( getIcon("icon.empty"));
}
}
RaplaMenuItem item = (RaplaMenuItem)viewMenuItems.get( viewId );
item.setSelected( true );
item.setIcon( getIcon("icon.radio"));
}
viewChooser.setSelectedItem( viewId );
} finally {
listenersEnabled = true;
}
}
private String[] getIds() {
List factoryList = new ArrayList(map.values());
Collections.sort( factoryList, new Comparator() {
public int compare( Object arg0, Object arg1 )
{
ViewFactory f1 = (ViewFactory ) arg0;
ViewFactory f2 = (ViewFactory ) arg1;
return f1.getMenuSortKey().compareTo( f2.getMenuSortKey() );
}
});
List list = new ArrayList();
for (Iterator it = factoryList.iterator();it.hasNext();) {
ViewFactory factory = (ViewFactory ) it.next();
list.add(factory.getViewId());
}
return (String[] )list.toArray( Tools.EMPTY_STRING_ARRAY);
}
private CalendarSelectionModel getModel() {
return model;
}
private HashMap cache = new HashMap();
public void update() throws RaplaException {
if ( currentView!= null ) {
currentView.getComponent().setVisible( false );
if ( currentView.getDateSelection() != null)
currentView.getDateSelection().setVisible( false );
}
ViewFactory factory = (ViewFactory) findFactory( model.getViewId() );
if ( factory == null) {
return;
}
SwingCalendarView cal = (SwingCalendarView)cache.get( factory.getViewId() );
if ( cal == null ) {
cal = factory.createSwingView( getContext(), getModel(), editable);
cache.put( factory.getViewId(), cal);
if ( cal.getDateSelection() != null)
page.add( cal.getDateSelection(), "1,0,f,f" );
page.add( cal.getComponent(), "0,1,1,1,f,f" );
cal.getComponent().setBorder( BorderFactory.createEtchedBorder());
page.invalidate();
} else {
cal.getComponent().setVisible( true );
if ( cal.getDateSelection() != null)
{
cal.getDateSelection().setVisible( true );
}
cal.update( );
}
currentView = cal;
}
public SwingCalendarView getSelectedCalendar() {
return currentView;
}
public JComponent getComponent() {
return page;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -