/** * @(#)SelectionColorChooserHandler.java * * Copyright (c) 2010 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.draw.action; import javax.swing.event.ChangeEvent; import javax.swing.undo.*; import javax.swing.*; import java.util.*; import java.awt.*; import javax.swing.event.ChangeListener; import org.jhotdraw.draw.*; /** * SelectionColorChooserHandler. * * @author Werner Randelshofer * @version $Id$ */ public class SelectionColorChooserHandler extends AbstractSelectedAction implements ChangeListener { private static final long serialVersionUID = 1L; protected AttributeKey<Color> key; protected JColorChooser colorChooser; protected JPopupMenu popupMenu; protected int isUpdating; //protected Map<AttributeKey, Object> attributes; /** Creates a new instance. */ public SelectionColorChooserHandler(DrawingEditor editor, AttributeKey<Color> key, JColorChooser colorChooser, JPopupMenu popupMenu) { super(editor); this.key = key; this.colorChooser = colorChooser; this.popupMenu = popupMenu; //colorChooser.addActionListener(this); colorChooser.getSelectionModel().addChangeListener(this); updateEnabledState(); } @Override public void actionPerformed(java.awt.event.ActionEvent evt) { /* if (evt.getActionCommand() == JColorChooser.APPROVE_SELECTION) { applySelectedColorToFigures(); } else if (evt.getActionCommand() == JColorChooser.CANCEL_SELECTION) { }*/ popupMenu.setVisible(false); } protected void applySelectedColorToFigures() { final ArrayList<Figure> selectedFigures = new ArrayList<Figure>(getView().getSelectedFigures()); final ArrayList<Object> restoreData = new ArrayList<Object>(selectedFigures.size()); Color selectedColor = colorChooser.getColor(); if (selectedColor!=null&&selectedColor.getAlpha()==0) { selectedColor=null; } for (Figure figure : selectedFigures) { restoreData.add(figure.getAttributesRestoreData()); figure.willChange(); figure.set(key, selectedColor); figure.changed(); } getEditor().setDefaultAttribute(key, selectedColor); final Color undoValue = selectedColor; UndoableEdit edit = new AbstractUndoableEdit() { private static final long serialVersionUID = 1L; @Override public String getPresentationName() { return AttributeKeys.FONT_FACE.getPresentationName(); /* String name = (String) getValue(Actions.UNDO_PRESENTATION_NAME_KEY); if (name == null) { name = (String) getValue(AbstractAction.NAME); } if (name == null) { ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.draw.Labels"); name = labels.getString("attribute.text"); } return name;*/ } @Override public void undo() { super.undo(); Iterator<Object> iRestore = restoreData.iterator(); for (Figure figure : selectedFigures) { figure.willChange(); figure.restoreAttributesTo(iRestore.next()); figure.changed(); } } @Override public void redo() { super.redo(); for (Figure figure : selectedFigures) { //restoreData.add(figure.getAttributesRestoreData()); figure.willChange(); figure.set(key, undoValue); figure.changed(); } } }; fireUndoableEditHappened(edit); } @Override protected void updateEnabledState() { setEnabled(getEditor().isEnabled()); if (getView() != null && colorChooser != null && popupMenu != null) { colorChooser.setEnabled(getView().getSelectionCount() > 0); popupMenu.setEnabled(getView().getSelectionCount() > 0); isUpdating++; if (getView().getSelectionCount() > 0 /*&& colorChooser.isShowing()*/) { for (Figure f : getView().getSelectedFigures()) { Color figureColor = f.get(key); colorChooser.setColor(figureColor==null?new Color(0,true):figureColor); break; } } isUpdating--; } } @Override public void stateChanged(ChangeEvent e) { if (isUpdating++ == 0) { applySelectedColorToFigures(); } isUpdating--; } }