// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2009-2011 Google, All Rights reserved
// Copyright 2011-2012 MIT, All rights reserved
// Released under the Apache License, Version 2.0
// http://www.apache.org/licenses/LICENSE-2.0
package com.google.appinventor.client.editor.simple;
import static com.google.appinventor.client.Ode.MESSAGES;
import com.google.appinventor.client.editor.simple.components.MockComponent;
import com.google.appinventor.client.editor.simple.components.MockForm;
import com.google.appinventor.client.editor.simple.palette.SimplePaletteItem;
import com.google.appinventor.client.explorer.project.ComponentDatabaseChangeListener;
import com.google.appinventor.client.widgets.dnd.DragSource;
import com.google.appinventor.client.widgets.dnd.DropTarget;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import java.util.List;
import java.util.Map;
/**
* Panel in the Simple design editor holding non-visible Simple components.
*
*/
public final class SimpleNonVisibleComponentsPanel extends Composite implements DropTarget, ComponentDatabaseChangeListener {
// UI elements
private final Label heading;
private final FlowPanel componentsPanel;
// Backing mocked Simple form component
private MockForm form;
/**
* Creates new component design panel for non-visible components.
*/
public SimpleNonVisibleComponentsPanel() {
// Initialize UI
VerticalPanel panel = new VerticalPanel();
panel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
heading = new Label("");
heading.setStyleName("ya-NonVisibleComponentsHeader");
panel.add(heading);
componentsPanel = new FlowPanel();
componentsPanel.setStyleName("ode-SimpleUiDesignerNonVisibleComponents");
panel.add(componentsPanel);
initWidget(panel);
}
/**
* Associates a Simple form component with this panel.
*
* @param form backing mocked form component
*/
public void setForm(MockForm form) {
this.form = form;
}
/**
* Adds a new non-visible component to this panel. Note that this method
* will not add the component to the form component! This needs to be done
* separately.
*
* @param component Simple mock component to be added
*/
public void addComponent(MockComponent component) {
componentsPanel.add(component);
if (componentsPanel.getWidgetCount() > 0) {
heading.setText(MESSAGES.nonVisibleComponentsHeader());
}
}
/**
* Removes a new non-visible component from this panel. Note that this method
* will not remove the component from the form component! This needs to be
* done separately.
*
* @param component Simple mock component to be removed
*/
public void removeComponent(MockComponent component) {
componentsPanel.remove(component);
if (componentsPanel.getWidgetCount() == 0) {
heading.setText("");
}
}
// DropTarget implementation
@Override
public Widget getDropTargetWidget() {
return this;
}
// TODO(user): Draw a colored border around the edges of the non-visible component
// area while an eligible component is hovering over it.
@Override
public boolean onDragEnter(DragSource source, int x, int y) {
// Accept palette items corresponding to non-visible components only
return (source instanceof SimplePaletteItem) &&
!((SimplePaletteItem) source).isVisibleComponent();
}
@Override
public void onDragContinue(DragSource source, int x, int y) {
// no action
}
@Override
public void onDragLeave(DragSource source) {
// no action
}
@Override
public void onDrop(DragSource source, int x, int y, int offsetX, int offsetY) {
MockComponent sourceComponent = ((SimplePaletteItem) source).createMockComponent();
// Add component to the form
form.addComponent(sourceComponent);
// Add component to this panel
addComponent(sourceComponent);
sourceComponent.select();
}
@Override
public void onComponentTypeAdded(List<String> componentTypes) {
}
@Override
public boolean beforeComponentTypeRemoved(List<String> componentTypes) {
return true;
}
@Override
public void onComponentTypeRemoved(Map<String, String> componentTypes) {
}
@Override
public void onResetDatabase() {
}
}