/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS
* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.icepdf.ri.common.tools;
import org.icepdf.core.util.PropertyConstants;
import org.icepdf.ri.common.views.AbstractPageViewComponent;
import org.icepdf.ri.common.views.DocumentViewController;
import org.icepdf.ri.common.views.DocumentViewModel;
import org.icepdf.ri.common.views.PageViewComponentImpl;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import java.util.logging.Logger;
/**
* TextSelectionViewHandler propagates text selection events into the the
* views child page components. This handle is required for multi-page text
* selection. On mouse click all text selection states are removed.
*
* @since 5.0
*/
public class TextSelectionViewHandler extends TextSelection
implements ToolHandler, MouseWheelListener {
protected static final Logger logger =
Logger.getLogger(TextSelectionViewHandler.class.toString());
protected JComponent parentComponent;
protected boolean isDragging;
public TextSelectionViewHandler(DocumentViewController documentViewController,
DocumentViewModel documentViewModel,
JComponent parentComponent) {
super(documentViewController, null, documentViewModel);
this.parentComponent = parentComponent;
}
public void mouseClicked(MouseEvent e) {
// clear all selected text.
documentViewController.clearSelectedText();
clearSelectionState();
// check if we are over a page
PageViewComponentImpl pageComponent = isOverPageComponent(parentComponent, e);
if (pageComponent != null) {
pageComponent.requestFocus();
// click word and line selection
MouseEvent modeEvent = SwingUtilities.convertMouseEvent(parentComponent, e, pageComponent);
pageComponent.getTextSelectionPageHandler().wordLineSelection(
modeEvent.getClickCount(), modeEvent.getPoint(), pageComponent);
}
}
public void mousePressed(MouseEvent e) {
// clear all selected text.
documentViewController.clearSelectedText();
clearSelectionState();
lastMousePressedLocation = e.getPoint();
// start selection box.
resetRectangle(e.getX(), e.getY());
// check if we are over a page
PageViewComponentImpl pageComponent = isOverPageComponent(parentComponent, e);
if (pageComponent != null) {
pageComponent.requestFocus();
MouseEvent modeEvent = SwingUtilities.convertMouseEvent(parentComponent, e, pageComponent);
pageComponent.getTextSelectionPageHandler().selectionStart(modeEvent.getPoint(), pageComponent, true);
}
}
public void mouseReleased(MouseEvent e) {
isDragging = false;
// deselect rectangles on other selected pages.
ArrayList<AbstractPageViewComponent> selectedPages =
documentViewModel.getSelectedPageText();
// check if we are over a page
AbstractPageViewComponent pageComponent =
isOverPageComponent(parentComponent, e);
if (pageComponent != null) {
MouseEvent modeEvent = SwingUtilities.convertMouseEvent(
parentComponent, e, pageComponent);
if (selectedPages != null &&
selectedPages.size() > 0) {
PageViewComponentImpl pageComp;
for (AbstractPageViewComponent selectedPage : selectedPages) {
pageComp = (PageViewComponentImpl)selectedPage;
if (pageComp != null) {
pageComp.getTextSelectionPageHandler().selectionEnd(modeEvent.getPoint(), pageComp);
}
}
}
}
// finally if we have selected any text then fire a property change event
if (selectedPages != null && selectedPages.size() > 0) {
documentViewController.firePropertyChange(
PropertyConstants.TEXT_SELECTED,
null, null);
}
// clear the rectangle
clearRectangle(parentComponent);
}
public void mouseWheelMoved(MouseWheelEvent e) {
if (isDragging) {
Component target = documentViewController.getViewPort().getView();
Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), target);
MouseEvent m = new MouseEvent(target,
0, e.getWhen(), e.getModifiers(),
p.x, p.y,
e.getClickCount(), e.isPopupTrigger(), e.getButton());
mouseDragged(m);
}
}
public void mouseDragged(MouseEvent e) {
// handle text selection drags.
if (documentViewController != null) {
isDragging = true;
// update the currently parentComponent box
updateSelectionSize(e.getX(), e.getY(), parentComponent);
// clear previously selected pages
documentViewModel.clearSelectedPageText();
// add selection box to child pages
if (documentViewModel != null) {
java.util.List<AbstractPageViewComponent> pages =
documentViewModel.getPageComponents();
for (AbstractPageViewComponent page : pages) {
Rectangle tmp = SwingUtilities.convertRectangle(
parentComponent, getRectToDraw(), page);
if (page.getBounds().intersects(tmp)) {
// add the page to the page as it is marked for selection
documentViewModel.addSelectedPageText(page);
Point modEvent = SwingUtilities.convertPoint(parentComponent,
e.getPoint(), page);
// set the selected region.
page.setSelectionRectangle(modEvent, tmp);
// pass the selection movement on to the page.
boolean isMovingDown = lastMousePressedLocation.y <= e.getPoint().y;
boolean isMovingRight = lastMousePressedLocation.x <= e.getPoint().x;
((PageViewComponentImpl)page).getTextSelectionPageHandler().selection(modEvent, page, isMovingDown, isMovingRight);
} else {
documentViewModel.removeSelectedPageText(page);
page.clearSelectedText();
page.repaint();
}
}
}
}
}
public void mouseMoved(MouseEvent e) {
PageViewComponentImpl pageComponent = isOverPageComponent(parentComponent, e);
if (pageComponent != null) {
// assign the correct icon state for the cursor.
MouseEvent modeEvent = SwingUtilities.convertMouseEvent(parentComponent, e, pageComponent);
pageComponent.getTextSelectionPageHandler().selectionIcon(modeEvent.getPoint(), pageComponent);
}
}
public void paintTool(Graphics g) {
// paintSelectionBox(g, rectToDraw);
}
@Override
public void setSelectionRectangle(Point cursorLocation, Rectangle selection) {
}
public void installTool() {
}
public void uninstallTool() {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}