content: /*******************************************************************************
   * Copyright (c) 2000, 2007 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:
   *   Jesper Kamstrup Linnet (eclipse@kamstrup-linnet.dk) - initial API and implementation 
   *          (report 36180: Callers/Callees view)
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.ui.callhierarchy;
  
  import java.util.ArrayList;
  
  import org.eclipse.jface.action.IAction;
  import org.eclipse.jface.action.IMenuListener;
  import org.eclipse.jface.action.MenuManager;
  import org.eclipse.jface.viewers.ArrayContentProvider;
  import org.eclipse.jface.viewers.ColumnLayoutData;
  import org.eclipse.jface.viewers.ColumnPixelData;
  import org.eclipse.jface.viewers.ColumnWeightData;
  import org.eclipse.jface.viewers.TableLayout;
  import org.eclipse.jface.viewers.TableViewer;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.dnd.Clipboard;
  import org.eclipse.swt.events.FocusEvent;
  import org.eclipse.swt.events.FocusListener;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Menu;
  import org.eclipse.swt.widgets.Table;
  import org.eclipse.swt.widgets.TableColumn;
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.IViewSite;
  import org.eclipse.ui.IWorkbenchPartSite;
  import org.eclipse.ui.actions.ActionFactory;
  
  
  
  class LocationViewer extends TableViewer {
      private final String columnHeaders[] = {
          CallHierarchyMessages.LocationViewer_ColumnIcon_header,
          CallHierarchyMessages.LocationViewer_ColumnLine_header,
          CallHierarchyMessages.LocationViewer_ColumnInfo_header}; 
                                                  
      private ColumnLayoutData columnLayouts[] = {
          new ColumnPixelData(18, false, true),
          new ColumnWeightData(60),
          new ColumnWeightData(300)};
      
  
      LocationViewer(Composite parent) {
          super(createTable(parent));
  
          setContentProvider(new ArrayContentProvider());
          setLabelProvider(new LocationLabelProvider());
          setInput(new ArrayList());
  
          createColumns();
      }
  
      /**
       * Creates the table control.
       */
      private static Table createTable(Composite parent) {
          return new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
      }
      
      private void createColumns() {
          TableLayout layout = new TableLayout();
          getTable().setLayout(layout);
          getTable().setHeaderVisible(true);
          for (int i = 0; i < columnHeaders.length; i++) {
              layout.addColumnData(columnLayouts[i]);
              TableColumn tc = new TableColumn(getTable(), SWT.NONE,i);
              tc.setResizable(columnLayouts[i].resizable);
              tc.setText(columnHeaders[i]);
          }
      }
  
      /**
       * Attaches a contextmenu listener to the tree
       */
      void initContextMenu(IMenuListener menuListener, String popupId, IWorkbenchPartSite viewSite) {
          MenuManager menuMgr= new MenuManager();
          menuMgr.setRemoveAllWhenShown(true);
          menuMgr.addMenuListener(menuListener);
          Menu menu= menuMgr.createContextMenu(getControl());
          getControl().setMenu(menu);
          viewSite.registerContextMenu(popupId, menuMgr, this);
      }
      
      /**
       * Initializes and returns the Copy action for the location viewer.
       */
      LocationCopyAction initCopyAction(final IViewSite viewSite, final Clipboard clipboard) {
      	final LocationCopyAction copyAction= new LocationCopyAction(viewSite, clipboard, this);
      	
          getTable().addFocusListener(new FocusListener() {
          	IAction fViewCopyHandler;
  			public void focusLost(FocusEvent e) {
  				if (fViewCopyHandler != null) {
  					IActionBars actionBars= viewSite.getActionBars();
  					actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), fViewCopyHandler);
  					actionBars.updateActionBars();
  					fViewCopyHandler= null;
  				}
  			}
  			
  			public void focusGained(FocusEvent e) {
  				IActionBars actionBars= viewSite.getActionBars();
  				fViewCopyHandler= actionBars.getGlobalActionHandler(ActionFactory.COPY.getId());
  				actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
  				actionBars.updateActionBars();
  			}
  		});
          
          return copyAction;
      }
  
      /**
       * 
       */
      void clearViewer() {
          setInput(""); //$NON-NLS-1$
      }
  }
  