/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* 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.uberfire.ext.wires.core.grids.client.widget.dnd;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gwt.dom.client.Style;
import org.uberfire.ext.wires.core.grids.client.model.GridColumn;
import org.uberfire.ext.wires.core.grids.client.model.GridRow;
import org.uberfire.ext.wires.core.grids.client.widget.grid.GridWidget;
/**
* A container for the state of the MouseDown, MouseMove and MouseUp handlers during a drag operation.
*/
public class GridWidgetDnDHandlersState {
private GridWidget activeGridWidget = null;
private GridColumn.HeaderMetaData activeHeaderMetaData = null;
private List<GridColumn<?>> activeGridColumns = new ArrayList<GridColumn<?>>();
private List<GridRow> activeGridRows = new ArrayList<GridRow>();
private GridWidgetHandlersOperation operation = GridWidgetHandlersOperation.NONE;
private Style.Cursor cursor = Style.Cursor.DEFAULT;
private double eventInitialX = 0;
private double eventInitialColumnWidth = 0;
private GridWidgetDnDProxy eventColumnHighlight = new GridWidgetDnDProxy();
/**
* Resets the state to no operation with no active columns or rows.
*/
public void reset() {
if (activeGridWidget != null) {
activeGridWidget.setDraggable(false);
}
this.activeGridWidget = null;
this.activeHeaderMetaData = null;
this.activeGridRows.clear();
setOperation(GridWidgetDnDHandlersState.GridWidgetHandlersOperation.NONE);
setCursor(Style.Cursor.DEFAULT);
}
/**
* Returns the active GridWidget. Can be null if no DnD operation has been registered over a GridWidget.
* @return The active GridWidget or null.
*/
public GridWidget getActiveGridWidget() {
return activeGridWidget;
}
/**
* Sets the active GridWidget. Can be null.
* @param activeGridWidget
*/
public void setActiveGridWidget(final GridWidget activeGridWidget) {
this.activeGridWidget = activeGridWidget;
}
/**
* Returns the active HeaderMetaData.
* @return
*/
public GridColumn.HeaderMetaData getActiveHeaderMetaData() {
return activeHeaderMetaData;
}
/**
* Sets the active HeaderMetaData.
* @param activeHeaderMetaData
*/
public void setActiveHeaderMetaData(final GridColumn.HeaderMetaData activeHeaderMetaData) {
this.activeHeaderMetaData = activeHeaderMetaData;
}
/**
* Returns the active columns being affected by the current the operation.
* @return
*/
public List<GridColumn<?>> getActiveGridColumns() {
return Collections.unmodifiableList(activeGridColumns);
}
/**
* Sets the active columns to be affected by the current the operation.
*/
public void setActiveGridColumns(final List<GridColumn<?>> activeGridColumns) {
this.activeGridColumns.clear();
this.activeGridColumns.addAll(activeGridColumns);
}
/**
* Returns the active rows being affected by the current the operation.
* @return
*/
public List<GridRow> getActiveGridRows() {
return Collections.unmodifiableList(activeGridRows);
}
/**
* Sets the active rows to be affected by the current the operation.
*/
public void setActiveGridRows(final List<GridRow> activeGridRows) {
this.activeGridRows.clear();
this.activeGridRows.addAll(activeGridRows);
}
/**
* The current drag operation in progress.
* @return
*/
public GridWidgetHandlersOperation getOperation() {
return operation;
}
/**
* Sets the current drag operation in progress.
* @param operation
*/
public void setOperation(final GridWidgetHandlersOperation operation) {
this.operation = operation;
}
/**
* Returns the Cursor type to be shown for the current operation. This primarily used in conjunction with DOMElement based cells.
* When the pointer moves over a DOM element the browser determines the Cursor to show based on the DOM element's CSS. This
* however can be different to the pointer required during, for example, a column resize operation. In such cases the
* browser changes the pointer to that defined by CSS replacing that set by the MouseMove handler.
* @return
*/
public Style.Cursor getCursor() {
return cursor;
}
/**
* Sets the Cursor type to be shown for the current operation.
* @param cursor
*/
public void setCursor(Style.Cursor cursor) {
this.cursor = cursor;
}
/**
* Returns the grid-relative x-coordinate of the Mouse Event.
* @return
*/
public double getEventInitialX() {
return eventInitialX;
}
/**
* Sets the grid-relative x-coordinate of the Mouse Event.
* @param eventInitialX
*/
public void setEventInitialX(final double eventInitialX) {
this.eventInitialX = eventInitialX;
}
/**
* Returns the width of a column being re-sized at the commencement of the resize operation.
* During a re-size operation the new width is determined by calculating the delta of
* the MouseMoveEvent coordinates. The initial width is therefore required to apply
* the same delta.
* @return
*/
public double getEventInitialColumnWidth() {
return eventInitialColumnWidth;
}
/**
* Sets the initial width of a column to be resized.
* @param eventInitialColumnWidth
*/
public void setEventInitialColumnWidth(final double eventInitialColumnWidth) {
this.eventInitialColumnWidth = eventInitialColumnWidth;
}
/**
* Returns the Group representing the column during a drag operation of the column being moved
* @return
*/
public GridWidgetDnDProxy getEventColumnHighlight() {
return eventColumnHighlight;
}
/**
* The different states of the drag operation.
*/
public enum GridWidgetHandlersOperation {
NONE,
COLUMN_RESIZE_PENDING,
COLUMN_RESIZE,
COLUMN_MOVE_PENDING,
COLUMN_MOVE,
ROW_MOVE_PENDING,
ROW_MOVE,
GRID_MOVE_PENDING,
GRID_MOVE
}
}