/*
* Copyright 2011 JBoss Inc
*
* 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.jbpm.formbuilder.client.menu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gwt.mosaic.ui.client.layout.BoxLayout;
import org.gwt.mosaic.ui.client.layout.BoxLayoutData;
import org.gwt.mosaic.ui.client.layout.LayoutPanel;
import org.jbpm.formapi.client.menu.FBMenuItem;
import org.jbpm.formbuilder.client.command.DisposeDropController;
import com.allen_sauer.gwt.dnd.client.DragHandlerAdapter;
import com.allen_sauer.gwt.dnd.client.PickupDragController;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.StackPanel;
import com.google.gwt.user.client.ui.Widget;
public class AnimatedMenuViewImpl extends ScrollPanel implements MenuView {
private PickupDragController dragController;
private Map<String, List<FBMenuItem>> items = new HashMap<String, List<FBMenuItem>>();
private Map<String, FBMenuPanel> displays = new HashMap<String, FBMenuPanel>();
private StackPanel panel = new StackPanel() {
@Override
public void showStack(int index) {
super.showStack(index);
FBMenuPanel panel = (FBMenuPanel) getWidget(index);
for (Widget widget : panel) {
dragController.makeDraggable(widget);
}
};
};
public AnimatedMenuViewImpl() {
LayoutPanel layoutPanel = new LayoutPanel(new BoxLayout(BoxLayout.Orientation.VERTICAL));
layoutPanel.setLayoutData(new BoxLayoutData(BoxLayoutData.FillStyle.BOTH));
layoutPanel.setAnimationEnabled(true);
panel.setStylePrimaryName("fbStackPanel");
layoutPanel.add(panel);
add(layoutPanel);
new MenuPresenter(this);
}
@Override
public void startDropController(PickupDragController dragController) {
this.dragController = dragController;
this.dragController.registerDropController(new DisposeDropController(this));
this.dragController.setBehaviorMultipleSelection(false);
this.dragController.setConstrainWidgetToBoundaryPanel(false);
this.dragController.addDragHandler(new DragHandlerAdapter());
}
@Override
public void addItem(String group, FBMenuItem item) {
if (items.get(group) == null) {
items.put(group, new ArrayList<FBMenuItem>());
FBMenuPanel listDisplay = new FBMenuPanel(dragController);
panel.add(listDisplay, group);
displays.put(group, listDisplay);
}
this.displays.get(group).add(item);
this.items.get(group).add(item);
}
@Override
public void removeItem(String group, FBMenuItem item) {
List<FBMenuItem> groupItems = items.get(group);
if (groupItems != null) {
groupItems.remove(item);
FBMenuPanel display = displays.get(group);
display.fullRemove(item);
if (groupItems.isEmpty()) {
panel.remove(display);
panel.showStack(0);
}
}
}
}