htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainView.java
author dpodwall
Tue, 12 Jan 2010 13:17:53 -0600
changeset 0 61163b28edca
child 7 018264c44c89
permissions -rw-r--r--
initial EPL conversion


/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

package com.nokia.s60tools.hticonnection.ui.views.main;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.part.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ui.*;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.SWT;

import com.nokia.s60tools.hticonnection.HtiApiActivator;
import com.nokia.s60tools.hticonnection.HtiConnectionHelpContextIDs;
import com.nokia.s60tools.hticonnection.actions.ClearScreenAction;
import com.nokia.s60tools.hticonnection.actions.OpenPreferencePageAction;
import com.nokia.s60tools.hticonnection.actions.ScrollLockAction;
import com.nokia.s60tools.hticonnection.actions.SelectAllAction;
import com.nokia.s60tools.hticonnection.actions.StartStopGatewayAction;
import com.nokia.s60tools.hticonnection.core.HtiConnection;
import com.nokia.s60tools.hticonnection.core.HtiConnection.ConnectionStatus;
import com.nokia.s60tools.ui.ICopyActionHandler;
import com.nokia.s60tools.ui.IStringProvider;
import com.nokia.s60tools.ui.StringArrayClipboardCopyHandler;
import com.nokia.s60tools.ui.actions.CopyFromStringProviderToClipboardAction;

/**
 * This class comprises the Main View of the HTI API 
 * application.
 */
public class MainView extends ViewPart implements IStringProvider {
	
	/**
	 * We can get view ID at runtime once the view is instantiated, but we
	 * also need static access to ID in order to be able to invoke the view.
	 */
	public static final String ID = "com.nokia.s60tools.hticonnection.ui.views.main.MainView"; //$NON-NLS-1$
	/**
	 * Viewer for showing text output.
	 */
	private MainTextViewer textViewer;
	
	//
	// Actions.
	//
	private StartStopGatewayAction startStopGatewayAction;
	private Action preferencesAction;
	private Action clearScreenAction;
	private Action scrollLockAction;
	private Action copyAction;
	private Action selectAllAction;

	/**
	 * The constructor.
	 */
	public MainView() {
	}

	/**
	 * This is called by framework when the controls for
	 * the view should be created.
	 */
	public void createPartControl(Composite parent) {

		//
		// Actions invoked by content providers may set enable/disable
		// states for the actions, therefore all the action has to be
		// created before creating the controls. This makes sure that
		// it is safe to refer to all the actions after this point.
		//

		createMainMenuActions();

		//
		// Creating controls
		//

		createViewContents(parent);

		//
		// Doing other initializations that may refer to the component
		// that has been created above.
		//

		hookContextMenu();
		contributeToActionBars();
		
		// Connection status needs to be updated, if view was closed/re-opened.
		HtiConnection.getInstance().updateConnectionStatus();
	}

	/**
	 * Creates text textViewer for viewing output.
	 * @param parent Parent composite.
	 */
	private void createViewContents(Composite parent) {
		textViewer = new MainTextViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
		textViewer.initializeSettings();

		// Creating selection changed listener to enable/disable copy action as needed.
		ISelectionChangedListener consoleSelectionListener = new ISelectionChangedListener(){
			public void selectionChanged(SelectionChangedEvent event) {
				int length = textViewer.getSelectedRange().y;
				// Action is enabled when length of selection is different than zero;
				copyAction.setEnabled(length != 0);
			}};
		textViewer.addSelectionChangedListener(consoleSelectionListener);
		
		// Setting context help IDs	
		
		PlatformUI.getWorkbench().getHelpSystem().setHelp(textViewer.getControl(), 
	    		HtiConnectionHelpContextIDs.HTI_CONNECTION_MAIN_VIEW);
	}
	
	/**
	 * Hooking context menu.
	 */
	private void hookContextMenu() {
		
		//
		// Context menu for text viewer
		//
		MenuManager menuMgr = new MenuManager("#TextViewerPopupMenu"); //$NON-NLS-1$
		menuMgr.setRemoveAllWhenShown(true);
		menuMgr.addMenuListener(new IMenuListener() {
			public void menuAboutToShow(IMenuManager manager) {
				MainView.this.fillContextMenu(manager);
			}
		});
		Menu menu = menuMgr.createContextMenu(textViewer.getControl());
		textViewer.getControl().setMenu(menu);
		getSite().registerContextMenu(menuMgr, textViewer);
	}

	/**
	 * Filling action bars.
	 */
	private void contributeToActionBars() {
		IActionBars bars = getViewSite().getActionBars();
		fillViewPullDownMenu(bars.getMenuManager());
		fillViewToolBar(bars.getToolBarManager());
	}

	/**
	 * Filling pull down menu.
	 * @param manager Menu manager. 
	 */
	private void fillViewPullDownMenu(IMenuManager manager) {
		manager.add(preferencesAction);
	}

