content: /*
   * Copyright (c) 2016, Alex Blewitt, Bandlem Ltd
   * Copyright (c) 2016, Packt Publishing Ltd
   *
   * 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
   */
  package com.packtpub.e4.clock.ui.views;
  
  import java.net.URL;
  import java.time.ZoneId;
  
  import javax.annotation.PostConstruct;
  import javax.inject.Inject;
  
  import org.eclipse.e4.core.di.annotations.Optional;
  import org.eclipse.e4.core.di.extensions.Preference;
  import org.eclipse.e4.ui.di.Focus;
  import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
  import org.eclipse.jface.resource.FontRegistry;
  import org.eclipse.jface.resource.ImageDescriptor;
  import org.eclipse.jface.resource.ImageRegistry;
  import org.eclipse.jface.resource.JFaceResources;
  import org.eclipse.jface.resource.LocalResourceManager;
  import org.eclipse.jface.resource.ResourceManager;
  import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
  import org.eclipse.jface.viewers.ISelection;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.jface.viewers.TreeViewer;
  import org.eclipse.jface.viewers.Viewer;
  import org.eclipse.jface.viewers.ViewerFilter;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.ui.ISharedImages;
  
  import com.packtpub.e4.clock.ui.internal.TimeZoneComparator;
  import com.packtpub.e4.clock.ui.internal.TimeZoneDialog;
  import com.packtpub.e4.clock.ui.internal.TimeZoneViewerComparator;
  import com.packtpub.e4.clock.ui.internal.TimeZoneViewerFilter;
  
  @SuppressWarnings("restriction")
  public class TimeZoneTreeView {
  	private TreeViewer treeViewer;
  	@Inject
  	private ISharedImages images;
  	@Inject
  	@Optional
  	private ESelectionService selectionService;
  	int launchCount;
  
  	@Inject
  	public void setLaunchCount(
  			@Preference(nodePath = "com.packtpub.e4.clock.ui", value = "launchCount") int launchCount) {
  		this.launchCount = launchCount;
  	}
  
  	@PostConstruct
  	public void create(Composite parent) {
  		ResourceManager rm = JFaceResources.getResources();
  		LocalResourceManager lrm = new LocalResourceManager(rm, parent);
  		ImageRegistry ir = new ImageRegistry(lrm);
  		FontRegistry fr = new FontRegistry();
  		URL sample = getClass().getResource("/icons/sample.gif");
  		ir.put("sample", ImageDescriptor.createFromURL(sample));
  		treeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
  		treeViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new TimeZoneLabelProvider(images, ir, fr)));
  		treeViewer.setContentProvider(new TimeZoneContentProvider());
  		treeViewer.setInput(new Object[] { TimeZoneComparator.getTimeZones() });
  		treeViewer.setData("REVERSE", Boolean.TRUE);
  		treeViewer.setComparator(new TimeZoneViewerComparator());
  		treeViewer.setFilters(new ViewerFilter[] { new TimeZoneViewerFilter("GMT") });
  		treeViewer.setExpandPreCheckFilters(true);
  		treeViewer.addDoubleClickListener(event -> {
  			Viewer viewer = event.getViewer();
  			Shell shell = viewer.getControl().getShell();
  			ISelection sel = viewer.getSelection();
  			Object selectedValue;
  			if (!(sel instanceof IStructuredSelection) || sel.isEmpty()) {
  				selectedValue = null;
  			} else {
  				selectedValue = ((IStructuredSelection) sel).getFirstElement();
  			}
  			if (selectedValue instanceof ZoneId) {
  				ZoneId timeZone = (ZoneId) selectedValue;
  				// MessageDialog.openInformation(shell, timeZone.getId(), timeZone.toString());
  				new TimeZoneDialog(shell, timeZone).open();
  			}
  		});
  		treeViewer.addSelectionChangedListener(event -> {
  			// forward selection
  			Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
  			if (selection != null && selectionService != null) {
  				selectionService.setSelection(selection);
  			}
  		});
  		System.out.println("Launch count is: " + launchCount);
  	}
  
  	@Focus
  	public void focus() {
  		treeViewer.getControl().setFocus();
  	}
  }
  