/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.ie.view.controller; import java.awt.Point; import java.awt.event.MouseEvent; import java.util.Enumeration; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JComponent; import org.openflexo.foundation.FlexoModelObject; import org.openflexo.foundation.ie.IEWOComponent; import org.openflexo.foundation.ie.cl.ComponentDefinition; import org.openflexo.foundation.ie.widget.IEHTMLTableWidget; import org.openflexo.foundation.ie.widget.IESequenceTR; import org.openflexo.foundation.ie.widget.IESequenceWidget; import org.openflexo.foundation.ie.widget.IETDWidget; import org.openflexo.foundation.ie.widget.IEWidget; import org.openflexo.ie.view.IEWOComponentView; import org.openflexo.ie.view.listener.DoubleClickResponder; import org.openflexo.ie.view.widget.ButtonPanel; import org.openflexo.ie.view.widget.DropTabZone; import org.openflexo.ie.view.widget.IEWidgetView; import org.openflexo.selection.MouseSelectionManager; import org.openflexo.view.menu.FlexoMenuBar; /** * Selection manager dedicated to Interface Editor module * * @author sguerin */ public class IESelectionManager extends MouseSelectionManager { protected static final Logger logger = Logger.getLogger(IESelectionManager.class.getPackage().getName()); public IESelectionManager(IEController controller) { super(controller); FlexoMenuBar menuBar = controller.getMenuBar(); _clipboard = new IEClipboard(this, menuBar.getEditMenu(controller).copyItem, menuBar.getEditMenu(controller).pasteItem, menuBar.getEditMenu(controller).cutItem); _contextualMenuManager = new IEContextualMenuManager(this, controller); } public IEController getIEController() { return (IEController) getController(); } @Override public boolean performSelectionSelectAll() { if (logger.isLoggable(Level.WARNING)) { logger.warning("'Select All' not implemented yet in Interface Editor"); } return false; } @Override public void processMouseClicked(JComponent clickedContainer, Point clickedPoint, int clickCount, boolean isShiftDown) { if (clickCount == 1) { setLastClickedContainer(clickedContainer); setLastClickedPoint(clickedPoint); if (clickedContainer instanceof IEWidgetView) { processSelection(((IEWidgetView) clickedContainer).getModel(), isShiftDown); } if (clickedContainer instanceof DropTabZone) { processSelection(((DropTabZone) clickedContainer).getIEModel(), isShiftDown); } if (clickedContainer instanceof ButtonPanel) { processSelection(((ButtonPanel) clickedContainer).getContainerModel(), isShiftDown); } } else if (clickCount == 2 && clickedContainer instanceof DoubleClickResponder) { ((DoubleClickResponder) clickedContainer).performDoubleClick(clickedContainer, clickedPoint, isShiftDown); } } private void processSelection(IEWidget w, boolean isShiftDown) { if (w.getIsRootOfPartialComponent()) { if (w.getParent() instanceof IEWidget) { w = (IEWidget) w.getParent(); } else { return; } } if (w instanceof IESequenceWidget && ((IESequenceWidget) w).isInTD()) { w = (IETDWidget) ((IESequenceWidget) w).getParent(); } else if (w instanceof IESequenceTR && ((IESequenceTR) w).isInHTMLTable()) { w = (IEHTMLTableWidget) ((IESequenceTR) w).getParent(); } if (selectionContains(w)) { if (isShiftDown) { removeFromSelected(w); } } else { if (isShiftDown) { addToSelected(w); } else { resetSelection(); if (w != null) { addToSelected(w); } } } } @Override public boolean performSelectionCut() { if (logger.isLoggable(Level.FINE)) { logger.fine("performSelectionCut in " + getClass().getName()); } _clipboard.performSelectionCut(getSelection()); Enumeration<FlexoModelObject> en = getSelection().elements(); while (en.hasMoreElements()) { FlexoModelObject o = en.nextElement(); if (o instanceof IETDWidget) { IESequenceWidget seq = ((IETDWidget) o).getSequenceWidget(); seq.removeFromContainer(); continue; } if (o instanceof IEWidget) { ((IEWidget) o).removeFromContainer(); } } return true; } @Override public void processMouseEntered(MouseEvent e) { if (e.getSource() instanceof IEWidgetView) { IEWidgetView p = (IEWidgetView) e.getSource(); if (!isCurrentlyFocused(p)) { if (_focusedPanel != null) { removeFocus(_focusedPanel); } setIsFocused(p); } } } @Override public void processMouseExited(MouseEvent e) { if (e.getSource() instanceof IEWidgetView) { IEWidgetView p = (IEWidgetView) e.getSource(); if (isCurrentlyFocused(p)) { removeFocus(p); } } } @Override public void processMousePressed(MouseEvent e) { if (logger.isLoggable(Level.FINE)) { logger.finest("Bounds:" + ((JComponent) e.getSource()).getBounds()); } if (logger.isLoggable(Level.FINE)) { logger.fine("Class:" + e.getSource().getClass().getName()); } } @Override public void processMouseReleased(MouseEvent e) { } /** * Returns the root object that can be currently edited * * @return FlexoModelObject */ @Override public FlexoModelObject getRootFocusedObject() { if (getIEController().getCurrentEditedComponent() == null) { return null; } return getIEController().getCurrentEditedComponent().getComponentDefinition(); } @Override public FlexoModelObject pasteContextForComponent(JComponent aComponent) { if (aComponent instanceof IEWOComponentView) { return ((IEWOComponentView) aComponent).getModel(); } else if (aComponent instanceof IEWidgetView) { return ((IEWidgetView) aComponent).getModel(); } return null; } /** * Add supplied object to current selection * * @param object * : the object to add to selection */ @Override protected void internallyAddToSelected(FlexoModelObject object, boolean isNewFocusedObject) { if (object == null || object.isDeleted()) { return; } if (object instanceof IEWidget) { if (((IEWidget) object).getWOComponent() == null) { return; } if (((IEWidget) object).getWOComponent().getRootSequence() == object) { object = ((IEWidget) object).getWOComponent(); } } if (object instanceof ComponentDefinition) { if (((ComponentDefinition) object).isLoaded()) { internallyAddToSelected(((ComponentDefinition) object).getWOComponent(), isNewFocusedObject); return; } } super.internallyAddToSelected(object, isNewFocusedObject); } /** * Remove supplied object from current selection * * @param object * : the object to remove from selection */ @Override protected void internallyRemoveFromSelected(FlexoModelObject object) { if (object instanceof ComponentDefinition) { if (((ComponentDefinition) object).isLoaded()) { if (selectionContains(((ComponentDefinition) object).getWOComponent())) { super.internallyRemoveFromSelected(((ComponentDefinition) object).getWOComponent()); return; } } } if (object instanceof IEWOComponent) { if (selectionContains(((IEWOComponent) object).getComponentDefinition())) { super.internallyRemoveFromSelected(((IEWOComponent) object).getComponentDefinition()); return; } } super.internallyRemoveFromSelected(object); } }