org.eclipsetrader.ui.internal.editors.BaseJavaScriptEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipsetrader.ui.internal.editors.BaseJavaScriptEditor.java

Source

/*
 * Copyright (c) 2004-2011 Marco Maccaferri 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:
 *     Marco Maccaferri - initial API and implementation
 */

package org.eclipsetrader.ui.internal.editors;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISaveablePart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;
import org.eclipsetrader.ui.internal.UIActivator;

public abstract class BaseJavaScriptEditor extends ViewPart implements ISaveablePart {

    private StyledText text;
    private Label cursorLocation;

    private boolean dirty;
    IThemeManager themeManager;

    private final ModifyListener modifyListener = new ModifyListener() {

        @Override
        public void modifyText(ModifyEvent e) {
            if (!dirty) {
                dirty = true;
                firePropertyChange(ISaveablePart.PROP_DIRTY);
            }
        }
    };

    private final IPropertyChangeListener preferencesChangeListener = new IPropertyChangeListener() {

        @Override
        public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
            if (UIActivator.PREFS_TEXT_EDITOR_FONT.equals(event.getProperty())) {
                text.setFont((Font) event.getNewValue());
            } else if (IThemeManager.CHANGE_CURRENT_THEME.equals(event.getProperty())) {
                ITheme newTheme = (ITheme) event.getOldValue();
                if (newTheme != null) {
                    text.setFont(newTheme.getFontRegistry().get(UIActivator.PREFS_TEXT_EDITOR_FONT));
                }
            }
        }
    };

    public BaseJavaScriptEditor() {
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        themeManager = PlatformUI.getWorkbench().getThemeManager();

        Composite contents = new Composite(parent, SWT.NONE);
        GridLayout gridLayout = new GridLayout(1, false);
        gridLayout.marginWidth = gridLayout.marginHeight = 0;
        gridLayout.verticalSpacing = 0;
        contents.setLayout(gridLayout);

        text = new StyledText(contents, SWT.FULL_SELECTION | SWT.WRAP | SWT.V_SCROLL);
        text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        text.setMargins(5, 5, 5, 5);
        text.addLineStyleListener(new JavaScriptLineStyler());
        text.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                updateCursorLocation();
            }
        });

        createStatusBar(contents);

        ITheme theme = themeManager.getCurrentTheme();
        text.setFont(theme.getFontRegistry().get(UIActivator.PREFS_TEXT_EDITOR_FONT));
        themeManager.addPropertyChangeListener(preferencesChangeListener);

        text.addModifyListener(modifyListener);

        updateCursorLocation();
    }

    private void createStatusBar(Composite parent) {
        Composite contents = new Composite(parent, SWT.NONE);
        contents.setLayout(new GridLayout(5, false));
        contents.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        GC gc = new GC(parent);
        FontMetrics fontMetrics = gc.getFontMetrics();
        gc.dispose();

        int heightHint = Dialog.convertVerticalDLUsToPixels(fontMetrics, 12);

        Label label = new Label(contents, SWT.NONE);
        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        label = new Label(contents, SWT.SEPARATOR | SWT.VERTICAL);
        label.setLayoutData(new GridData(SWT.DEFAULT, heightHint));

        cursorLocation = new Label(contents, SWT.NONE);
        cursorLocation
                .setLayoutData(new GridData(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 60), SWT.DEFAULT));
        cursorLocation.setAlignment(SWT.CENTER);

        label = new Label(contents, SWT.SEPARATOR | SWT.VERTICAL);
        label.setLayoutData(new GridData(SWT.DEFAULT, heightHint));

        label = new Label(contents, SWT.NONE);
        label.setLayoutData(new GridData(Dialog.convertHorizontalDLUsToPixels(fontMetrics, 16), SWT.DEFAULT));
    }

    public void setText(String text) {
        this.text.removeModifyListener(modifyListener);
        try {
            this.text.setText(text);
            updateCursorLocation();
        } finally {
            this.text.addModifyListener(modifyListener);
        }
    }

    public String getText() {
        return text.getText();
    }

    private void updateCursorLocation() {
        int caret = text.getCaretOffset();
        int line = text.getLineAtOffset(caret);
        int column = caret - text.getOffsetAtLine(line);
        cursorLocation.setText(String.format("%d : %d", column + 1, line + 1));
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
        text.getParent().setFocus();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#isDirty()
     */
    @Override
    public boolean isDirty() {
        return dirty;
    }

    protected void setDirty(boolean dirty) {
        if (this.dirty != dirty) {
            this.dirty = dirty;
            firePropertyChange(PROP_DIRTY);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
     */
    @Override
    public boolean isSaveOnCloseNeeded() {
        return dirty;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        themeManager.removePropertyChangeListener(preferencesChangeListener);
        super.dispose();
    }
}