package cn.edu.pku.sei.capriceui;
import cn.edu.pku.sei.capriceui.verticaltext.VTextIcon;
import cn.edu.pku.sei.capriceui.verticaltext.CompositeIcon;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import org.jdesktop.swingx.border.DropShadowBorder;
/**
* User: zhangwei
* Date: 2003-4-3
* Time: 15:26:01
*/
/**
* �����������ӵ�������
* 1. ͬһ��ͣ���������������ڱ�ѡ��.(��ǰ�汾ֻ֧�����һ�����ڴ��ڱ�ѡ��״̬)
* ��������ڴ��ڱ�ѡ��״̬ʱ���������ڷֱ�ռ��ͣ������Ӧ��ʾ�����һ���֡�
* ����ռ�ݷ�ʽ��Ϊ�������:
* a. ��ǰͣ����Ϊ���Ҳ�ͣ���������Ӧ����ʾ��������ָ
* ����ͼ��ʾ���������ͣ�������������ڱ�ѡ��������������ֱ�ռ������1��2��3������ʾ����
* --------------------------
* | | |
* | | ����1 |
* | | |
* | �� |-------------------|
* | �� | |
* | ͣ | ����2 |
* | �� | |
* | �� |-------------------|
* | | |
* | | ����3 |
* | | |
* --------------------------
*
* b. ��ǰͣ����Ϊ���²�ͣ���������Ӧ����ʾ������ָ
* ����ͼ��ʾ�������²�ͣ�������������ڱ�ѡ��������������ֱ�ռ������1��2��3������ʾ����:
* --------------------------------------------------------
* | | | |
* | ����1 | ����2 | ����3 |
* | | | |
* --------------------------------------------------------
* | �²�ͣ���� |
* --------------------------------------------------------
*/
public class CapricePanel extends JPanel implements SwingConstants {
protected JCapriceDesktopPane desktop = null;
protected CapriceDesktopManager desktopManager = null;
protected JInternalFrame centerFrame = null;
protected CapriceToolBar westToolBar = null;
protected CapriceToolBar eastToolBar = null;
protected CapriceToolBar northToolBar = null;
protected CapriceToolBar southToolBar = null;
protected CapriceButtonGroup westButtonGroup = null;
protected CapriceButtonGroup eastButtonGroup = null;
protected CapriceButtonGroup northButtonGroup = null;
protected CapriceButtonGroup southButtonGroup = null;
protected final Insets insets0 = new Insets(0, 0, 0, 0);
// protected ImageIcon icon = new ImageIcon(getClass().getResource("image/window.gif"));
// protected ImageIcon child = new ImageIcon(getClass().getResource("image/child.jpg"));
protected ImageIcon icon = null;
protected ImageIcon child = null;
protected final PopupMenuTrigger popupMenuTrigger = new PopupMenuTrigger();
//private static Color freashColor = new Color(153, 153, 204);
//private static Border compBorder = new DropShadowBorder(null, 2, 4, (float)0.5, 10, false, false, true, true);
private static Border compBorder = new DropShadowBorder();
private int count = 0;
public CapricePanel() {
super();
try{
icon= new ImageIcon(new URL("http://localhost:8080/FMTool_Web2/resources/capriceui/window.gif"));
child = new ImageIcon(new URL("http://localhost:8080/FMTool_Web2/resources/capriceui/child.jpg"));
}catch(Exception e){
e.printStackTrace();
}
this.setLayout(new BorderLayout());
westToolBar = new CapriceToolBar(SwingConstants.VERTICAL);
westToolBar.setFloatable(false);
westToolBar.setBorder(BorderFactory.createEmptyBorder());
eastToolBar = new CapriceToolBar(SwingConstants.VERTICAL);
eastToolBar.setFloatable(false);
eastToolBar.setBorder(BorderFactory.createEmptyBorder());
northToolBar = new CapriceToolBar(SwingConstants.HORIZONTAL);
northToolBar.setFloatable(false);
northToolBar.setBorder(BorderFactory.createEmptyBorder());
final JToggleButton marginOfToolBar = new JToggleButton();
marginOfToolBar.setMinimumSize(new Dimension(westToolBar.getWidth(), 0));
marginOfToolBar.setPreferredSize(marginOfToolBar.getMinimumSize());
marginOfToolBar.setMaximumSize(marginOfToolBar.getMinimumSize());
marginOfToolBar.setEnabled(false);
marginOfToolBar.setFocusPainted(false);
marginOfToolBar.setBorderPainted(false);
northToolBar.add(marginOfToolBar);
westToolBar.addComponentListener(new ComponentListener() {
public void componentResized(ComponentEvent e) {
int newWidth = e.getComponent().getWidth();
int oldWidth = marginOfToolBar.getWidth();
if (newWidth == oldWidth) return;
marginOfToolBar.setMinimumSize(new Dimension(westToolBar.getWidth(), 0));
marginOfToolBar.setPreferredSize(marginOfToolBar.getMinimumSize());
marginOfToolBar.setMaximumSize(marginOfToolBar.getMinimumSize());
marginOfToolBar.invalidate();
northToolBar.validate();
northToolBar.repaint();
}
public void componentMoved(ComponentEvent e) {
}
public void componentShown(ComponentEvent e) {
}
public void componentHidden(ComponentEvent e) {
}
}
);
southToolBar = new CapriceToolBar(SwingConstants.HORIZONTAL);
southToolBar.setFloatable(false);
southToolBar.setBorder(BorderFactory.createEmptyBorder());
westButtonGroup = new CapriceButtonGroup();
eastButtonGroup = new CapriceButtonGroup();
northButtonGroup = new CapriceButtonGroup();
southButtonGroup = new CapriceButtonGroup();
westButtonGroup.setInvisibleButton(new JToggleButton());
eastButtonGroup.setInvisibleButton(new JToggleButton());
northButtonGroup.setInvisibleButton(new JToggleButton());
southButtonGroup.setInvisibleButton(new JToggleButton());
desktop = new JCapriceDesktopPane();
desktopManager = new CapriceDesktopManager();
desktop.setDesktopManager(desktopManager);
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
westButtonGroup.addPropertyChangeListener(desktopManager);
eastButtonGroup.addPropertyChangeListener(desktopManager);
northButtonGroup.addPropertyChangeListener(desktopManager);
southButtonGroup.addPropertyChangeListener(desktopManager);
northToolBar.setMargin(new Insets(0, 50, 0, 50));
this.add(northToolBar, BorderLayout.NORTH);
this.add(westToolBar, BorderLayout.WEST);
this.add(eastToolBar, BorderLayout.EAST);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(southToolBar, BorderLayout.SOUTH);
panel.add(desktop, BorderLayout.CENTER);
this.add(panel, BorderLayout.CENTER);
//��ʼ���������
centerFrame = new JInternalFrame("CenterFrame");
centerFrame.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
centerFrame.setBorder(BorderFactory.createEtchedBorder());
//centerFrame.getContentPane().setBackground(freashColor);
centerFrame.putClientProperty(CapriceConstants.IS_FIRST_TIME, CapriceConstants.TRUE);
centerFrame.setUI(new CapriceInternalFrameUI(centerFrame, SwingConstants.CENTER));
desktop.add(centerFrame);
setIconBarAutoHideable(false);
}
//forwarding method
public void setCornerType(String cornerName, int cornerType) {
desktopManager.setCornerType(cornerName, cornerType, true);
}
//forwarding method
public int getCornerType(String cornerName) {
return desktopManager.getCornerType(cornerName);
}
public void setIconBarAutoHideable(boolean autoHideable) {
westToolBar.setAutoHideable(autoHideable);
eastToolBar.setAutoHideable(autoHideable);
northToolBar.setAutoHideable(autoHideable);
southToolBar.setAutoHideable(autoHideable);
}
public boolean isIconBarAutoHideable() {
return westToolBar.isAutoHideable();
}
public void add(JComponent comp, int position) {
add(comp, null, null, position);
}
public void add(JComponent comp, Icon icon, String title, int position) {
if (comp == null) return;
if (position == CENTER) {
if(title == null || title.length() <= 0){
title = "Frame " + (++count);
}
centerFrame.getContentPane().add(comp, BorderLayout.CENTER);
desktopManager.update();
return;
}
if ((position != WEST) && (position != EAST) && (position != SOUTH) && (position != NORTH)) {
return;
}
//JInternalFrame jif = new JInternalFrame("", true, true, false, false);
JInternalFrame jif = new CapriceInternalFrame("", true, true, false, false);
if (title == null || title.length() <= 0) {
jif.setTitle("Frame " + (++count));
}else{
jif.setTitle(title);
}
if(icon != null)
jif.setFrameIcon(icon);
jif.getContentPane().add(comp, BorderLayout.CENTER);
//jif.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(), compBorder));
jif.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
jif.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
jif.setUI(new CapriceInternalFrameUI(jif, position));
jif.putClientProperty(CapriceConstants.IS_FIRST_TIME, CapriceConstants.TRUE);
Insets insets = jif.getInsets();
Dimension dim = null;
if (position == (SwingConstants.NORTH))
dim = new Dimension(insets.left, (int) jif.getMinimumSize().getHeight());
else if (position == (SwingConstants.SOUTH))
//dim = new Dimension(insets.left, (int)jif.getMinimumSize().getHeight());
dim = new Dimension(insets.left, insets.top);
else if (position == (SwingConstants.WEST))
dim = new Dimension(insets.left, insets.bottom);
else if (position == (SwingConstants.EAST))
dim = new Dimension(insets.right, insets.bottom);
else if (position == (SwingConstants.CENTER))
dim = new Dimension(0, 0);
else
assert false;
jif.setMinimumSize(dim);
Dimension maximumSize = comp.getMaximumSize();
//maximumSize.height += 12;
//maximumSize.width += 5;
jif.setMaximumSize(maximumSize);
JToggleButton button = new JToggleButton();
if (position == WEST || position == EAST) {
VTextIcon textIcon = new VTextIcon(button, jif.getTitle(), VTextIcon.ROTATE_DEFAULT);
Icon buttonIcon = new CompositeIcon(jif.getFrameIcon(), textIcon);
button.setIcon(buttonIcon);
} else {
button.setIcon(jif.getFrameIcon());
button.setText(jif.getTitle());
}
button.setBorderPainted(true);
//button.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
button.setMargin(insets0);
button.addMouseListener(popupMenuTrigger);
jif.putClientProperty(CapriceConstants.RELATED_BUTTON_MODEL, button.getModel());
desktop.add(jif);
if (position == WEST) {
westToolBar.add(button);
westButtonGroup.add(button);
westButtonGroup.setSelected(button.getModel(), true);
this.validate();
} else if (position == EAST) {
eastToolBar.add(button);
eastButtonGroup.add(button);
eastButtonGroup.setSelected(button.getModel(), true);
this.validate();
} else if (position == NORTH) {
northToolBar.add(button);
northButtonGroup.add(button);
northButtonGroup.setSelected(button.getModel(), true);
this.validate();
} else if (position == SOUTH) {
southToolBar.add(button);
southButtonGroup.add(button);
southButtonGroup.setSelected(button.getModel(), true);
this.validate();
} else if (position == CENTER) {
desktopManager.update();
}
}
public void removeCurrent(int position) {
}
protected class PopupMenuTrigger implements MouseListener {
JPopupMenu northPopupMenu = null;
JPopupMenu southPopupMenu = null;
JPopupMenu westPopupMenu = null;
JPopupMenu eastPopupMenu = null;
JMenu northMoveToMenu = new JMenu("�ƶ���");
JMenu southMoveToMenu = new JMenu("�ƶ���");
JMenu westMoveToMenu = new JMenu("�ƶ���");
JMenu eastMoveToMenu = new JMenu("�ƶ���");
ChangePlaceAction moveToTopAction = new ChangePlaceAction(SwingConstants.NORTH);
ChangePlaceAction moveToBottomAction = new ChangePlaceAction(SwingConstants.SOUTH);
ChangePlaceAction moveToLeftAction = new ChangePlaceAction(SwingConstants.WEST);
ChangePlaceAction moveToRightAction = new ChangePlaceAction(SwingConstants.EAST);
public PopupMenuTrigger() {
northPopupMenu = new JPopupMenu();
southPopupMenu = new JPopupMenu();
westPopupMenu = new JPopupMenu();
eastPopupMenu = new JPopupMenu();
northPopupMenu.add(northMoveToMenu);
southPopupMenu.add(southMoveToMenu);
westPopupMenu.add(westMoveToMenu);
eastPopupMenu.add(eastMoveToMenu);
northMoveToMenu.add(moveToBottomAction);
northMoveToMenu.add(moveToLeftAction);
northMoveToMenu.add(moveToRightAction);
southMoveToMenu.add(moveToTopAction);
southMoveToMenu.add(moveToLeftAction);
southMoveToMenu.add(moveToRightAction);
westMoveToMenu.add(moveToTopAction);
westMoveToMenu.add(moveToBottomAction);
westMoveToMenu.add(moveToRightAction);
eastMoveToMenu.add(moveToTopAction);
eastMoveToMenu.add(moveToBottomAction);
eastMoveToMenu.add(moveToLeftAction);
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
showPopupMenu(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
showPopupMenu(e);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
protected void showPopupMenu(MouseEvent e) {
JToggleButton button = (JToggleButton) e.getSource();
JPopupMenu targetMenu = null;
if (northToolBar.getComponentIndex(button) >= 0) {
targetMenu = northPopupMenu;
} else if (southToolBar.getComponentIndex(button) >= 0) {
targetMenu = southPopupMenu;
} else if (westToolBar.getComponentIndex(button) >= 0) {
targetMenu = westPopupMenu;
} else if (eastToolBar.getComponentIndex(button) >= 0) {
targetMenu = eastPopupMenu;
}
if (targetMenu != null) {
moveToTopAction.putValue("relatedMouseEvent", e);
moveToBottomAction.putValue("relatedMouseEvent", e);
moveToLeftAction.putValue("relatedMouseEvent", e);
moveToRightAction.putValue("relatedMouseEvent", e);
targetMenu.show(button, e.getX(), e.getY());
}
}
}
protected class ChangePlaceAction extends AbstractAction {
int position = -1;
public ChangePlaceAction(int position) {
this.position = position;
switch (position) {
case SwingConstants.NORTH:
this.putValue(Action.NAME, "����");
break;
case SwingConstants.SOUTH:
this.putValue(Action.NAME, "�ײ�");
break;
case SwingConstants.WEST:
this.putValue(Action.NAME, "��");
break;
case SwingConstants.EAST:
this.putValue(Action.NAME, "�Ҳ�");
break;
}
}
public void actionPerformed(ActionEvent e) {
MouseEvent event = (MouseEvent) this.getValue("relatedMouseEvent");
if (event == null) return;
JToggleButton button = (JToggleButton) event.getSource();
boolean oldSelectState = button.isSelected();
int oldPosition = -1;
if (northToolBar.getComponentIndex(button) >= 0) {
oldPosition = SwingConstants.NORTH;
} else if (southToolBar.getComponentIndex(button) >= 0) {
oldPosition = SwingConstants.SOUTH;
} else if (westToolBar.getComponentIndex(button) >= 0) {
oldPosition = SwingConstants.WEST;
} else if (eastToolBar.getComponentIndex(button) >= 0) {
oldPosition = SwingConstants.EAST;
}
if ((oldPosition == -1) || (oldPosition == position))
return;
Component[] children = desktop.getComponents();
JInternalFrame targetFrame = null;
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof JInternalFrame) {
targetFrame = (JInternalFrame) children[i];
if (targetFrame.getClientProperty(CapriceConstants.RELATED_BUTTON_MODEL)
== button.getModel()) {
break;
} else {
targetFrame = null;
}
}
}
if (targetFrame == null) return;
//ɾ������ͼ��
button.setSelected(false);
if (oldPosition == WEST) {
westToolBar.remove(button);
westButtonGroup.remove(button);
} else if (oldPosition == EAST) {
eastToolBar.remove(button);
eastButtonGroup.remove(button);
} else if (oldPosition == NORTH) {
northToolBar.remove(button);
northButtonGroup.remove(button);
} else if (oldPosition == SOUTH) {
southToolBar.remove(button);
southButtonGroup.remove(button);
}
//ɾ�����
desktop.remove(targetFrame);
//�����嵽��λ��
Insets insets = targetFrame.getInsets();
Dimension dim = null;
if (position == (SwingConstants.NORTH))
dim = new Dimension(insets.left, (int) targetFrame.getMinimumSize().getHeight());
else if (position == (SwingConstants.SOUTH))
dim = new Dimension(insets.left, insets.top);
else if (position == (SwingConstants.WEST))
dim = new Dimension(insets.left, insets.bottom);
else if (position == (SwingConstants.EAST))
dim = new Dimension(insets.right, insets.bottom);
else if (position == (SwingConstants.CENTER))
dim = new Dimension(0, 0);
else
assert false;
targetFrame.setMinimumSize(dim);
targetFrame.setUI(new CapriceInternalFrameUI(targetFrame, position));
desktop.add(targetFrame);
if ((oldPosition == WEST || oldPosition == EAST) && (position == NORTH || position == SOUTH)) {
button.setIcon(targetFrame.getFrameIcon());
button.setText(targetFrame.getTitle());
} else if ((oldPosition == NORTH || oldPosition == SOUTH) && (position == WEST || position == EAST)) {
VTextIcon textIcon = new VTextIcon(button, targetFrame.getTitle(), VTextIcon.ROTATE_DEFAULT);
Icon buttonIcon = new CompositeIcon(targetFrame.getFrameIcon(), textIcon);
button.setIcon(buttonIcon);
button.setText(null);
}
//��ӿ���ͼ�굽��λ��
if (position == WEST) {
westToolBar.add(button);
westButtonGroup.add(button);
if (oldSelectState) {
westButtonGroup.setSelected(button.getModel(), true);
}
} else if (position == EAST) {
eastToolBar.add(button);
eastButtonGroup.add(button);
if (oldSelectState) {
eastButtonGroup.setSelected(button.getModel(), true);
}
} else if (position == NORTH) {
northToolBar.add(button);
northButtonGroup.add(button);
if (oldSelectState) {
northButtonGroup.setSelected(button.getModel(), true);
}
} else if (position == SOUTH) {
southToolBar.add(button);
southButtonGroup.add(button);
if (oldSelectState) {
southButtonGroup.setSelected(button.getModel(), true);
}
}
CapricePanel.this.validate();
CapricePanel.this.repaint();
}
}
}