htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainView.java
changeset 0 61163b28edca
child 7 018264c44c89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainView.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,344 @@
+
+/*
+* 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();
+	}
+}
\ No newline at end of file