/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.apache.openaz.xacml.admin;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;

public class XacmlErrorHandler extends CustomComponent implements View {
	
	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private Button buttonGo;

	@AutoGenerated
	private Label labelError;

	public static String VIEWNAME="ErrorHandler.View";

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	private static final long serialVersionUID = 1L;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public XacmlErrorHandler(String message, String button) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		this.labelError.setValue(message);
		if (button != null) {
			this.buttonGo.setCaption(button);
		} else {
			this.buttonGo.setVisible(false);
		}
	}

	@Override
	public void enter(ViewChangeEvent event) {
		// TODO Auto-generated method stub
		
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// labelError
		labelError = new Label();
		labelError.setImmediate(false);
		labelError.setWidth("100.0%");
		labelError.setHeight("80px");
		labelError.setValue("This holds error messages.");
		mainLayout.addComponent(labelError);
		
		// buttonGo
		buttonGo = new Button();
		buttonGo.setCaption("Ok");
		buttonGo.setImmediate(true);
		buttonGo.setWidth("-1px");
		buttonGo.setHeight("-1px");
		mainLayout.addComponent(buttonGo);
		mainLayout.setComponentAlignment(buttonGo, new Alignment(48));
		
		return mainLayout;
	}

}
