/* * Copyright 2014 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.dashbuilder.displayer.client.widgets.group; import java.util.Arrays; import java.util.List; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.dashbuilder.dataset.date.DayOfWeek; import org.dashbuilder.dataset.date.Month; import org.dashbuilder.dataset.group.ColumnGroup; import org.dashbuilder.dataset.group.DateIntervalType; import org.dashbuilder.dataset.group.GroupStrategy; import org.dashbuilder.displayer.client.events.DataSetGroupDateChanged; import org.uberfire.client.mvp.UberView; @Dependent public class DataSetGroupDateEditor implements IsWidget { public interface View extends UberView<DataSetGroupDateEditor> { void setFixedModeValue(boolean enabled); boolean getFixedModeValue(); void clearIntervalTypeSelector(); void addIntervalTypeItem(DateIntervalType entry); void setSelectedIntervalTypeIndex(int index); int getSelectedIntervalTypeIndex(); void setFirstDayVisibility(boolean visible); void clearFirstDaySelector(); void addFirstDaySelectorItem(DayOfWeek entry); void setSelectedFirstDayIndex(int index); int getSelectedFirstDayIndex(); void setFirstMonthVisibility(boolean visible); void clearFirstMonthSelector(); void addFirstMonthSelectorItem(Month entry); void setSelectedFirstMonthIndex(int index); int getSelectedFirstMonthIndex(); void setEmptyIntervalsValue(boolean enabled); boolean getEmptyIntervalsValue(); void setMaxIntervalsVisibility(boolean visible); void setMaxIntervalsValue(String max); String getMaxIntervalsValue(); } View view = null; ColumnGroup columnGroup = null; Event<DataSetGroupDateChanged> changeEvent = null; @Inject public DataSetGroupDateEditor(View view, Event<DataSetGroupDateChanged> changeEvent) { this.view = view; this.changeEvent = changeEvent; view.init(this); } @Override public Widget asWidget() { return view.asWidget(); } public ColumnGroup getColumnGroup() { return columnGroup; } public void init(ColumnGroup columnGroup) { this.columnGroup = columnGroup; if (columnGroup != null) { if (isFixedStrategy()) { gotoFixedMode(); } else { gotoDynamicMode(); } } } public boolean isFixedStrategy() { return GroupStrategy.FIXED.equals(columnGroup.getStrategy()); } protected void initIntervalTypeSelector() { view.clearIntervalTypeSelector(); DateIntervalType current = DateIntervalType.getByName(columnGroup.getIntervalSize()); List<DateIntervalType> entries = getListOfIntervalTypes(); for (int i = 0; i < entries.size(); i++) { DateIntervalType entry = entries.get(i); view.addIntervalTypeItem(entry); if (current != null && current.equals(entry)) { view.setSelectedIntervalTypeIndex(i); } } } public List<DateIntervalType> getListOfIntervalTypes() { if (isFixedStrategy()) { return DateIntervalType.FIXED_INTERVALS_SUPPORTED; } return Arrays.asList(DateIntervalType.values()); } protected void initFirstDayListBox() { view.setFirstDayVisibility(true); view.clearFirstDaySelector(); DayOfWeek current = columnGroup.getFirstDayOfWeek(); DayOfWeek[] entries = DayOfWeek.values(); for (int i = 0; i < entries.length; i++) { DayOfWeek entry = entries[i]; view.addFirstDaySelectorItem(entry); if (current != null && current.equals(entry)) { view.setSelectedFirstDayIndex(i); } } } protected void initFirstMonthListBox() { view.setFirstMonthVisibility(true); view.clearFirstMonthSelector(); Month current = columnGroup.getFirstMonthOfYear(); Month[] entries = Month.values(); for (int i = 0; i < entries.length; i++) { Month entry = entries[i]; view.addFirstMonthSelectorItem(entry); if (current != null && current.equals(entry)) { view.setSelectedFirstMonthIndex(i); } } } protected void initMaxIntervalsTextBox() { view.setMaxIntervalsVisibility(true); view.setMaxIntervalsValue(Integer.toString(columnGroup.getMaxIntervals())); } protected void initEmptyIntervalsFlag() { view.setEmptyIntervalsValue(columnGroup.areEmptyIntervalsAllowed()); } protected void resetCommon() { view.setFixedModeValue(isFixedStrategy()); view.setMaxIntervalsVisibility(false); view.setFirstDayVisibility(false); view.setFirstMonthVisibility(false); initIntervalTypeSelector(); initEmptyIntervalsFlag(); } public void gotoDynamicMode() { resetCommon(); initMaxIntervalsTextBox(); } public void gotoFixedMode() { resetCommon(); DateIntervalType current = DateIntervalType.getByName(columnGroup.getIntervalSize()); if (DateIntervalType.DAY_OF_WEEK.equals(current)) { initFirstDayListBox(); } else if (DateIntervalType.MONTH.equals(current)) { initFirstMonthListBox(); } } public void onFixedStrategyChanged() { columnGroup.setFirstMonthOfYear(null); columnGroup.setFirstDayOfWeek(null); if (view.getFixedModeValue()) { // Reset current interval type selected if not allowed. DateIntervalType intervalType = DateIntervalType.getByIndex(view.getSelectedIntervalTypeIndex()); if (!DateIntervalType.FIXED_INTERVALS_SUPPORTED.contains(intervalType)) { view.setSelectedIntervalTypeIndex(DateIntervalType.MONTH.getIndex()); columnGroup.setIntervalSize(DateIntervalType.MONTH.name()); } columnGroup.setStrategy(GroupStrategy.FIXED); gotoFixedMode(); } else { columnGroup.setStrategy(GroupStrategy.DYNAMIC); gotoDynamicMode(); } changeEvent.fire(new DataSetGroupDateChanged(columnGroup)); } void onIntervalTypeSelected() { DateIntervalType intervalType = DateIntervalType.getByIndex(view.getSelectedIntervalTypeIndex()); if (isFixedStrategy()) { intervalType = DateIntervalType.FIXED_INTERVALS_SUPPORTED.get(view.getSelectedIntervalTypeIndex()); } columnGroup.setIntervalSize(intervalType.name()); columnGroup.setFirstMonthOfYear(null); columnGroup.setFirstDayOfWeek(null); view.setFirstMonthVisibility(false); view.setFirstDayVisibility(false); if (GroupStrategy.FIXED.equals(columnGroup.getStrategy())) { if (DateIntervalType.MONTH.equals(DateIntervalType.getByName(columnGroup.getIntervalSize()))) { view.setFirstMonthVisibility(true); initFirstMonthListBox(); } else if (DateIntervalType.DAY_OF_WEEK.equals(DateIntervalType.getByName(columnGroup.getIntervalSize()))) { view.setFirstDayVisibility(true); initFirstDayListBox(); } } changeEvent.fire(new DataSetGroupDateChanged(columnGroup)); } void onEmptyIntervalsChanged() { columnGroup.setEmptyIntervalsAllowed(view.getEmptyIntervalsValue()); changeEvent.fire(new DataSetGroupDateChanged(columnGroup)); } void onMaxIntervalsChanged() { try { columnGroup.setMaxIntervals(Integer.parseInt(view.getMaxIntervalsValue())); changeEvent.fire(new DataSetGroupDateChanged(columnGroup)); } catch (Exception e) { // Just ignore } } void onFirstDaySelected() { DayOfWeek dayOfWeek = DayOfWeek.getByIndex(view.getSelectedFirstDayIndex()+1); columnGroup.setFirstDayOfWeek(dayOfWeek); changeEvent.fire(new DataSetGroupDateChanged(columnGroup)); } void onFirstMonthSelected() { Month month = Month.getByIndex(view.getSelectedFirstMonthIndex()+1); columnGroup.setFirstMonthOfYear(month); changeEvent.fire(new DataSetGroupDateChanged(columnGroup)); } }