package de.juwimm.cms.gui.tree; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.plaf.basic.BasicLabelUI; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import de.juwimm.cms.common.Constants.ResourceUsageState; import de.juwimm.cms.util.UIConstants; import de.juwimm.cms.vo.DocumentSlimValue; import de.juwimm.cms.vo.PictureSlimstValue; import de.juwimm.cms.vo.SiteValue; import de.juwimm.cms.vo.UnitValue; /** * @author <a href="florin.zalum@juwimm.com">Florin Zalum</a> * @version $Id$ */ public class CmsResourcesTreeModel extends DefaultTreeModel { private static final long serialVersionUID = 7201877101394641381L; private Map<Integer, DocumentTreeNode> documentsToDelete; private Map<Integer, PictureTreeNode> picturesToDelete; public CmsResourcesTreeModel(DefaultMutableTreeNode root) { super(root); documentsToDelete = new HashMap<Integer, DocumentTreeNode>(); picturesToDelete = new HashMap<Integer, PictureTreeNode>(); } public void addResourceToDelete(DocumentTreeNode documentNode) { documentsToDelete.put(documentNode.getId(), documentNode); } public void addResourceToDelete(PictureTreeNode pictureTreeNode) { picturesToDelete.put(pictureTreeNode.getId(), pictureTreeNode); } public void removeResourceFromDelete(DocumentTreeNode documentNode) { documentsToDelete.remove(documentNode.getId()); } public void removeResourceFromDelete(PictureTreeNode pictureTreeNode) { picturesToDelete.remove(pictureTreeNode.getId()); } public Integer[] getPicturesToDelete() { return picturesToDelete.keySet().toArray(new Integer[0]); } public Integer[] getDocumentsToDelete() { return documentsToDelete.keySet().toArray(new Integer[0]); } public boolean areResourcesUsedInHistory() { for (Entry<Integer, DocumentTreeNode> documentToDelete : documentsToDelete.entrySet()) { if (documentToDelete.getValue().getState() == ResourceUsageState.UsedInOlderVersions) { return true; } } for (Entry<Integer, PictureTreeNode> pictureToDelete : picturesToDelete.entrySet()) { if (pictureToDelete.getValue().getState() == ResourceUsageState.UsedInOlderVersions) { return true; } } return false; } public void deleteResourcesFromTree() { for (PictureTreeNode pictureNode : picturesToDelete.values()) { this.removeNodeFromParent(pictureNode); } for (DocumentTreeNode documentNode : documentsToDelete.values()) { this.removeNodeFromParent(documentNode); } clearResourcesSelection(); } public void clearResourcesSelection() { picturesToDelete.clear(); documentsToDelete.clear(); } @Override public DefaultMutableTreeNode getRoot() { return (DefaultMutableTreeNode) super.getRoot(); } public static abstract class CmsResourcesTreeNode<T> extends TreeNode { private static final long serialVersionUID = 1L; private boolean isChecked = false; T value; public CmsResourcesTreeNode(String name, T value) { super(name); this.value = value; } public T getValue() { return value; } public abstract Integer getId(); public boolean toogleCheck() { isChecked = !isChecked; return isChecked; } public boolean isChecked() { return isChecked; } } public static abstract class CmsStateResourceTreeNode<T> extends CmsResourcesTreeNode<T> { private static final long serialVersionUID = 7680943302220865979L; private ResourceUsageState state; public CmsStateResourceTreeNode(String name, T value, ResourceUsageState state) { super(name, value); this.state = state; } public ResourceUsageState getState() { return state; } } public static class SiteTreeNode extends CmsResourcesTreeNode<SiteValue> { private static final long serialVersionUID = -7236858154971687599L; public SiteTreeNode(SiteValue site) { super(site.getName(), site); } @Override public ImageIcon getIcon() { return UIConstants.ICON_MANDANT; } @Override public Integer getId() { return value.getSiteId(); } } public static class UnitTreeNode extends CmsResourcesTreeNode<UnitValue> { private static final long serialVersionUID = 3099538424767131542L; public UnitTreeNode(UnitValue unit) { super(unit.getName(), unit); } @Override public ImageIcon getIcon() { return UIConstants.ICON_UNIT; } @Override public Integer getId() { return value.getUnitId(); } } public static class DocumentTreeNode extends CmsStateResourceTreeNode<DocumentSlimValue> { private static final long serialVersionUID = 3777971038493127103L; public DocumentTreeNode(DocumentSlimValue document, ResourceUsageState state) { super(document.getDocumentName(), document, state); } @Override public ImageIcon getIcon() { return UIConstants.ICON_RESOURCE_DOCUMENT; } @Override public boolean isEditable() { return true; } @Override public Integer getId() { return value.getDocumentId(); } } public static class PictureTreeNode extends CmsStateResourceTreeNode<PictureSlimstValue> { private static final long serialVersionUID = 3777971038493127103L; public PictureTreeNode(PictureSlimstValue picture, ResourceUsageState state) { super(picture.getPictureName(), picture, state); this.value = picture; } @Override public boolean isEditable() { return true; } @Override public ImageIcon getIcon() { return UIConstants.ICON_RESOURCE_PICTURE; } @Override public Integer getId() { return value.getPictureId(); } } public static class CmsResourcesCellRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; CmsResourcesLabelUI labelUI = new CmsResourcesLabelUI(); public CmsResourcesCellRenderer() { this.setUI(labelUI); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus); if (value instanceof TreeNode) { TreeNode tn = (TreeNode) value; setIcon(tn.getIcon()); } if (value instanceof CmsStateResourceTreeNode) { JCheckBox checkBox = new JCheckBox(); JPanel panel = new JPanel(); CmsStateResourceTreeNode node = (CmsStateResourceTreeNode) value; panel.setBackground(Color.white); if (node.getState() == ResourceUsageState.Used) { checkBox.setEnabled(false); } else { checkBox.setSelected(node.isChecked()); } checkBox.setBackground(Color.white); panel.setOpaque(false); this.setOpaque(false); panel.setLayout(new BorderLayout()); panel.add(checkBox, BorderLayout.WEST); panel.add(this, BorderLayout.CENTER); labelUI.setState(node.getState()); labelUI.setResourceType(node instanceof PictureTreeNode ? true : false); return panel; } else { labelUI.setState(null); } return this; } } private static class CmsResourcesLabelUI extends BasicLabelUI { ResourceUsageState state = null; Boolean isPicture; public void setState(ResourceUsageState state) { this.state = state; } public void setResourceType(boolean b) { isPicture = b; } @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); if (state == null) { return; } switch (state) { case Unsused: { g.setColor(new Color(0x006600)); break; } case Used: { g.setColor(new Color(248, 25, 25)); break; } case UsedInOlderVersions: { g.setColor(new Color(0xc8d40b)); break; } } if (isPicture) { g.drawRect(0, 2, 15, 12); g.setColor(new Color(0xa9a9a9)); g.drawRect(-1, 1, 17, 14); } else { g.drawRect(2, 2, 12, 12); g.setColor(new Color(0xa9a9a9)); g.drawRect(1, 1, 14, 14); } } } }