X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java index 2608187..479f880 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java @@ -11,53 +11,125 @@ Contributors: IBM Corporation - Initial implementation Klaus Hartlage - www.eclipseproject.de **********************************************************************/ -import net.sourceforge.phpeclipse.phpeditor.php.PHPWordExtractor; +import net.sourceforge.phpdt.internal.ui.actions.CompositeActionGroup; +import net.sourceforge.phpdt.ui.actions.GenerateActionGroup; +import net.sourceforge.phpeclipse.IPreferenceConstants; +import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner; +import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider; + import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.help.IHelp; -import org.eclipse.help.IHelpResource; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.ITextOperationTarget; +import org.eclipse.jface.text.source.AnnotationRulerColumn; +import org.eclipse.jface.text.source.CompositeRuler; import org.eclipse.jface.text.source.ISourceViewer; -import org.eclipse.swt.graphics.Point; +import org.eclipse.jface.text.source.IVerticalRuler; +import org.eclipse.jface.text.source.IVerticalRulerColumn; +import org.eclipse.jface.text.source.LineNumberRulerColumn; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.swt.graphics.RGB; import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.actions.ActionContext; +import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.editors.text.TextEditor; -import org.eclipse.ui.help.WorkbenchHelp; +import org.eclipse.ui.texteditor.ContentAssistAction; import org.eclipse.ui.texteditor.DefaultRangeIndicator; +import org.eclipse.ui.texteditor.ITextEditorActionConstants; import org.eclipse.ui.texteditor.TextOperationAction; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; - /** - * Java specific text editor. + * PHP specific text editor. */ public class PHPEditor extends TextEditor { - + + // protected PHPActionGroup fActionGroups; /** The outline page */ private PHPContentOutlinePage fOutlinePage; + private IPreferenceStore phpPrefStore; + /** The line number ruler column */ + private LineNumberRulerColumn fLineNumberRulerColumn; + + protected CompositeActionGroup fActionGroups; + /** The standard action groups added to the menu */ + private GenerateActionGroup fGenerateActionGroup; + private CompositeActionGroup fContextMenuGroup; /** * Default constructor. */ public PHPEditor() { super(); + setRulerContextMenuId("#PHPRulerContext"); //$NON-NLS-1$ } + // + // /** + // * @see IMember#getCompilationUnit() + // */ + // public ICompilationUnit getCompilationUnit() { + // return this; + // } + // /** + // * @see org.phpeclipse.phpdt.internal.compiler.env.ICompilationUnit#getContents() + // */ + // public char[] getContents() { + // IDocument doc = this.getDocumentProvider().getDocument(this.getEditorInput()); + // + // return doc.get().toCharArray(); + // } - /** The JavaEditor implementation of this + /** + * Returns this document's complete text. + * + * @return the document's complete text + */ + public String get() { + IDocument doc = + this.getDocumentProvider().getDocument(this.getEditorInput()); + return doc.get(); + } + + /** + * Returns the standard action group of this editor. + */ + protected ActionGroup getActionGroup() { + return fActionGroups; + } + + public PHPContentOutlinePage getfOutlinePage() { + return fOutlinePage; + } + + /** The PHPEditor implementation of this * AbstractTextEditor method extend the * actions to add those specific to the receiver */ protected void createActions() { super.createActions(); - setAction( - "ContentAssistProposal", - new TextOperationAction( - PHPEditorMessages.getResourceBundle(), - "ContentAssistProposal.", - this, - ISourceViewer.CONTENTASSIST_PROPOSALS)); + + Action action; + // setAction( + // "ContentAssistProposal", + // new TextOperationAction( + // PHPEditorMessages.getResourceBundle(), + // "ContentAssistProposal.", + // this, + // ISourceViewer.CONTENTASSIST_PROPOSALS)); + action = new ContentAssistAction(PHPEditorMessages.getResourceBundle(), "ContentAssistProposal.", this); //$NON-NLS-1$ + action.setActionDefinitionId( + PHPEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS); + setAction("ContentAssistProposal", action); //$NON-NLS-1$ + + // System.out.println(action.getId()); + // System.out.println(action.getActionDefinitionId()); + setAction( "ContentAssistTip", new TextOperationAction( @@ -65,22 +137,73 @@ public class PHPEditor extends TextEditor { "ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION)); + + action = + new TextOperationAction( + PHPEditorMessages.getResourceBundle(), + "Comment.", + this, + ITextOperationTarget.PREFIX); + action.setActionDefinitionId(PHPEditorActionDefinitionIds.COMMENT); + setAction("Comment", action); + + // System.out.println(action.getId()); + // System.out.println(action.getActionDefinitionId()); + + action = + new TextOperationAction( + PHPEditorMessages.getResourceBundle(), + "Uncomment.", + this, + ITextOperationTarget.STRIP_PREFIX); + action.setActionDefinitionId(PHPEditorActionDefinitionIds.UNCOMMENT); + setAction("Uncomment", action); + + action = new TextOperationAction( + PHPEditorMessages.getResourceBundle(), "Format.", this, ISourceViewer.FORMAT); //$NON-NLS-1$ + action.setActionDefinitionId(PHPEditorActionDefinitionIds.FORMAT); + setAction("Format", action); //$NON-NLS-1$ + + // System.out.println(action.getId()); + // System.out.println(action.getActionDefinitionId()); + + // fActionGroups = new PHPActionGroup(this, ITextEditorActionConstants.GROUP_EDIT); + + markAsStateDependentAction("Comment", true); //$NON-NLS-1$ + markAsStateDependentAction("Uncomment", true); //$NON-NLS-1$ + markAsStateDependentAction("Format", true); //$NON-NLS-1$ + + fGenerateActionGroup = + new GenerateActionGroup(this, ITextEditorActionConstants.GROUP_EDIT); + + fActionGroups = + new CompositeActionGroup(new ActionGroup[] { fGenerateActionGroup }); + + // We have to keep the context menu group separate to have better control over positioning + fContextMenuGroup = + new CompositeActionGroup(new ActionGroup[] { fGenerateActionGroup }); + // rg, + // new LocalHistoryActionGroup(this, ITextEditorActionConstants.GROUP_EDIT)}); } - /** The JavaEditor implementation of this + /** The PHPEditor implementation of this * AbstractTextEditor method performs any extra - * disposal actions required by the java editor. + * disposal actions required by the php editor. */ public void dispose() { PHPEditorEnvironment.disconnect(this); if (fOutlinePage != null) fOutlinePage.setInput(null); + + if (fActionGroups != null) + fActionGroups.dispose(); + super.dispose(); } - /** The JavaEditor implementation of this + /** The PHPEditor implementation of this * AbstractTextEditor method performs any extra - * revert behavior required by the java editor. + * revert behavior required by the php editor. */ public void doRevertToSaved() { super.doRevertToSaved(); @@ -88,19 +211,26 @@ public class PHPEditor extends TextEditor { fOutlinePage.update(); } - /** The JavaEditor implementation of this + /** The PHPEditor implementation of this * AbstractTextEditor method performs any extra - * save behavior required by the java editor. + * save behavior required by the php editor. */ public void doSave(IProgressMonitor monitor) { super.doSave(monitor); + // compile or not, according to the user preferences + IPreferenceStore store = phpPrefStore; + if (store.getBoolean(PHPeclipsePlugin.PHP_PARSE_ON_SAVE)) { + IAction a = PHPParserAction.getInstance(); + if (a != null) + a.run(); + } if (fOutlinePage != null) fOutlinePage.update(); } - /** The JavaEditor implementation of this + /** The PHPEditor implementation of this * AbstractTextEditor method performs any extra - * save as behavior required by the java editor. + * save as behavior required by the php editor. */ public void doSaveAs() { super.doSaveAs(); @@ -108,7 +238,7 @@ public class PHPEditor extends TextEditor { fOutlinePage.update(); } - /** The JavaEditor implementation of this + /** The PHPEditor implementation of this * AbstractTextEditor method performs sets the * input of the outline page after AbstractTextEditor has set input. */ @@ -118,17 +248,31 @@ public class PHPEditor extends TextEditor { fOutlinePage.setInput(input); } - /** The JavaEditor implementation of this + /** The PHPEditor implementation of this * AbstractTextEditor method adds any - * JavaEditor specific entries. + * PHPEditor specific entries. */ public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); - addAction(menu, "ContentAssistProposal"); //$NON-NLS-1$ - addAction(menu, "ContentAssistTip"); //$NON-NLS-1$ + // addAction(menu, "ContentAssistProposal"); //$NON-NLS-1$ + // addAction(menu, "ContentAssistTip"); //$NON-NLS-1$ + addAction(menu, ITextEditorActionConstants.GROUP_EDIT, "Format"); //$NON-NLS-1$ + + // fActionGroups.fillContextMenu(menu); + + ActionContext context = + new ActionContext(getSelectionProvider().getSelection()); + fContextMenuGroup.setContext(context); + fContextMenuGroup.fillContextMenu(menu); + fContextMenuGroup.setContext(null); } - /** The JavaEditor implementation of this + protected void updateStateDependentActions() { + super.updateStateDependentActions(); + fGenerateActionGroup.editorStateChanged(); + } + + /** The PHPEditor implementation of this * AbstractTextEditor method performs gets * the java content outline page if request is for a an * outline page. @@ -145,49 +289,219 @@ public class PHPEditor extends TextEditor { return super.getAdapter(required); } - public void openContextHelp() { - IDocument doc = this.getDocumentProvider().getDocument(this.getEditorInput()); - ITextSelection selection = (ITextSelection) this.getSelectionProvider().getSelection(); - int pos = selection.getOffset(); - String word = getFunctionName(doc, pos); - openContextHelp(word); - } + // public void openContextHelp() { + // IDocument doc = this.getDocumentProvider().getDocument(this.getEditorInput()); + // ITextSelection selection = (ITextSelection) this.getSelectionProvider().getSelection(); + // int pos = selection.getOffset(); + // String word = getFunctionName(doc, pos); + // openContextHelp(word); + // } + // + // private void openContextHelp(String word) { + // open(word); + // } + // + // public static void open(String word) { + // IHelp help = WorkbenchHelp.getHelpSupport(); + // if (help != null) { + // IHelpResource helpResource = new PHPFunctionHelpResource(word); + // WorkbenchHelp.getHelpSupport().displayHelpResource(helpResource); + // } else { + // // showMessage(shell, dialogTitle, ActionMessages.getString("Open help not available"), false); //$NON-NLS-1$ + // } + // } - private void openContextHelp(String word) { - open(word); - } + // private String getFunctionName(IDocument doc, int pos) { + // Point word = PHPWordExtractor.findWord(doc, pos); + // if (word != null) { + // try { + // return doc.get(word.x, word.y).replace('_', '-'); + // } catch (BadLocationException e) { + // } + // } + // return ""; + // } + + /* + * @see AbstractTextEditor#handlePreferenceStoreChanged(PropertyChangeEvent) + */ + protected void handlePreferenceStoreChanged(PropertyChangeEvent event) { + + try { + + ISourceViewer sourceViewer = getSourceViewer(); + if (sourceViewer == null) + return; + + String property = event.getProperty(); + + // if (JavaSourceViewerConfiguration.PREFERENCE_TAB_WIDTH.equals(property)) { + // Object value= event.getNewValue(); + // if (value instanceof Integer) { + // sourceViewer.getTextWidget().setTabs(((Integer) value).intValue()); + // } else if (value instanceof String) { + // sourceViewer.getTextWidget().setTabs(Integer.parseInt((String) value)); + // } + // return; + // } + + if (IPreferenceConstants.LINE_NUMBER_RULER.equals(property)) { + if (isLineNumberRulerVisible()) + showLineNumberRuler(); + else + hideLineNumberRuler(); + return; + } + + if (fLineNumberRulerColumn != null + && (IPreferenceConstants.LINE_NUMBER_COLOR.equals(property) + || PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(property) + || PREFERENCE_COLOR_BACKGROUND.equals(property))) { + + initializeLineNumberRulerColumn(fLineNumberRulerColumn); + } - public static void open(String word) { - IHelp help = WorkbenchHelp.getHelpSupport(); - if (help != null) { - IHelpResource helpResource = new PHPFunctionHelpResource(word); - WorkbenchHelp.getHelpSupport().displayHelpResource(helpResource); - } else { - // showMessage(shell, dialogTitle, ActionMessages.getString("Open help not available"), false); //$NON-NLS-1$ + } finally { + super.handlePreferenceStoreChanged(event); } } - - private String getFunctionName(IDocument doc, int pos) { - Point word = PHPWordExtractor.findWord(doc, pos); - if (word != null) { + /** + * Shows the line number ruler column. + */ + private void showLineNumberRuler() { + IVerticalRuler v = getVerticalRuler(); + if (v instanceof CompositeRuler) { + CompositeRuler c = (CompositeRuler) v; + c.addDecorator(1, createLineNumberRulerColumn()); + } + } + + /** + * Return whether the line number ruler column should be + * visible according to the preference store settings. + * @return true if the line numbers should be visible + */ + private boolean isLineNumberRulerVisible() { + // IPreferenceStore store= getPreferenceStore(); + return phpPrefStore.getBoolean(IPreferenceConstants.LINE_NUMBER_RULER); + } + /** + * Hides the line number ruler column. + */ + private void hideLineNumberRuler() { + IVerticalRuler v = getVerticalRuler(); + if (v instanceof CompositeRuler) { + CompositeRuler c = (CompositeRuler) v; try { - return doc.get(word.x, word.y).replace('_', '-'); - } catch (BadLocationException e) { + c.removeDecorator(1); + } catch (Throwable e) { } } - return ""; + } + + /** + * Initializes the given line number ruler column from the preference store. + * @param rulerColumn the ruler column to be initialized + */ + protected void initializeLineNumberRulerColumn(LineNumberRulerColumn rulerColumn) { + // JavaTextTools textTools= JavaPlugin.getDefault().getJavaTextTools(); + PHPColorProvider manager = PHPEditorEnvironment.getPHPColorProvider(); + + if (phpPrefStore != null) { + + RGB rgb = null; + // foreground color + if (phpPrefStore.contains(IPreferenceConstants.LINE_NUMBER_COLOR)) { + if (phpPrefStore.isDefault(IPreferenceConstants.LINE_NUMBER_COLOR)) + rgb = + PreferenceConverter.getDefaultColor( + phpPrefStore, + IPreferenceConstants.LINE_NUMBER_COLOR); + else + rgb = + PreferenceConverter.getColor( + phpPrefStore, + IPreferenceConstants.LINE_NUMBER_COLOR); + } + rulerColumn.setForeground(manager.getColor(rgb)); + + rgb = null; + // background color + if (!phpPrefStore + .getBoolean( + IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) { + if (phpPrefStore + .contains(IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND)) { + if (phpPrefStore + .isDefault(IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND)) + rgb = + PreferenceConverter.getDefaultColor( + phpPrefStore, + IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND); + else + rgb = + PreferenceConverter.getColor( + phpPrefStore, + IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND); + } + rulerColumn.setBackground(manager.getColor(rgb)); + } + + } + } + + /** + * Creates a new line number ruler column that is appropriately initialized. + */ + protected IVerticalRulerColumn createLineNumberRulerColumn() { + fLineNumberRulerColumn = new LineNumberRulerColumn(); + initializeLineNumberRulerColumn(fLineNumberRulerColumn); + return fLineNumberRulerColumn; + } + + /* + * @see AbstractTextEditor#createVerticalRuler() + */ + protected IVerticalRuler createVerticalRuler() { + CompositeRuler ruler = new CompositeRuler(); + ruler.addDecorator(0, new AnnotationRulerColumn(VERTICAL_RULER_WIDTH)); + if (isLineNumberRulerVisible()) + ruler.addDecorator(1, createLineNumberRulerColumn()); + return ruler; } /* (non-Javadoc) * Method declared on AbstractTextEditor */ protected void initializeEditor() { - PHPEditorEnvironment.connect(this); - setSourceViewerConfiguration(new PHPSourceViewerConfiguration()); + setSourceViewerConfiguration(new PHPSourceViewerConfiguration(this)); setRangeIndicator(new DefaultRangeIndicator()); setEditorContextMenuId("#PHPEditorContext"); //$NON-NLS-1$ setRulerContextMenuId("#PHPRulerContext"); //$NON-NLS-1$ + // setDocumentProvider(PHPeclipsePlugin.getCompilationUnitDocumentProvider()); + phpPrefStore = PHPeclipsePlugin.getDefault().getPreferenceStore(); + + phpPrefStore.addPropertyChangeListener(new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + PHPCodeScanner scanner = PHPEditorEnvironment.getPHPCodeScanner(); + if (scanner != null) { + scanner.updateToken(PHPEditorEnvironment.getPHPColorProvider()); + } + if (getSourceViewer() != null) { + getSourceViewer().invalidateTextPresentation(); + } + + String property = event.getProperty(); + if (IPreferenceConstants.LINE_NUMBER_RULER.equals(property)) { + if (isLineNumberRulerVisible()) + showLineNumberRuler(); + else + hideLineNumberRuler(); + return; + } + } + }); } }