/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Florian Pirchner <florian.pirchner@gmail.com> - Initial implementation
 */
package org.eclipse.osbp.vaadin.addons.designer.overlay.client;

import org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.AlignmentInfo;

import com.vaadin.shared.communication.ServerRpc;

// TODO: Auto-generated Javadoc
/**
 * The Interface DesignerExtensionServerRpc.
 */
public interface DesignerExtensionServerRpc extends ServerRpc {

	/**
	 * Is called to change the alignment of the child.
	 *
	 * @param alignment the alignment
	 */
	void alignmentChanged(AlignmentInfo alignment);

	/**
	 * Is called to remove the child from its layout.
	 */
	void removeChild();

	/**
	 * Is called to add a child to its layout.
	 */
	void addChild();

	/**
	 * Is called to open the properties dialog.
	 */
	void openProperties();

	/**
	 * Switches the editable state.
	 */
	void switchEditable();

	/**
	 * Switches the margin state.
	 */
	void switchMargin();

	/**
	 * Switchs the spacing state.
	 */
	void switchSpacing();

}
