package org.eclipse.update.internal.ui;

import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.update.internal.ui.model.*;
import org.eclipse.update.internal.ui.wizards.*;
import org.eclipse.update.internal.ui.UpdateUI;
import org.eclipse.update.operations.*;

/**
 * @author Wassim Melhem
 */
public class WebBookmarksDialog extends Dialog {
	
	class ModelListener implements IUpdateModelChangedListener {
		public void objectChanged(Object object, String property) {
			viewer.refresh();
		}

		public void objectsAdded(Object parent, Object[] children) {
			viewer.refresh();
		}

		public void objectsRemoved(Object parent, Object[] children) {
			viewer.refresh();
		}
	}
	
	class ContentProvider implements IStructuredContentProvider {
		public Object[] getElements(Object inputElement) {
			UpdateModel model = UpdateUI.getDefault().getUpdateModel();
			Object[] bookmarks = model.getBookmarkLeafs();
			Object[] sitesToVisit = discoveryFolder.getChildren(discoveryFolder);
			Object[] all = new Object[bookmarks.length + sitesToVisit.length];
			System.arraycopy(bookmarks, 0, all, 0, bookmarks.length);
			System.arraycopy(sitesToVisit, 0, all, bookmarks.length, sitesToVisit.length);
			return all;
		}
		
		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		}

		public void dispose() {
		}
	}
	
	class WebSiteLabelProvider extends LabelProvider {
		public Image getImage(Object element) {
			UpdateLabelProvider provider = UpdateUI.getDefault().getLabelProvider();
			if (element instanceof BookmarkFolder) 
				return provider.get(UpdateUIImages.DESC_BFOLDER_OBJ,0);
			if (element instanceof SiteBookmark)
				return provider.get(UpdateUIImages.DESC_WEB_SITE_OBJ,0);
			return null;
		}
		public String getText(Object element) {
			return super.getText(element);
		}
		
	}
	
	private Button addButton;
	private Button editButton;
	private Button removeButton;
	private ModelListener modelListener;
	private TableViewer viewer;
	private DiscoveryFolder discoveryFolder = new DiscoveryFolder();

	public WebBookmarksDialog(Shell parentShell) {
		super(parentShell);
		UpdateUI.getDefault().getLabelProvider().connect(this);
		modelListener = new ModelListener();
		UpdateUI.getDefault().getUpdateModel().addUpdateModelChangedListener(
			modelListener);
	}

	protected Control createDialogArea(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		layout.marginWidth = 10;
		container.setLayout(layout);
		container.setLayoutData(new GridData(GridData.FILL_BOTH));
		
		Label label = new Label(container, SWT.NONE);
		label.setText(UpdateUI.getString("WebBookmarksDialog.label")); //$NON-NLS-1$
		GridData gd = new GridData();
		gd.horizontalSpan = 2;
		label.setLayoutData(gd);
		
		Table table = new Table(container, SWT.BORDER | SWT.V_SCROLL);
		table.setLayoutData(new GridData(GridData.FILL_BOTH));

		viewer = new TableViewer(table);		
		viewer.setContentProvider(new ContentProvider());
		viewer.setLabelProvider(new WebSiteLabelProvider());
		viewer.setInput(UpdateUI.getDefault().getUpdateModel());
		
		viewer.addFilter(new ViewerFilter() {
			public boolean select(Viewer viewer, Object parentElement, Object element) {
				if (element instanceof SiteBookmark)
					return ((SiteBookmark)element).isWebBookmark();
				return true;
			}
		});
		
		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent e) {
				IStructuredSelection ssel =
					(IStructuredSelection) e.getSelection();
				if (ssel.size() == 0) 
					return;				
				SiteBookmark bookmark = (SiteBookmark)ssel.getFirstElement();
				Object parent = bookmark.getParent(bookmark);
				editButton.setEnabled(parent == null || !parent.equals(discoveryFolder));
				removeButton.setEnabled(parent == null || !parent.equals(discoveryFolder));
			}
		});

		createButtons(container);
		Dialog.applyDialogFont(container);
		return container;
	}
	
	private void createButtons(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(new GridLayout());
		container.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
		

		addButton = new Button(container, SWT.PUSH);
		addButton.setText(UpdateUI.getString("WebBookmarksDialog.add")); //$NON-NLS-1$
		addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		addButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				NewWebSiteDialog dialog = new NewWebSiteDialog(getShell());
				dialog.create();
				dialog.getShell().setText(UpdateUI.getString("WebBookmarksDialog.new")); //$NON-NLS-1$
				dialog.open();
			}
		});
				
		editButton = new Button(container, SWT.PUSH);
		editButton.setText(UpdateUI.getString("WebBookmarksDialog.edit")); //$NON-NLS-1$
		editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		editButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				IStructuredSelection ssel =
					(IStructuredSelection) viewer.getSelection();
				SiteBookmark bookmark = (SiteBookmark) ssel.getFirstElement();		
				EditSiteDialog dialog = new EditSiteDialog(getShell(), bookmark);
				dialog.create();
				dialog.getShell().setText(UpdateUI.getString("WebBookmarksDialog.editTitle")); //$NON-NLS-1$
				dialog.open();
			}
		});
		editButton.setEnabled(false);
		
		removeButton = new Button(container, SWT.PUSH);
		removeButton.setText(UpdateUI.getString("WebBookmarksDialog.remove")); //$NON-NLS-1$
		removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		removeButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				IStructuredSelection ssel =
					(IStructuredSelection) viewer.getSelection();
				SiteBookmark bookmark = (SiteBookmark) ssel.getFirstElement();
				UpdateUI.getDefault().getUpdateModel().removeBookmark(bookmark);
			}
		});
		removeButton.setEnabled(false);
		
		
	}

	protected void createButtonsForButtonBar(Composite parent) {
		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
		createButton(
			parent,
			IDialogConstants.CANCEL_ID,
			IDialogConstants.CANCEL_LABEL,
			false);
	}
	
	protected void okPressed() {
		super.okPressed();
		UpdateUI.getDefault().getLabelProvider().disconnect(this);
		UpdateUI.getDefault().getUpdateModel().removeUpdateModelChangedListener(
			modelListener);
	}

	protected void cancelPressed() {
		UpdateUI.getDefault().getUpdateModel().reset();
		UpdateUI.getDefault().getLabelProvider().disconnect(this);
		UpdateUI.getDefault().getUpdateModel().removeUpdateModelChangedListener(
			modelListener);
		super.cancelPressed();
	}
	
	

}
