com.nokia.carbide.cpp.internal.sdk.ui.SDKPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.internal.sdk.ui.SDKPreferencePage.java

Source

/*
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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.carbide.cpp.internal.sdk.ui;

import java.io.File;
import java.text.MessageFormat;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import com.nokia.carbide.cpp.internal.api.sdk.ISBSv2BuildInfo;
import com.nokia.carbide.cpp.internal.api.sdk.SymbianBuildContextDataCache;
import com.nokia.carbide.cpp.internal.sdk.core.model.SBSv2BuildInfo;
import com.nokia.carbide.cpp.internal.sdk.core.model.SymbianSDK;
import com.nokia.carbide.cpp.sdk.core.ISDKManager;
import com.nokia.carbide.cpp.sdk.core.ISymbianBuilderID;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
import com.nokia.carbide.cpp.sdk.ui.SDKUIPlugin;
import com.nokia.carbide.cpp.sdk.ui.shared.AddSDKDialog;
import com.nokia.carbide.cpp.ui.TextAndDialogCellEditor;
import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;

public class SDKPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    private class SDKLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider {
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            ISymbianSDK sdk = (ISymbianSDK) element;
            switch (columnIndex) {
            case 1:
                return sdk.getUniqueId();
            case 2:
                return sdk.getEPOCROOT();
            default:
                return "";
            }
        }

        public Color getForeground(Object element, int columnIndex) {
            ISymbianSDK sdk = (ISymbianSDK) element;
            return updateSDKcolor(sdk);
        }

        public Color getBackground(Object element, int columnIndex) {
            return white;
        }
    }

    private class IdEditingSupport extends EditingSupport {
        private TextCellEditor editor;

        public IdEditingSupport(ColumnViewer viewer) {
            super(viewer);
            editor = new TextCellEditor((Composite) viewer.getControl());
        }

        @Override
        protected boolean canEdit(Object element) {
            if (element instanceof ISymbianSDK) {
                return true;
            }
            return false;
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return editor;
        }

        @Override
        protected Object getValue(Object element) {
            ISymbianSDK sdk = (ISymbianSDK) element;
            return sdk.getUniqueId();
        }

        @Override
        protected void setValue(Object element, Object value) {
            String sdkID = value.toString();

            // check for spaces in ID
            if (sdkID.contains(" ")) { //$NON-NLS-1$
                MessageDialog.openError(getShell(), Messages.getString("AddSDKDialog.Invalid_SDK_ID"), //$NON-NLS-1$
                        Messages.getString("AddSDKDialog.SDK_ID_No_Spaces")); //$NON-NLS-1$
                return;
            }

            ISymbianSDK sdk = (ISymbianSDK) element;
            ((SymbianSDK) sdk).setUniqueId(sdkID);
            SDKCorePlugin.getSDKManager().updateSDK(sdk);
            getViewer().refresh();
        }
    }

    private class LocationEditingSupport extends EditingSupport {
        private LocationCellEditor editor;

        public LocationEditingSupport(ColumnViewer viewer) {
            super(viewer);
            editor = new LocationCellEditor((Composite) viewer.getControl());
        }

        @Override
        protected boolean canEdit(Object element) {
            if (element instanceof ISymbianSDK) {
                return true;
            }
            return false;
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return editor;
        }

        @Override
        protected Object getValue(Object element) {
            ISymbianSDK sdk = (ISymbianSDK) element;
            return sdk.getEPOCROOT();
        }

        @Override
        protected void setValue(Object element, Object value) {
            ISymbianSDK sdk = (ISymbianSDK) element;
            File currentPath = new File(sdk.getEPOCROOT());
            File editedPath = new File(value.toString());
            if (!currentPath.equals(editedPath)) {
                // User changed the path, so make sure to scan again (boog 12172)
                ((SymbianSDK) sdk).setScannedRaptor(false);
                SymbianBuildContextDataCache.refreshForSDKs(new ISymbianSDK[] { sdk });
            }
            ((SymbianSDK) sdk).setEPOCROOT(value.toString());
            SDKCorePlugin.getSDKManager().updateSDK(sdk);
            getViewer().refresh();
            updateSDKStatus(sdk);
        }
    }

    private class LocationCellEditor extends TextAndDialogCellEditor {
        private Button button;
        private Text text;

        public LocationCellEditor(Composite parent) {
            super(parent);
        }

        @Override
        protected Control createContents(Composite parent) {
            text = (Text) super.createContents(parent);
            return text;
        }

        @Override
        protected Control createControl(Composite parent) {
            Control control = super.createControl(parent);
            button = getButton();
            button.setText(Messages.getString("SDKPreferencePage.Browse_Location_Label")); //$NON-NLS-1$
            return control;
        }

        @Override
        protected Object openDialogBox(Control cellEditorWindow) {
            DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN);
            BrowseDialogUtils.initializeFrom(dialog, text);
            return dialog.open();
        }
    }

    private class SDKViewerStrategy extends ColumnViewerEditorActivationStrategy {
        public SDKViewerStrategy(ColumnViewer viewer) {
            super(viewer);
        }

        @Override
        protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
            return (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION);
        }
    }

    private ISDKManager sdkMgr;
    private List<ISymbianSDK> sdkList;
    private CheckboxTableViewer sdkListTableViewer;
    private Button addButton;
    private Button deleteButton;
    private Button propertiesButton;
    private Button rescanButton;
    private Button scanPluginsButton;
    private Label iconLabel;
    private Label statusLabel;

    private Color black;
    private Color gray;
    private Color red;
    private Color white;

    /**
     * Constructor.
     */
    public SDKPreferencePage() {
        super();
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        if (sdkMgr == null) {
            sdkMgr = SDKCorePlugin.getSDKManager();
        }
        if (sdkMgr == null) {
            return;
        }

        super.createControl(parent);

        // Hide "Restore Defaults" button
        getDefaultsButton().setVisible(false);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(super.getControl(), SDKUIHelpIds.SDK_PREFERENCES_PAGE);
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
        if (sdkMgr == null) {
            sdkMgr = SDKCorePlugin.getSDKManager();
        }
        if (sdkMgr != null) {
            sdkList = sdkMgr.getSDKList();
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    public boolean performOk() {
        IPreferenceStore prefsStore = SDKUIPlugin.getDefault().getPreferenceStore();
        prefsStore.setValue(SDKUIPreferenceConstants.SCAN_FOR_NEW_PLUGINS, scanPluginsButton.getSelection());

        // Remember which SDK is enabled
        for (ISymbianSDK sdk : sdkMgr.getSDKList()) {
            ((SymbianSDK) sdk).setEnabled(false);
        }
        Object[] sdkObjects = sdkListTableViewer.getCheckedElements();
        for (Object currObj : sdkObjects) {
            if (currObj instanceof ISymbianSDK) {
                ISymbianSDK sdk = (ISymbianSDK) currObj;
                ((SymbianSDK) sdk).setEnabled(true);
            }
        }

        // Update cached SDK info
        sdkMgr.updateCarbideSDKCache();
        return super.performOk();
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public Control createContents(Composite parent) {
        IPreferenceStore prefsStore = SDKUIPlugin.getDefault().getPreferenceStore();

        // Set up colors used in this preference page
        Shell shell = parent.getShell();
        black = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
        gray = shell.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
        red = shell.getDisplay().getSystemColor(SWT.COLOR_RED);
        white = shell.getDisplay().getSystemColor(SWT.COLOR_WHITE);

        Composite content = new Composite(parent, SWT.NONE);
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        content.setLayout(gridLayout);

        // SDK table
        sdkListTableViewer = CheckboxTableViewer.newCheckList(content,
                SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
        createSDKTable();

        // Buttons composite
        Composite composite1 = new Composite(content, SWT.NONE);
        gridLayout = new GridLayout();
        gridLayout.makeColumnsEqualWidth = true;
        composite1.setLayout(gridLayout);
        GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
        composite1.setLayoutData(gridData);

        // Add button
        addButton = new Button(composite1, SWT.NONE);
        addButton.setLayoutData(gridData);
        addButton.setText(Messages.getString("SDKPreferencePage.Add_Button_Label")); //$NON-NLS-1$
        addButton.setToolTipText(Messages.getString("SDKPreferencePage.Add_Button_ToolTip")); //$NON-NLS-1$
        addButtonListener(addButton);

        // Delete button
        deleteButton = new Button(composite1, SWT.NONE);
        deleteButton.setLayoutData(gridData);
        deleteButton.setText(Messages.getString("SDKPreferencePage.Delete_Button_Label")); //$NON-NLS-1$
        deleteButton.setToolTipText(Messages.getString("SDKPreferencePage.Delete_Button_ToolTip")); //$NON-NLS-1$
        addButtonListener(deleteButton);

        // Properties button
        propertiesButton = new Button(composite1, SWT.NONE);
        propertiesButton.setLayoutData(gridData);
        propertiesButton.setText(Messages.getString("SDKPreferencePage.Properties_Button_Label")); //$NON-NLS-1$
        propertiesButton.setToolTipText(Messages.getString("SDKPreferencePage.Properties_Button_ToolTip")); //$NON-NLS-1$
        addButtonListener(propertiesButton);

        // Status and Rescan composite
        Composite composite2 = new Composite(content, SWT.NONE);
        gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gridData.widthHint = 350;
        gridData.heightHint = 50;
        composite2.setLayoutData(gridData);
        gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        composite2.setLayout(gridLayout);

        // IStatus icon label
        iconLabel = new Label(composite2, SWT.NONE);
        // IStatus text label
        statusLabel = new Label(composite2, SWT.WRAP);
        gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
        gridData.verticalSpan = 2;
        statusLabel.setLayoutData(gridData);

        new Label(content, SWT.WRAP); // filler

        // Scan for installable features in SDKs button
        scanPluginsButton = new Button(content, SWT.CHECK);
        scanPluginsButton.setToolTipText(Messages.getString("SDKPreferencePage.scanPlugins_ButtonToolTip")); //$NON-NLS-1$
        scanPluginsButton.setText(Messages.getString("SDKPreferencePage.scanPlugins_Button_Label")); //$NON-NLS-1$
        scanPluginsButton.setSelection(prefsStore.getBoolean(SDKUIPreferenceConstants.SCAN_FOR_NEW_PLUGINS));
        addButtonListener(scanPluginsButton);

        new Label(content, SWT.WRAP); // filler

        // Rescan button
        rescanButton = new Button(content, SWT.NONE);
        rescanButton.setToolTipText(Messages.getString("SDKPreferencePage.Rescan_Button_ToolTip")); //$NON-NLS-1$
        rescanButton.setText(Messages.getString("SDKPreferencePage.Rescan_Button_Label")); //$NON-NLS-1$
        addButtonListener(rescanButton);

        // Populate SDK table
        addSDKComponentTableItems();
        selectSDKEntry(0);

        return content;
    }

    private void addButtonListener(final Button aButton) {
        SelectionListener listener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (e.getSource().equals(addButton)) {
                    handleAddButton();
                } else if (e.getSource().equals(deleteButton)) {
                    handleDeleteButton();
                } else if (e.getSource().equals(propertiesButton)) {
                    handlePropertiesButton();
                } else if (e.getSource().equals(rescanButton)) {
                    handleRescanButton(false);
                }
            }
        };
        aButton.addSelectionListener(listener);
    }

    private void addSDKComponentTableItems() {
        sdkListTableViewer.setLabelProvider(new SDKLabelProvider());
        sdkListTableViewer.setContentProvider(new ArrayContentProvider());
        sdkList = sdkMgr.getSDKList();
        sdkListTableViewer.setInput(sdkList.toArray());
        Table table = sdkListTableViewer.getTable();
        int count = table.getItemCount();
        if (count < 10) { // min. number of rows
            count = 10;
        } else if (count > 20) { // max. number of rows
            count = 20;
        }
        table.setToolTipText(Messages.getString("SDKPreferencePage.List_of_Available_SDKs_ToolTip")); //$NON-NLS-1$
        GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gridData.widthHint = 350;
        gridData.heightHint = table.getItemHeight() * (count + 2);
        table.setLayoutData(gridData);
        setCheckedElements();
        addSDKTableViewerListeners();
        if (sdkList == null || sdkList.size() == 0) {
            statusError(Messages.getString("SDKPreferencePage.No_SDKs_Available_Message")); //$NON-NLS-1$
        }
    }

    private void addSDKTableViewerListeners() {
        sdkListTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                    if (selection.size() == 1) {
                        ISymbianSDK sdk = (ISymbianSDK) selection.getFirstElement();
                        deleteButton.setEnabled(true);
                        propertiesButton.setEnabled(true);
                        updateSDKStatus(sdk);
                    } else {
                        deleteButton.setEnabled(false);
                        propertiesButton.setEnabled(false);
                    }
                }
            }
        });
    }

    private void createSDKTable() {
        Table table = sdkListTableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(false);

        SDKViewerStrategy strategy = new SDKViewerStrategy(sdkListTableViewer);
        TableViewerEditor.create(sdkListTableViewer, strategy, ColumnViewerEditor.DEFAULT);

        TableViewerColumn enabledCol = new TableViewerColumn(sdkListTableViewer, SWT.LEFT);
        enabledCol.getColumn().setText(Messages.getString("SDKPreferencePage.SDK_Table_Enabled_Column_Label")); //$NON-NLS-1$
        enabledCol.getColumn().setWidth(50);

        TableViewerColumn idCol = new TableViewerColumn(sdkListTableViewer, SWT.LEFT);
        idCol.setEditingSupport(new IdEditingSupport(sdkListTableViewer)); //$NON-NLS-1$
        idCol.getColumn().setText(Messages.getString("SDKPreferencePage.SDK_Table_ID_Column_Label"));
        idCol.getColumn().setWidth(160);

        TableViewerColumn locationCol = new TableViewerColumn(sdkListTableViewer, SWT.LEFT);
        locationCol.setEditingSupport(new LocationEditingSupport(sdkListTableViewer));
        locationCol.getColumn().setText(Messages.getString("SDKPreferencePage.SDK_Table_Location_Column_Label")); //$NON-NLS-1$
        locationCol.getColumn().setWidth(170);
    }

    public void handleAddButton() {
        AddSDKDialog dialog = new AddSDKDialog(getShell());
        if (dialog.open() == AddSDKDialog.OK) {
            sdkList = sdkMgr.getSDKList();
            sdkListTableViewer.setInput(sdkList.toArray());
            setCheckedElements();
            sdkListTableViewer.refresh();
            selectSDKEntry(sdkList.size() - 1);
        }
    }

    public void handleDeleteButton() {
        ISymbianSDK sdk = (ISymbianSDK) ((IStructuredSelection) sdkListTableViewer.getSelection())
                .getFirstElement();
        int index = sdkListTableViewer.getTable().getSelectionIndex();
        if (sdk != null) {
            if (sdkMgr.removeSDK(sdk.getUniqueId())) {
                sdkList = sdkMgr.getSDKList();
                sdkListTableViewer.setInput(sdkList.toArray());
                if (index > 0) {
                    selectSDKEntry(index - 1);
                } else {
                    selectSDKEntry(index);
                }
                sdkListTableViewer.refresh();
            }
        }
    }

    public void handlePropertiesButton() {
        ISymbianSDK sdk = (ISymbianSDK) ((IStructuredSelection) sdkListTableViewer.getSelection())
                .getFirstElement();
        int index = sdkListTableViewer.getTable().getSelectionIndex();
        if (sdk != null) {
            SDKPropertiesDialog sdkPropDlg = new SDKPropertiesDialog(getShell(), sdk);
            sdkPropDlg.open();
            selectSDKEntry(index);
        } else {
            MessageDialog.openError(getShell(), Messages.getString("SDKPreferencePage.No_SDK_Selected"), //$NON-NLS-1$
                    Messages.getString("SDKPreferencePage.No_selected_SDK_detected")); //$NON-NLS-1$
        }
    }

    public void handleRescanButton(boolean fromPortalPage) {
        // forcible rescan; dump cache
        SymbianBuildContextDataCache.refreshForSDKs(null);
        startRescanning();
        sdkMgr.scanSDKs();
        finishRescanning();
    }

    private void startRescanning() {
        rescanButton.setText(Messages.getString("SDKPreferencePage.Rescanning_Button_Label")); //$NON-NLS-1$
        rescanButton.setEnabled(false);
    }

    private void finishRescanning() {
        sdkListTableViewer.getTable().clearAll();
        sdkListTableViewer.refresh();
        sdkList.clear();
        sdkList = sdkMgr.getSDKList();
        addSDKComponentTableItems();
        sdkListTableViewer.refresh();
        selectSDKEntry(0);
        if (scanPluginsButton.getSelection()) {
            NewPluginChecker.checkForNewlyInstalledPlugins(SDKUIPlugin.getDefault().getWorkbench());
        }
        rescanButton.setText(Messages.getString("SDKPreferencePage.Rescan_Button_Label")); //$NON-NLS-1$
        rescanButton.setEnabled(true);
    }

    public void selectSDKEntry(int index) {
        ISymbianSDK sdk = (ISymbianSDK) sdkListTableViewer.getElementAt(index);
        if (sdk != null) {
            sdkListTableViewer.setSelection(new StructuredSelection(sdk), true);
            sdkListTableViewer.getTable().setFocus();
        }
        updateSDKStatus(sdk);
    }

    private void setCheckedElements() {
        Iterator<ISymbianSDK> iterator = sdkList.iterator();
        while (iterator.hasNext()) {
            ISymbianSDK sdk = iterator.next();
            sdkListTableViewer.setChecked(sdk, sdk.isEnabled());
        }
    }

    private void statusClear() {
        iconLabel.setImage(null);
        statusLabel.setText("");
    }

    private void statusError(String msg) {
        String errorMsg = "Error : " + msg;
        iconLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK));
        statusLabel.setText(errorMsg);
        statusLabel.setForeground(red);
        statusLabel.setBackground(gray);
        statusLabel.update();
        statusLabel.getParent().layout(true);
    }

    private void statusWarning(String msg) {
        String warningMsg = "Warning : " + msg; //$NON-NLS-1$
        iconLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK));
        statusLabel.setText(warningMsg);
        statusLabel.setForeground(black);
        statusLabel.setBackground(gray);
        statusLabel.update();
        statusLabel.getParent().layout(true);
    }

    private void statusInfo(String msg) {
        String infoMsg = "Info : " + msg; //$NON-NLS-1$
        iconLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK));
        statusLabel.setText(infoMsg);
        statusLabel.setForeground(black);
        statusLabel.setBackground(gray);
        statusLabel.update();
        statusLabel.getParent().layout(true);
    }

    private Color updateSDKcolor(ISymbianSDK sdk) {
        Color color = black;

        // Check SDK EPOCROOT
        String epocRootStr = sdk.getEPOCROOT();
        IPath epocRoot = new Path(epocRootStr);
        epocRoot = epocRoot.append("epoc32");
        File epocRootFile = epocRoot.toFile();
        if (!epocRootFile.exists()) {
            color = red;
        }

        // Check SDK OS Version
        if ((sdk.getOSVersion().getMajor() < 9
                || (sdk.getOSVersion().getMajor() == 9 && sdk.getOSVersion().getMinor() < 4))) {
            color = red;
        }

        return color;
    }

    private void updateSDKStatus(ISymbianSDK sdk) {
        // No SDK selected
        if (sdk == null) {
            statusWarning(Messages.getString("SDKPreferencePage.No_SDKs_Available_Message")); //$NON-NLS-1$
            return;
        } else {
            // Check SDK EPOCROOT
            String epocRootStr = sdk.getEPOCROOT();
            IPath epocRoot = new Path(epocRootStr);
            epocRoot = epocRoot.append("epoc32");
            File epocRootFile = epocRoot.toFile();
            if (!epocRootFile.exists()) {
                statusError(Messages.getString("SDKPreferencePage.Invalid_Location_Message")); //$NON-NLS-1$
                return;
            }

            // Check SDK OS Version
            if ((sdk.getOSVersion().getMajor() < 9
                    || (sdk.getOSVersion().getMajor() == 9 && sdk.getOSVersion().getMinor() < 4))) {
                statusError(MessageFormat.format(Messages.getString("SDKPreferencePage.Invalid_SDK_Message"), //$NON-NLS-1$
                        sdk.getOSVersion().toString())); //$NON-NLS-1$
                return;
            }

            // No error
            statusClear();
        }
    }

    public void updateForPortalLayer() {
        addButton.setVisible(false);
        deleteButton.setVisible(false);
        propertiesButton.setVisible(false);
        rescanButton.setVisible(false);
        getApplyButton().setVisible(false);
        GridLayout gridLayout = new GridLayout();
        sdkListTableViewer.getTable().getParent().setLayout(gridLayout);
        sdkListTableViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(CheckStateChangedEvent event) {
                performApply();
            }
        });
    }

}