/*******************************************************************************
 * Copyright (c) 2011 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.help.ui.internal.preferences;


import java.util.List;

import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;

public class ICButtons implements SelectionListener{

	private HelpContentPreferencePage page;
	
	private Button addIC;
	private Button editIC;
	private Button removeIC;
	private Button moveUp;
	private Button moveDown;
	private Button testIC;
	private Button enableIC;

	private boolean enabled = true;

	public ICButtons(Composite parent,HelpContentPreferencePage page)
	{
		this.page = page;
		
		Composite container = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		container.setLayout(layout);
		container.setLayoutData(new GridData(GridData.FILL_VERTICAL));
		container.setFont(parent.getFont());

		addIC = createPushButton(container, Messages.HelpContentBlock_addICTitle);
		editIC = createPushButton(container, Messages.HelpContentBlock_editICTitle);
		removeIC = createPushButton(container, Messages.HelpContentBlock_removeICTitle);
		testIC = createPushButton(container, Messages.HelpContentBlock_testConnectionTitle);
		
		String enableTitle = Messages.HelpContentBlock_3.length() > Messages.HelpContentBlock_4.length() ?
				Messages.HelpContentBlock_3 : Messages.HelpContentBlock_4;
		enableIC = createPushButton(container, enableTitle);
		moveUp = createPushButton(container, Messages.HelpContentBlock_upTitle);
		moveDown = createPushButton(container, Messages.HelpContentBlock_downTitle);

		page.getTable().getTable().addSelectionListener(this);
		
		
		updateButtonStates();
	}
	
	public void setEnabled(boolean enabled)
	{
		this.enabled  = enabled;
		updateButtonStates();
	}
	
	public Button createPushButton(Composite parent, String buttonText) {
		Button button = new Button(parent, SWT.PUSH);
		button.setFont(parent.getFont());
		button.setText(buttonText);
		button.addSelectionListener(this);
		page.setButtonLayoutData(button);
		return button;
	}

	public void widgetSelected(SelectionEvent e) {
		if (e.getSource() instanceof Button)
		{
			if (e.getSource()==addIC)
				addIC();
			else if (e.getSource()==editIC)
				editIC();
			else if (e.getSource()==removeIC)
				removeIC();
			else if (e.getSource()==testIC)
				testIC();
			else if (e.getSource()==enableIC)
				enableIC();
			else if (e.getSource()==moveUp)
				move(-1);
			else if (e.getSource()==moveDown)
				move(1);
		}
		else if (e.getSource() instanceof Table)
			updateButtonStates();
	}
	public void widgetDefaultSelected(SelectionEvent e) {
		if (e.getSource() instanceof Table)
			editIC();
	}

	public void addIC()
	{
		ICDialog dialog = new ICDialog(page.getShell());
		if (dialog.open() == Window.OK) {
			page.getTable().addIC(dialog.getIC());
			updateButtonStates();
		}
	}
	
	public void editIC()
	{
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		IC ic = (IC)selection.getFirstElement();
		if (ic==null)
			return;
		
		ICDialog dialog = new ICDialog(page.getShell(),ic);
		
		if (dialog.open() == Window.OK) {
			page.getTable().editIC(dialog.getIC());
			updateButtonStates();
		}
	}
	
	public void removeIC()
	{
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		List ics = selection.toList();
		String remove = ""; //$NON-NLS-1$
		
		for (int i=0;i<ics.size();i++)
		{			
			remove+="\n"+ics.get(i); //$NON-NLS-1$
		}

		boolean shouldRemove =
	          MessageDialog.openQuestion(
	        	page.getShell(),
	            NLS.bind(Messages.HelpContentBlock_rmvTitle ,""), //$NON-NLS-1$
	            NLS.bind(Messages.HelpContentBlock_rmvLabel ,remove));	

		if (shouldRemove)
		{
			for (int i=0;i<ics.size();i++)
				page.getTable().removeIC((IC)ics.get(i));
			updateButtonStates();
		}
	}
	
	public void testIC()
	{		
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		IC ic = (IC)selection.getFirstElement();
		if (ic==null)
			return;
	
		ICDialog dialog = new ICDialog(page.getShell(),ic,true);
		
		if (dialog.open() == Window.OK) {
			page.getTable().editIC(dialog.getIC());
			updateButtonStates();
		}		
		
		
/*		boolean connected = TestConnectionUtility.testConnection(ic.getHost(),
					ic.getPort()+"", ic.getPath(),ic.getProtocol());
		TestICDialog dialog = new TestICDialog(page.getShell(),ic);
		dialog.setConnectionStatus(connected);
		dialog.open();
*/
	}
	
	public void enableIC()
	{
		int indexes[] = page.getTable().getTable().getSelectionIndices();
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		List ics = selection.toList();
		
		boolean enable = enableIC.getText().equals(Messages.HelpContentBlock_4);
		
		for (int i=0;i<ics.size();i++)
		{
			((IC)ics.get(i)).setEnabled(enable);
			page.getTable().getTableViewer().replace((IC)ics.get(i),indexes[i]);
		}
		page.getTable().refresh();
		
		updateButtonStates();
	}
	
	public void move(int offset)
	{
		int index = page.getTable().getTable().getSelectionIndices()[0];
		
		List ics = page.getTable().getICs();
		IC x = (IC) ics.get(index);
		IC y = (IC) ics.get(index+offset);

		ics.set(index+offset,x);
		ics.set(index,y);
		

		page.getTable().getTableViewer().getContentProvider().inputChanged(
				page.getTable().getTableViewer(), null, ics);
		
		page.getTable().getTableViewer().replace(x,index+offset);
		page.getTable().getTableViewer().replace(y,index);
		page.getTable().refresh();
		
		page.getTable().getTable().deselectAll();
		page.getTable().getTable().select(index+offset);
		updateButtonStates();
		
	}
	
	public void updateButtonStates()
	{
		if (!enabled)
		{
			editIC.setEnabled(false);
			testIC.setEnabled(false);
			moveUp.setEnabled(false);
			moveDown.setEnabled(false);
			enableIC.setEnabled(false);
			addIC.setEnabled(false);
			removeIC.setEnabled(false);
			return;
		}
		
		addIC.setEnabled(true);
		
		IC firstIC = (IC)(((IStructuredSelection)page.getTable().getSelection()).getFirstElement());
		if (firstIC!=null)
		{
			int index = page.getTable().getTable().getSelectionIndices()[0];
			enableIC.setText(firstIC.isEnabled() ? Messages.HelpContentBlock_3 : Messages.HelpContentBlock_4);

			if (page.getTable().getTable().getSelectionIndices().length==1)
			{
				editIC.setEnabled(true);
				testIC.setEnabled(true);
				moveUp.setEnabled(index!=0);
				moveDown.setEnabled(index!=page.getTable().getICs().size()-1);
			}
			else
			{	
				editIC.setEnabled(false);
				testIC.setEnabled(false);
				moveUp.setEnabled(false);
				moveDown.setEnabled(false);
			}
			removeIC.setEnabled(true);
			enableIC.setEnabled(true);
		}
		else
		{
			editIC.setEnabled(false);
			testIC.setEnabled(false);
			moveUp.setEnabled(false);
			moveDown.setEnabled(false);
			removeIC.setEnabled(false);
			enableIC.setEnabled(false);
		}
	}
}