	/**
	 * Filling context menu.
	 * @param manager Menu manager.
	 */
	private void fillContextMenu(IMenuManager manager) {
		manager.add(copyAction);
		manager.add(selectAllAction);
		manager.add(new Separator());
		manager.add(clearScreenAction);
		manager.add(new Separator());
		manager.add(scrollLockAction);
		// Other plug-ins can contribute there actions here
		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
	}
	
	/**
	 * Filling toolbar.
	 * @param manager Menu manager.
	 */
	private void fillViewToolBar(IToolBarManager manager) {
		manager.add(startStopGatewayAction);
		manager.add(new Separator());
		manager.add(preferencesAction);
		manager.add(new Separator());
		manager.add(clearScreenAction);
		manager.add(scrollLockAction);
	}

	/**
	 * Creating all needed actions.
	 */
	private void createMainMenuActions() {
		preferencesAction = new OpenPreferencePageAction();
		clearScreenAction = new ClearScreenAction(this);
		scrollLockAction = new ScrollLockAction(this);
		selectAllAction = new SelectAllAction(this);
		startStopGatewayAction = new StartStopGatewayAction();
		// Creator connection menu.
		IMenuCreator creator = new ConnectionMenuCreator();
		startStopGatewayAction.setMenuCreator(creator);
		
		StringArrayClipboardCopyHandler copyHandler = new StringArrayClipboardCopyHandler();		
		copyAction = new CopyFromStringProviderToClipboardAction(this, new ICopyActionHandler[]{ copyHandler });
		copyAction.setEnabled(false);
	}

	/**
	 * Allows other classes to update content description.
	 * @param newContentDescription New description.
	 */
	public void updateDescription(String newContentDescription){
		setContentDescription(newContentDescription);
		IToolBarManager tbManager = getViewSite().getActionBars().getToolBarManager();
		tbManager.update(true);
	}
	
	/**
	 * The view should refresh all its UI components in this method.
	 */
	public void refresh(){
		textViewer.refresh();
	}
		
	/**
	 * Sets enabled/disabled states for actions commands
	 * on this view, based on the current application state.
	 * This method should be called whenever an operation is
	 * started or stopped that might have effect on action 
	 * button states.
	 */
	public void updateActionButtonStates(){
		// Setting state depending on datagateway status.
		
		startStopGatewayAction.setRunning(
				HtiConnection.getInstance().getConnectionStatus() != ConnectionStatus.SHUTDOWN);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
	 */
	public void dispose() {
		LogDocument.getInstance().removeDocumentListener(textViewer);
		super.dispose();
	}

	/**
	 * Enables to open main view from classes that don't have
	 * reference to the main view instance and are not UI threads.
	 * This method only opens the view if it was not visible.
	 * @param setFocus True if focus should be set for view.
	 */
	public static void openMainViewAsync(final boolean setFocus){
		// We want to activate/create the view if it isn't open.
		// do not need to use the instance after it is returned.
		Runnable dialogRunnable = new Runnable() {
			public void run() {
				try {
					MainView.getViewInstance(setFocus);
				} catch (PartInitException e) {
					e.printStackTrace();
				}
			}
		};
		// Opening main view in default UI thread.
		Display.getDefault().asyncExec(dialogRunnable);
	}
	
	/**
	 * Enables to get reference of the main view
	 * from the classes that do not actually
	 * have reference to the main view instance.
	 * This method opens opens up the view if it
	 * was not visible.
	 * @param setFocus True if focus should be set for view.
	 * @return Instance of main view.
	 * @throws PartInitException
	 */
	public static MainView getViewInstance(boolean setFocus) throws PartInitException{
		
		IWorkbenchPage page = HtiApiActivator.getCurrentlyActivePage();
		
		boolean viewAlreadyVisible = false;
		IViewPart viewPart = null;
		
		// Checking if view is already open
		IViewReference[] viewRefs = page.getViewReferences();
		for (int i = 0; i < viewRefs.length; i++) {
			IViewReference reference = viewRefs[i];
			String id = reference.getId();
			if(id.equalsIgnoreCase(MainView.ID)){
				viewAlreadyVisible = true;
				// Found, restoring the view
				viewPart = reference.getView(true);
				// Activating the view if wanted.
				if(setFocus) {
					page.activate(viewPart);
				}
			}
		}
		// View was not opened
		if(! viewAlreadyVisible){
			if(setFocus){
				// Opening and setting focus for view.
				viewPart = page.showView(MainView.ID);
			} else {
				// Opening the view, but not setting focus.
				viewPart = page.showView(MainView.ID, null, IWorkbenchPage.VIEW_VISIBLE);
			}
		}	
		return ((MainView) viewPart);
	}
	
	/**
	 * Passing the focus request to the textViewer's control.
	 */
	public void setFocus() {
		textViewer.getControl().setFocus();
	}

	/**
	 * Returns console viewer.
	 * @return Viewer used in console.
	 */
	public MainTextViewer getMainTextViewer(){
		return textViewer;
	}

	/* (non-Javadoc)
	 * @see com.nokia.s60tools.ui.IStringProvider#getString()
	 */
	public String getString() {
		// Getting current selection and returning it.
		return textViewer.getSelectedText();
	}
}