/* * Copyright 2003-2012 Yusuke Yamamoto * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package samurai.swing; import samurai.util.OSDetector; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Rectangle; import java.awt.SystemColor; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; /*package*/class Tile extends JPanel { private BorderLayout borderLayout1 = new BorderLayout(); private BorderLayout borderLayout2 = new BorderLayout(); /*package*/ JLabel title = new JLabel(); JComponent component; /*package*/ JPanel centerPanel = new JPanel(); /*package*/ JPanel northPanel = new JPanel(); private BorderLayout northPanelLayout = new BorderLayout(); /*package*/ JLabel rightLabel = new JLabel(); /*package*/ Tile(JComponent component, String title, ImageIcon icon) { setLayout(borderLayout1); setBorder(null); this.title.setBorder(null); this.title.setText(title); this.title.setIcon(icon); this.add(centerPanel, BorderLayout.CENTER); centerPanel.setLayout(borderLayout2); centerPanel.add(component, BorderLayout.CENTER); this.add(northPanel, java.awt.BorderLayout.NORTH); northPanel.setLayout(northPanelLayout); northPanel.add(this.title, java.awt.BorderLayout.CENTER); northPanel.add(rightLabel, java.awt.BorderLayout.EAST); this.component = component; this.title.setBorder(emptyBorder); } /*package*/ void addMouseListenerToTitle(MouseListener listener) { MouseListener[] listeners = title.getMouseListeners(); for (MouseListener listener1 : listeners) { if (listener1 == listener) { return; } } this.title.addMouseListener(listener); this.rightLabel.addMouseListener(listener); } /*package*/ void addMouseMotionListenerToTitle(MouseMotionListener listener) { MouseMotionListener[] listeners = title.getMouseMotionListeners(); for (MouseMotionListener listener1 : listeners) { if (listener1 == listener) { return; } } this.title.addMouseMotionListener(listener); this.rightLabel.addMouseMotionListener(listener); } /*package*/ void addMouseListenerToComponent(MouseListener listener) { MouseListener[] listeners = title.getMouseListeners(); for (MouseListener listener1 : listeners) { if (listener1 == listener) { return; } } this.title.addMouseListener(listener); addMouseListenerToComponents(listener, this.component); } private void addMouseListenerToComponents(MouseListener listener, Component component) { component.addMouseListener(listener); if (component instanceof Container) { Container container = (Container) component; for (int i = 0; i < container.getComponentCount(); i++) { addMouseListenerToComponents(listener, container.getComponent(i)); } } } /*package*/ void removeMouseListenerFromComponent(MouseListener listener) { this.title.removeMouseListener(listener); removeMouseListenerFromComponents(listener, this.component); } private void removeMouseListenerFromComponents(MouseListener listener, Component component) { component.removeMouseListener(listener); if (component instanceof Container) { Container container = (Container) component; for (int i = 0; i < container.getComponentCount(); i++) { removeMouseListenerFromComponents(listener, container.getComponent(i)); } } } /*package*/ JComponent getInnerComponent() { return this.component; } Border focuedBorder = new LineBorder(SystemColor.textHighlight, 2, true); Border emptyBorder = new EmptyBorder(2, 2, 2, 2); /*package*/ void setFocused(boolean focused) { if (focused) { this.title.setForeground(SystemColor.textText); this.centerPanel.setBorder(focuedBorder); } else { this.title.setForeground(SystemColor.textInactiveText); this.centerPanel.setBorder(emptyBorder); } } // /*private*/ void setUnfocused(){ // this.title.setForeground(SystemColor.textInactiveText); // this.centerPanel.setBorder(emptyBorder); // } // /*private*/ void setFocued(){ // this.title.setForeground(SystemColor.textText); // this.centerPanel.setBorder(focuedBorder); // } /*package*/ void enableTitleWithoutFocus() { this.title.setForeground(SystemColor.textText); this.centerPanel.setBorder(null); } /*package*/ void setLeftIcon(ImageIcon icon) { this.title.setIcon(icon); } private ImageIcon rightIcon = null; /*package*/ void setRightIcon(ImageIcon icon) { this.rightLabel.setIcon(icon); rightIcon = icon; } /*package*/ ImageIcon getRightIcon() { return rightIcon; } /*package*/ void setTitle(String title) { this.title.setText(title); } /*package*/ void setComponent(JComponent component) { centerPanel.remove(this.component); centerPanel.add(component, BorderLayout.CENTER); this.component = component; } /*package*/ String getTitle() { return this.title.getText(); } /*package*/ boolean isOnRightLabel(MouseEvent event) { if (OSDetector.isMac()) { return event.getSource() == title && 0 <= event.getX() && event.getX() < 18; } else { return event.getSource() == rightLabel; } } /*package*/ boolean isOnTitle(MouseEvent event) { if (event.getSource() == rightLabel) { Rectangle bounds = rightLabel.getBounds(); //get absolute coordinate for the mouse event double fixedX = event.getX() + bounds.getX(); double fixedY = event.getY() + bounds.getY(); return rightLabel.getBounds().contains(fixedX, fixedY) || title.getBounds().contains(fixedX, fixedY); } else if (event.getSource() == title) { return title.getBounds().contains(event.getX(), event.getY()); } else { return false; } } }