All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.appdapter.gui.swing.SmallObjectView Maven / Gradle / Ivy

Go to download

Appdapter Maven project including Java and Scala, produces jar, not bundle. Excludes concrete SLF4J binding.

The newest version!
package org.appdapter.gui.swing;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.OverlayLayout;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

import org.appdapter.api.trigger.Box;
import org.appdapter.core.log.Debuggable;
import org.appdapter.gui.api.DisplayContext;
import org.appdapter.gui.api.NamedObjectCollection;
import org.appdapter.gui.api.ValueChangeListener;
import org.appdapter.gui.browse.Utility;
import org.appdapter.gui.editors.ObjectPanelHost;
import org.appdapter.gui.trigger.TriggerPopupMenu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jidesoft.icons.IconsFactory;

/**
 * A panel containing a very minimal GUI for an object
 * 

* * */ public class SmallObjectView extends ObjectView implements PropertyChangeListener, MouseListener, ActionListener, DragGestureListener, Transferable, DragSourceListener, DropTargetListener, ObjectPanelHost { @Override public String toString() { String ttt = getToolTipText(); if (ttt == null || ttt.length() == 0) { if (objectValue == null) return ""; ttt = Utility.makeTooltipText(objectValue); } return ttt; } static ImageIcon imageIconPropertyButton; class PropertyButton extends JButton { public PropertyButton() { super(); try { if (imageIconPropertyButton == null) imageIconPropertyButton = Utility.getImageIcon(IconView.class.getResource("PropertyButton.gif"), ":.:", Color.blue); setIcon(imageIconPropertyButton); } catch (Throwable err) { setText("..."); } //setFont(new Font("Serif", Font.PLAIN, 8)); setToolTipText("Open a property window for this object"); } @Override public Dimension getMinimumSize() { return getPreferredSize(); } @Override public Dimension getPreferredSize() { return new Dimension(16, 16); } } static ImageIcon imageIconRemoveButton; class RemoveButton extends JButton { public RemoveButton() { super(); try { if (imageIconRemoveButton == null) { imageIconRemoveButton = Utility.getImageIcon(IconView.class.getResource("RemoveButton.gif"), "x", Color.red); } setIcon(imageIconRemoveButton); } catch (Throwable err) { setText("x"); setForeground(Color.red); } //setFont(new Font("Serif", Font.PLAIN, 8)); setToolTipText("Removes this object from its parent collection"); } @Override public Dimension getMinimumSize() { return getPreferredSize(); } @Override public Dimension getPreferredSize() { return new Dimension(16, 16); } } private final static Color normalColor = Color.black; private final static Color selectedColor = Color.blue; private static Logger theLogger = LoggerFactory.getLogger(SmallObjectView.class); DisplayContext context; DragSource dragSource; //Invisible panel in front that captures menu events and drag/drop events JPanel frontGlass; //public Object objectValue; IconView iconView; JLabel label; JButton propButton; JButton removeButton; ValueChangeListener objectCollectionRemoveListener; boolean showIcon; boolean showLabel; boolean showPropButton; boolean showRemoveButton = true; boolean showToString; protected NamedObjectCollection nameMaker; protected boolean isRemoved = false; protected String title; /** * @param parent if a parent is provided, a "remove" button will be added allowing you to remove this object from the given collection */ public SmallObjectView(DisplayContext context, NamedObjectCollection namer, Object object, String title, boolean showLabel, boolean showIcon, boolean showPropButton, boolean showToString) { super(false); showIcon = false; objectValue = object; isRemoved = false; if (context == null) context = Utility.getCurrentContext(); this.context = context; this.showLabel = showLabel; this.showIcon = showIcon; this.showPropButton = showPropButton; this.showToString = showToString; this.title = title; initGUI(); this.addMouseListener(this); checkColor(); dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this); } public SmallObjectView(DisplayContext context, NamedObjectCollection namer, Object object) { this(context, namer, object, null, true, true, true, true); showRemoveButton = false; } @Override public void actionPerformed(ActionEvent evt) { if (evt.getSource() == propButton) { actionShowProperties(); } else if (evt.getSource() == removeButton) { actionRemove(); } else { } } public void actionRemove() { Object v = getValue(); valueChanged(this, v, null); isRemoved = true; objectValue = null; Container p = getParent(); if (p != null) p.remove(this); } //==== Drag/drop methods ========================== public void actionShowProperties() { try { Utility.showProperties(getValue()); } catch (Throwable err) { Utility.showError(context, "An error occurred while creating an interface for " + getValue(), err); } } private void checkColor() { //if (getPOJO().isSelected()) { // label.setForeground(selectedColor); //} else { if (label != null) { label.setForeground(normalColor); } //} } @Override public void dragDropEnd(DragSourceDropEvent dsde) { } @Override public void dragEnter(DragSourceDragEvent dsde) { } @Override public void dragEnter(DropTargetDragEvent dtde) { todo(); } @Override public void dragExit(DragSourceEvent dse) { } @Override public void dragExit(DropTargetEvent dte) { todo(); } //==== Drag/drop methods ========================== @Override public void dragGestureRecognized(DragGestureEvent event) { theLogger.debug("source dragGestureRecognized"); dragSource.startDrag(event, DragSource.DefaultMoveDrop, this, this); } @Override public void dragOver(DragSourceDragEvent dsde) { } @Override public void dragOver(DropTargetDragEvent dtde) { todo(); } @Override public void drop(DropTargetDropEvent event) { Transferable t = event.getTransferable(); try { Object o = t.getTransferData(new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType)); setObject(o); } catch (Exception err) { new ErrorDialog("An error occurred while handling a drop operation", err).show(); } } @Override public void dropActionChanged(DragSourceDragEvent dsde) { } @Override public void dropActionChanged(DropTargetDragEvent dtde) { todo(); } @Override public void focusOnBox(Box b) { setObject(b); } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { return getValue(); } @Override public DataFlavor[] getTransferDataFlavors() { try { return new DataFlavor[] { new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType) }; } catch (ClassNotFoundException err) { theLogger.error("An error occurred", err); return new DataFlavor[0]; } } @Override public Object getValue() { return objectValue; } @Override public boolean initGUI() { if (nameMaker == null) nameMaker = Utility.getTreeBoxCollection(); setLayout(new OverlayLayout(this)); JPanel panel = this; panel.setBorder(null); frontGlass = new JPanel(); frontGlass.setOpaque(false); panel.setLayout(new FlowLayout(FlowLayout.LEFT)); Object object = getValue(); if (object != null) { Class objectClass = object.getClass(); if (showIcon) { try { Icon image = Utility.getIcon(objectClass); if (image != null) { JLabel label = new JLabel(image); panel.add(label); } } catch (Throwable err) { } //iconView = new IconView(object.getIcon()); //add(iconView); } if (showLabel) { if (this.title == null) { title = Utility.getUniqueNameForKey(object, nameMaker); } String labelname = title; if ((title == null || title.equals("")) && object != null && !(object instanceof String)) { Utility.bug("title for " + object); } else { //if (labelname.length() > 128) { //labelname = labelname.substring(0, 128); //} } label = new JLabel("

" + labelname + "
"); panel.add(label); } if (showPropButton && !objectClass.isPrimitive()) { propButton = new PropertyButton(); panel.add(propButton); propButton.addActionListener(this); } if (isRemovable(object)) { removeButton = new RemoveButton(); panel.add(removeButton); removeButton.addActionListener(this); } String tooltip = Utility.makeTooltipText(object); setToolTipText(tooltip); if (showToString) { panel.add(new JLabel("
" + tooltip + "
")); } } else { panel.add(new JLabel("null")); } add(frontGlass); //add(panel); return true; } private void todo(Object... params) { Debuggable.notImplemented(params); } public boolean isRemovable(Object value) { return !isRemoved && showRemoveButton; } public void valueChanged(Object sender, Object oldObject, Object newObject) { if (sender != this) { reallySetValue(newObject); } else { if (objectCollectionRemoveListener != null) { objectCollectionRemoveListener.valueChanged(sender, oldObject, newObject); } } } //================================================================= @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.getMimeType().equals(DataFlavor.javaJVMLocalObjectMimeType); } @Override public void mouseClicked(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } else { /* try { collection.setSelected(getPOJO()); } catch (Exception err) {}*/ } } @Override public void mouseEntered(MouseEvent e) { Object gv = getValue(); gv = Utility.makeTooltipText(gv); setToolTipText("" + gv); label.setForeground(selectedColor); } @Override public void mouseExited(MouseEvent e) { label.setForeground(normalColor); } @Override public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } else { } } @Override public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } //setFont(new Font("Serif", Font.PLAIN, 8)); //setToolTipText("Removes this object from its parent collection"); } //================================================================= @Override public void objectValueChanged(Object oldBean, Object newBean) { reallySetValue(newBean); } @Override public void propertyChange(PropertyChangeEvent evt) { if (label != null) { label.setText(Utility.getUniqueNameForKey(getValue(), nameMaker)); } checkColor(); } @Override protected void reallySetValue(Object bean) { if (objectValue == bean) return; removeAll(); objectValue = bean; initGUI(); } public void addChangeListener(ValueChangeListener l) { this.objectCollectionRemoveListener = l; } private void showMenu(MouseEvent e) { showMenu(e.getX() + 5, e.getY() + 5, e); } private void showMenu(int x, int y, MouseEvent e) { Object object = getValue(); if (object == null) { object = this; } /*if (true || !object.getClass().isPrimitive()) { TriggerPopupMenu menu = new TriggerPopupMenu(context, e, nameMaker); menu.addMenuFromObject(object); frontGlass.add(menu); menu.show(frontGlass, x, y); }*/ } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy