/* * 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(); } }