+ /**
+ * Creates a panel displaying a single component.
+ *
+ * @param controlledComponent
+ * The component to display
+ * @return The created panel
+ */
+ private static JPanel createComponentPanel(final ControlledComponent controlledComponent, final ControlledComponent parentComponent) {
+ JPanel componentPanel = new JPanel(new BorderLayout(12, 12));
+ componentPanel.setBorder(createCompoundBorder(createEtchedBorder(), createEmptyBorder(0, 4, 0, 3)));
+ componentPanel.add(new JLabel(controlledComponent.name()), BorderLayout.WEST);
+ final JLabel titleLabel = new JLabel(controlledComponent.metadata().title());
+ titleLabel.setFont(titleLabel.getFont().deriveFont(titleLabel.getFont().getSize2D() * 0.8f));
+ componentPanel.add(titleLabel, BorderLayout.EAST);
+ if (parentComponent != null) {
+ titleLabel.setVisible(!parentComponent.metadata().title().equals(controlledComponent.metadata().title()));
+ parentComponent.addMetadataListener(new MetadataListener() {
+
+ @Override
+ public void metadataUpdated(ControlledComponent component, Metadata metadata) {
+ titleLabel.setText(metadata.title());
+ titleLabel.setVisible(!controlledComponent.metadata().title().equals(metadata.title()));
+ }
+ });
+ }
+ controlledComponent.addMetadataListener(new MetadataListener() {
+
+ @Override
+ public void metadataUpdated(ControlledComponent component, Metadata metadata) {
+ titleLabel.setText(metadata.title());
+ titleLabel.setVisible((parentComponent == null) || !parentComponent.metadata().title().equals(metadata.title()));
+ }
+ });
+ return componentPanel;
+ }
+
+ /**
+ * Interface for objects that want to be notified if the user moves the mouse
+ * cursor over a controlled component.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ public static interface ComponentHoverListener extends EventListener {
+
+ /**
+ * Notifies the listener that the mouse is now over the given controlled
+ * component.
+ *
+ * @param controlledComponent
+ * The controlled component now under the mouse
+ */
+ void componentEntered(ControlledComponent controlledComponent);
+
+ }
+