/* * Copyright 2014 Tomi Virtanen * * 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.tltv.gantt.client; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.tltv.gantt.client.ArrowElement.ArrowChangeHandler; import org.tltv.gantt.client.shared.GanttUtil; import org.tltv.gantt.client.shared.Step; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; /** * Widget representing a one Step in the Gantt chart. * * @author Tltv * */ public class StepWidget extends AbstractStepWidget { public static final String STYLE_HAS_SUB_STEPS = "has-sub-steps"; private StepWidget predecessorStepWidget; private ArrowElement predecessorArrow; private ArrowChangeHandler arrowChangeHandler = new ArrowChangeHandler() { @Override public boolean onArrowChanged(boolean startingPointChanged, NativeEvent event) { Element target = GanttUtil.getElementFromPoint(GanttUtil.getTouchOrMouseClientX(event), GanttUtil.getTouchOrMouseClientY(event)); if (target != null) { return gantt.getRpc().onStepRelationSelected(StepWidget.this, startingPointChanged, target); } return false; } }; @Override protected void onDetach() { if (gantt != null && predecessorArrow != null) { gantt.unregisterContentElement((Widget) predecessorArrow); } super.onDetach(); } public StepWidget() { super(); } @Override public Step getStep() { return (Step) super.getStep(); } public StepWidget getPredecessorStepWidget() { return predecessorStepWidget; } public void setPredecessorStepWidget(StepWidget predecessorStepWidget) { this.predecessorStepWidget = predecessorStepWidget; } public void updatePredecessor() { createPredecessorElements(); if (predecessorStepWidget == null) { return; } ArrowPositionData data = new ArrowPositionData(getPredecessorStepWidget().getElement(), getElement()); predecessorArrow.setWidth(data.getWidth()); predecessorArrow.setHeight(data.getHeight()); predecessorArrow.setTop((int) data.getTop()); predecessorArrow.setLeft((int) data.getLeft()); predecessorArrow.draw(data); } public ArrowElement createArrowWidget() { SvgArrowWidget a = new SvgArrowWidget(); a.setReadOnly(isReadOnly()); return a; } protected void createPredecessorElements() { if (predecessorStepWidget == null) { if (predecessorArrow != null) { gantt.unregisterContentElement((Widget) predecessorArrow); } } else { if (predecessorArrow == null) { predecessorArrow = createArrowWidget(); predecessorArrow.setUpEventHandlers(gantt.isTouchSupported(), gantt.isMsTouchSupported()); predecessorArrow.setArrowChangeHandler(arrowChangeHandler); } gantt.registerContentElement((Widget) predecessorArrow); } } public Widget getPredecessorArrowWidget() { return (Widget) predecessorArrow; } @Override public void setReadOnly(boolean readOnly) { this.readOnly = readOnly; if (predecessorArrow != null) { predecessorArrow.setReadOnly(readOnly); } } public GanttWidget getGanttWidget() { return gantt; } public List<SubStepWidget> getSubSteps() { List<SubStepWidget> list = new ArrayList<SubStepWidget>(); Widget widget; Iterator<Widget> iterator = iterator(); while (iterator.hasNext()) { widget = iterator.next(); if (widget instanceof SubStepWidget) { list.add((SubStepWidget) widget); } } return list; } public String getStepUidBySubStepElement(Element element) { SubStepWidget w = getSubStepWidgetByElement(element); if (w != null) { return w.getStep().getUid(); } return null; } public SubStepWidget getSubStepWidgetByElement(Element element) { Widget w = getWidget(DOM.getChildIndex(getElement(), element) - countNonSubStepChilds()); if (w instanceof SubStepWidget) { return (SubStepWidget) w; } return null; } @Override public void updateWidth() { super.updateWidth(); List<SubStepWidget> subSteps = getSubSteps(); updateStylesForSubSteps(!subSteps.isEmpty()); for (SubStepWidget subStep : subSteps) { subStep.updateWidth(); } } private void updateStylesForSubSteps(boolean hasSubSteps) { if (!hasSubSteps) { getElement().removeClassName(STYLE_HAS_SUB_STEPS); } else { getElement().addClassName(STYLE_HAS_SUB_STEPS); } } public void updateStylesForSubSteps() { List<SubStepWidget> subSteps = getSubSteps(); updateStylesForSubSteps(!subSteps.isEmpty()); } }