/**
 * Copyright (c) 2011 Forschungszentrum Juelich GmbH
 * 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:
 * 		Carsten Karbach, FZ Juelich
 */

package org.eclipse.ptp.rm.lml.ui.providers;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;

/**
 * This is a composite with a border. The border's width can be altered at runtime.
 * The same for background-color. This composite uses a FillLayout as layout. 
 *
 */
public class BorderComposite extends Composite{
	
	/**
	 * The used layout for this composite
	 */
	private FillLayout filllayout;
	
	/**
	 * Create a composite with black border. The border has width 1 px in every direction.
	 * @param parent parent composite
	 * @param style SWT-style
	 */
	public BorderComposite(Composite parent, int style){
		super(parent, style);
		
		filllayout=new FillLayout();
		filllayout.marginWidth=1;
		filllayout.marginHeight=1;
		
		setLayout(filllayout);
		
		setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
	}
	
	/**
	 * Set the border's color
	 * @param c SWT-color for the border
	 */
	public void setBorderColor(Color c){
		setBackground(c);
	}
	
	/**
	 * Alter width of border
	 * @param width border-width
	 */
	public void setBorderWidth(int width){
		filllayout.marginHeight=width;
		filllayout.marginWidth=width;
		
		this.layout(true);
	}
	

}

