htiextension/com.nokia.s60tools.hticonnection/src/com/nokia/s60tools/hticonnection/ui/views/main/MainView.java
--- /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