From f2b5d760b019fd979a0c8a6a7a436d59ded5e029 Mon Sep 17 00:00:00 2001
From: khartlage
+ * Value is of type
+ * Value is of type
+ * Value is of type
+ * Value is of type
+ * Value is of type
+ * Value is of type null
if there is no such information available.
+ */
+ private Color createColor(IPreferenceStore store, String key, Display display) {
+
+ RGB rgb= null;
+
+ if (store.contains(key)) {
+
+ if (store.isDefault(key))
+ rgb= PreferenceConverter.getDefaultColor(store, key);
+ else
+ rgb= PreferenceConverter.getColor(store, key);
+
+ if (rgb != null)
+ return new Color(display, rgb);
+ }
+
+ return null;
+ }
+
+ // sets enabled flag for a control and all its sub-tree
+ private static void setEnabled(Control control, boolean enable) {
+ control.setEnabled(enable);
+ if (control instanceof Composite) {
+ Composite composite= (Composite) control;
+ Control[] children= composite.getChildren();
+ for (int i= 0; i < children.length; i++)
+ setEnabled(children[i], enable);
+ }
+ }
+
+ private Control createAppearancePage(Composite parent) {
+
+ Composite appearanceComposite= new Composite(parent, SWT.NONE);
+ GridLayout layout= new GridLayout(); layout.numColumns= 2;
+ appearanceComposite.setLayout(layout);
+
+ String label= PHPUIMessages.getString("PHPEditorPreferencePage.textFont"); //$NON-NLS-1$
+ addTextFontEditor(appearanceComposite, label, AbstractTextEditor.PREFERENCE_FONT);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.displayedTabWidth"); //$NON-NLS-1$
+ addTextField(appearanceComposite, label, PreferenceConstants.EDITOR_TAB_WIDTH, 3, 0, true);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.printMarginColumn"); //$NON-NLS-1$
+ addTextField(appearanceComposite, label, PreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, 3, 0, true);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.synchronizeOnCursor"); //$NON-NLS-1$
+ addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.showOverviewRuler"); //$NON-NLS-1$
+ addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_OVERVIEW_RULER, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.showLineNumbers"); //$NON-NLS-1$
+ addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_LINE_NUMBER_RULER, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.highlightMatchingBrackets"); //$NON-NLS-1$
+ addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_MATCHING_BRACKETS, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.highlightCurrentLine"); //$NON-NLS-1$
+ addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_CURRENT_LINE, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.showPrintMargin"); //$NON-NLS-1$
+ addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_PRINT_MARGIN, 0);
+
+
+ Label l= new Label(appearanceComposite, SWT.LEFT );
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan= 2;
+ gd.heightHint= convertHeightInCharsToPixels(1) / 2;
+ l.setLayoutData(gd);
+
+ l= new Label(appearanceComposite, SWT.LEFT);
+ l.setText(PHPUIMessages.getString("PHPEditorPreferencePage.appearanceOptions")); //$NON-NLS-1$
+ gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan= 2;
+ l.setLayoutData(gd);
+
+ Composite editorComposite= new Composite(appearanceComposite, SWT.NONE);
+ layout= new GridLayout();
+ layout.numColumns= 2;
+ layout.marginHeight= 0;
+ layout.marginWidth= 0;
+ editorComposite.setLayout(layout);
+ gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
+ gd.horizontalSpan= 2;
+ editorComposite.setLayoutData(gd);
+
+ fAppearanceColorList= new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
+ gd= new GridData(GridData.FILL_BOTH);
+ gd.heightHint= convertHeightInCharsToPixels(5);
+ fAppearanceColorList.setLayoutData(gd);
+
+ Composite stylesComposite= new Composite(editorComposite, SWT.NONE);
+ layout= new GridLayout();
+ layout.marginHeight= 0;
+ layout.marginWidth= 0;
+ layout.numColumns= 2;
+ stylesComposite.setLayout(layout);
+ stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ l= new Label(stylesComposite, SWT.LEFT);
+ l.setText(PHPUIMessages.getString("PHPEditorPreferencePage.color")); //$NON-NLS-1$
+ gd= new GridData();
+ gd.horizontalAlignment= GridData.BEGINNING;
+ l.setLayoutData(gd);
+
+ fAppearanceForegroundColorEditor= new ColorEditor(stylesComposite);
+ Button foregroundColorButton= fAppearanceForegroundColorEditor.getButton();
+ gd= new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalAlignment= GridData.BEGINNING;
+ foregroundColorButton.setLayoutData(gd);
+
+ fAppearanceColorList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+ }
+ public void widgetSelected(SelectionEvent e) {
+ handleAppearanceColorListSelection();
+ }
+ });
+ foregroundColorButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+ }
+ public void widgetSelected(SelectionEvent e) {
+ int i= fAppearanceColorList.getSelectionIndex();
+ String key= fAppearanceColorListModel[i][1];
+
+ PreferenceConverter.setValue(fOverlayStore, key, fAppearanceForegroundColorEditor.getColorValue());
+ }
+ });
+ return appearanceComposite;
+ }
+
+
+ private Control createProblemIndicationPage(Composite parent) {
+ Composite composite= new Composite(parent, SWT.NULL);
+ GridLayout layout= new GridLayout(); layout.numColumns= 2;
+ composite.setLayout(layout);
+
+ String text= "Analyse &problems while typing";
+ addCheckBox(composite, text, PreferenceConstants.EDITOR_EVALUTE_TEMPORARY_PROBLEMS, 0);
+
+ text= PHPUIMessages.getString("PHPEditorPreferencePage.showQuickFixables"); //$NON-NLS-1$
+ addCheckBox(composite, text, PreferenceConstants.EDITOR_CORRECTION_INDICATION, 0);
+
+ Label label= new Label(composite, SWT.LEFT );
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan= 2;
+ gd.heightHint= convertHeightInCharsToPixels(1) / 2;
+ label.setLayoutData(gd);
+
+ label= new Label(composite, SWT.LEFT);
+ label.setText("&Marker presentation options:");
+ gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan= 2;
+ label.setLayoutData(gd);
+
+ Composite editorComposite= new Composite(composite, SWT.NONE);
+ layout= new GridLayout();
+ layout.numColumns= 2;
+ layout.marginHeight= 0;
+ layout.marginWidth= 0;
+ editorComposite.setLayout(layout);
+ gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
+ gd.horizontalSpan= 2;
+ editorComposite.setLayoutData(gd);
+
+ fProblemIndicationList= new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
+ gd= new GridData(GridData.FILL_BOTH);
+ gd.heightHint= convertHeightInCharsToPixels(5);
+ fProblemIndicationList.setLayoutData(gd);
+
+ Composite optionsComposite= new Composite(editorComposite, SWT.NONE);
+ layout= new GridLayout();
+ layout.marginHeight= 0;
+ layout.marginWidth= 0;
+ layout.numColumns= 2;
+ optionsComposite.setLayout(layout);
+ optionsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ fShowInTextCheckBox= new Button(optionsComposite, SWT.CHECK);
+ fShowInTextCheckBox.setText("Show in &text");
+ gd= new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalAlignment= GridData.BEGINNING;
+ gd.horizontalSpan= 2;
+ fShowInTextCheckBox.setLayoutData(gd);
+
+ fShowInOverviewRulerCheckBox= new Button(optionsComposite, SWT.CHECK);
+ fShowInOverviewRulerCheckBox.setText("Show in overview &ruler");
+ gd= new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalAlignment= GridData.BEGINNING;
+ gd.horizontalSpan= 2;
+ fShowInOverviewRulerCheckBox.setLayoutData(gd);
+
+ label= new Label(optionsComposite, SWT.LEFT);
+ label.setText("C&olor:");
+ gd= new GridData();
+ gd.horizontalAlignment= GridData.BEGINNING;
+ label.setLayoutData(gd);
+
+ fProblemIndicationForegroundColorEditor= new ColorEditor(optionsComposite);
+ Button foregroundColorButton= fProblemIndicationForegroundColorEditor.getButton();
+ gd= new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalAlignment= GridData.BEGINNING;
+ foregroundColorButton.setLayoutData(gd);
+
+ fProblemIndicationList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ handleProblemIndicationColorListSelection();
+ }
+ });
+
+ fShowInTextCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ int i= fProblemIndicationList.getSelectionIndex();
+ String key= fProblemIndicationColorListModel[i][2];
+ fOverlayStore.setValue(key, fShowInTextCheckBox.getSelection());
+ }
+ });
+
+ fShowInOverviewRulerCheckBox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ int i= fProblemIndicationList.getSelectionIndex();
+ String key= fProblemIndicationColorListModel[i][3];
+ fOverlayStore.setValue(key, fShowInOverviewRulerCheckBox.getSelection());
+ }
+ });
+
+ foregroundColorButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // do nothing
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ int i= fProblemIndicationList.getSelectionIndex();
+ String key= fProblemIndicationColorListModel[i][1];
+ PreferenceConverter.setValue(fOverlayStore, key, fProblemIndicationForegroundColorEditor.getColorValue());
+ }
+ });
+
+ return composite;
+ }
+
+// private Control createBehaviourPage(Composite parent) {
+// Composite composite= new Composite(parent, SWT.NULL);
+// GridLayout layout= new GridLayout(); layout.numColumns= 2;
+// composite.setLayout(layout);
+//
+// String label= PHPUIMessages.getString("PHPEditorPreferencePage.wrapStrings"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_WRAP_STRINGS, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.smartHomeEnd"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_SMART_HOME_END, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.smartPaste"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_SMART_PASTE, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.insertSpaceForTabs"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_SPACES_FOR_TABS, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.closeStrings"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_STRINGS, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.closeBrackets"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_BRACKETS, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.closeBraces"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_BRACES, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.closePHPDocs"); //$NON-NLS-1$
+// Button button= addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_JAVADOCS, 1);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.addPHPDocTags"); //$NON-NLS-1$
+// fAddJavaDocTagsButton= addCheckBox(composite, label, PreferenceConstants.EDITOR_ADD_JAVADOC_TAGS, 1);
+// createDependency(button, fAddJavaDocTagsButton);
+//
+// label= PHPUIMessages.getString("PHPEditorPreferencePage.formatPHPDocs"); //$NON-NLS-1$
+// addCheckBox(composite, label, PreferenceConstants.EDITOR_FORMAT_JAVADOCS, 1);
+//
+// return composite;
+// }
+
+ private static void indent(Control control) {
+ GridData gridData= new GridData();
+ gridData.horizontalIndent= 20;
+ control.setLayoutData(gridData);
+ }
+
+ private static void createDependency(final Button master, final Control slave) {
+ indent(slave);
+ master.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ slave.setEnabled(master.getSelection());
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ });
+ }
+
+ private Control createContentAssistPage(Composite parent) {
+
+ Composite contentAssistComposite= new Composite(parent, SWT.NULL);
+ GridLayout layout= new GridLayout(); layout.numColumns= 2;
+ contentAssistComposite.setLayout(layout);
+
+ String label= PHPUIMessages.getString("PHPEditorPreferencePage.insertSingleProposalsAutomatically"); //$NON-NLS-1$
+ addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_AUTOINSERT, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.showOnlyProposalsVisibleInTheInvocationContext"); //$NON-NLS-1$
+ addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_SHOW_VISIBLE_PROPOSALS, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.presentProposalsInAlphabeticalOrder"); //$NON-NLS-1$
+ addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_ORDER_PROPOSALS, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.automaticallyAddImportInsteadOfQualifiedName"); //$NON-NLS-1$
+ addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_ADDIMPORT, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.insertCompletion"); //$NON-NLS-1$
+ addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_INSERT_COMPLETION, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.fillArgumentNamesOnMethodCompletion"); //$NON-NLS-1$
+ Button button= addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_FILL_ARGUMENT_NAMES, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.guessArgumentNamesOnMethodCompletion"); //$NON-NLS-1$
+ fGuessMethodArgumentsButton= addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_GUESS_METHOD_ARGUMENTS, 0);
+ createDependency(button, fGuessMethodArgumentsButton);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.enableAutoActivation"); //$NON-NLS-1$
+ final Button autoactivation= addCheckBox(contentAssistComposite, label, PreferenceConstants.CODEASSIST_AUTOACTIVATION, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.autoActivationDelay"); //$NON-NLS-1$
+ fAutoInsertDelayText= addTextField(contentAssistComposite, label, PreferenceConstants.CODEASSIST_AUTOACTIVATION_DELAY, 4, 0, true);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.autoActivationTriggersForPHP"); //$NON-NLS-1$
+ fAutoInsertJavaTriggerText= addTextField(contentAssistComposite, label, PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA, 4, 0, false);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.autoActivationTriggersForPHPDoc"); //$NON-NLS-1$
+ fAutoInsertJavaDocTriggerText= addTextField(contentAssistComposite, label, PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVADOC, 4, 0, false);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.backgroundForCompletionProposals"); //$NON-NLS-1$
+ addColorButton(contentAssistComposite, label, PreferenceConstants.CODEASSIST_PROPOSALS_BACKGROUND, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.foregroundForCompletionProposals"); //$NON-NLS-1$
+ addColorButton(contentAssistComposite, label, PreferenceConstants.CODEASSIST_PROPOSALS_FOREGROUND, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.backgroundForMethodParameters"); //$NON-NLS-1$
+ addColorButton(contentAssistComposite, label, PreferenceConstants.CODEASSIST_PARAMETERS_BACKGROUND, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.foregroundForMethodParameters"); //$NON-NLS-1$
+ addColorButton(contentAssistComposite, label, PreferenceConstants.CODEASSIST_PARAMETERS_FOREGROUND, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.backgroundForCompletionReplacement"); //$NON-NLS-1$
+ addColorButton(contentAssistComposite, label, PreferenceConstants.CODEASSIST_REPLACEMENT_BACKGROUND, 0);
+
+ label= PHPUIMessages.getString("PHPEditorPreferencePage.foregroundForCompletionReplacement"); //$NON-NLS-1$
+ addColorButton(contentAssistComposite, label, PreferenceConstants.CODEASSIST_REPLACEMENT_FOREGROUND, 0);
+
+ autoactivation.addSelectionListener(new SelectionAdapter(){
+ public void widgetSelected(SelectionEvent e) {
+ updateAutoactivationControls();
+ }
+ });
+ return contentAssistComposite;
+ }
+
+ /*
+ * @see PreferencePage#createContents(Composite)
+ */
+ protected Control createContents(Composite parent) {
+
+ fOverlayStore.load();
+ fOverlayStore.start();
+
+ TabFolder folder= new TabFolder(parent, SWT.NONE);
+ folder.setLayout(new TabFolderLayout());
+ folder.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ TabItem item= new TabItem(folder, SWT.NONE);
+ item.setText(PHPUIMessages.getString("PHPEditorPreferencePage.general")); //$NON-NLS-1$
+ item.setControl(createAppearancePage(folder));
+
+ item= new TabItem(folder, SWT.NONE);
+ item.setText(PHPUIMessages.getString("PHPEditorPreferencePage.colors")); //$NON-NLS-1$
+ item.setControl(createSyntaxPage(folder));
+
+ item= new TabItem(folder, SWT.NONE);
+ item.setText(PHPUIMessages.getString("PHPEditorPreferencePage.codeAssist")); //$NON-NLS-1$
+ item.setControl(createContentAssistPage(folder));
+
+ item= new TabItem(folder, SWT.NONE);
+ item.setText(PHPUIMessages.getString("PHPEditorPreferencePage.problemIndicationTab.title")); //$NON-NLS-1$
+ item.setControl(createProblemIndicationPage(folder));
+
+// item= new TabItem(folder, SWT.NONE);
+// item.setText(PHPUIMessages.getString("PHPEditorPreferencePage.behaviourTab.title")); //$NON-NLS-1$
+// item.setControl(createBehaviourPage(folder));
+
+// item= new TabItem(folder, SWT.NONE);
+// item.setText(PHPUIMessages.getString("PHPEditorPreferencePage.hoverTab.title")); //$NON-NLS-1$
+// fJavaEditorHoverConfigurationBlock= new JavaEditorHoverConfigurationBlock(fOverlayStore);
+// item.setControl(fJavaEditorHoverConfigurationBlock.createControl(folder));
+
+ initialize();
+
+ return folder;
+ }
+
+ private void initialize() {
+
+ fFontEditor.setPreferenceStore(getPreferenceStore());
+ fFontEditor.setPreferencePage(this);
+ fFontEditor.load();
+
+ initializeFields();
+
+// for (int i= 0; i < fSyntaxColorListModel.length; i++)
+// fSyntaxColorList.add(fSyntaxColorListModel[i][0]);
+
+ fSyntaxColorList.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (fSyntaxColorList != null && !fSyntaxColorList.isDisposed()) {
+ fSyntaxColorList.select(0);
+ handleSyntaxColorListSelection();
+ }
+ }
+ });
+
+ for (int i= 0; i < fAppearanceColorListModel.length; i++)
+ fAppearanceColorList.add(fAppearanceColorListModel[i][0]);
+
+ fAppearanceColorList.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (fAppearanceColorList != null && !fAppearanceColorList.isDisposed()) {
+ fAppearanceColorList.select(0);
+ handleAppearanceColorListSelection();
+ }
+ }
+ });
+
+ for (int i= 0; i < fProblemIndicationColorListModel.length; i++)
+ fProblemIndicationList.add(fProblemIndicationColorListModel[i][0]);
+
+ fProblemIndicationList.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (fProblemIndicationList != null && !fProblemIndicationList.isDisposed()) {
+ fProblemIndicationList.select(0);
+ handleProblemIndicationColorListSelection();
+ }
+ }
+ });
+ }
+
+ private void initializeFields() {
+
+ Iterator e= fColorButtons.keySet().iterator();
+ while (e.hasNext()) {
+ ColorEditor c= (ColorEditor) e.next();
+ String key= (String) fColorButtons.get(c);
+ RGB rgb= PreferenceConverter.getColor(fOverlayStore, key);
+ c.setColorValue(rgb);
+ }
+
+ e= fCheckBoxes.keySet().iterator();
+ while (e.hasNext()) {
+ Button b= (Button) e.next();
+ String key= (String) fCheckBoxes.get(b);
+ b.setSelection(fOverlayStore.getBoolean(key));
+ }
+
+ e= fTextFields.keySet().iterator();
+ while (e.hasNext()) {
+ Text t= (Text) e.next();
+ String key= (String) fTextFields.get(t);
+ t.setText(fOverlayStore.getString(key));
+ }
+
+ RGB rgb= PreferenceConverter.getColor(fOverlayStore, PreferenceConstants.EDITOR_BACKGROUND_COLOR);
+ fBackgroundColorEditor.setColorValue(rgb);
+
+ boolean default_= fOverlayStore.getBoolean(PreferenceConstants.EDITOR_BACKGROUND_DEFAULT_COLOR);
+ fBackgroundDefaultRadioButton.setSelection(default_);
+ fBackgroundCustomRadioButton.setSelection(!default_);
+ fBackgroundColorButton.setEnabled(!default_);
+
+ // boolean closeJavaDocs= fOverlayStore.getBoolean(PreferenceConstants.EDITOR_CLOSE_JAVADOCS);
+ // fAddJavaDocTagsButton.setEnabled(closeJavaDocs);
+
+ boolean fillMethodArguments= fOverlayStore.getBoolean(PreferenceConstants.CODEASSIST_FILL_ARGUMENT_NAMES);
+ fGuessMethodArgumentsButton.setEnabled(fillMethodArguments);
+
+ updateAutoactivationControls();
+
+ // fJavaEditorHoverConfigurationBlock.initializeFields();
+ }
+
+ private void updateAutoactivationControls() {
+ boolean autoactivation= fOverlayStore.getBoolean(PreferenceConstants.CODEASSIST_AUTOACTIVATION);
+ fAutoInsertDelayText.setEnabled(autoactivation);
+ fAutoInsertJavaTriggerText.setEnabled(autoactivation);
+ fAutoInsertJavaDocTriggerText.setEnabled(autoactivation);
+ }
+
+ /*
+ * @see PreferencePage#performOk()
+ */
+ public boolean performOk() {
+ fFontEditor.store();
+ // fJavaEditorHoverConfigurationBlock.performOk();
+ fOverlayStore.propagate();
+ PHPeclipsePlugin.getDefault().savePluginPreferences();
+ return true;
+ }
+
+ /*
+ * @see PreferencePage#performDefaults()
+ */
+ protected void performDefaults() {
+
+ fFontEditor.loadDefault();
+
+ fOverlayStore.loadDefaults();
+ initializeFields();
+
+ handleSyntaxColorListSelection();
+ handleAppearanceColorListSelection();
+ handleProblemIndicationColorListSelection();
+ super.performDefaults();
+
+ fPreviewViewer.invalidateTextPresentation();
+ }
+
+ /*
+ * @see DialogPage#dispose()
+ */
+ public void dispose() {
+
+ if (fJavaTextTools != null) {
+ fJavaTextTools= null;
+ }
+
+ fFontEditor.setPreferencePage(null);
+ fFontEditor.setPreferenceStore(null);
+
+ if (fOverlayStore != null) {
+ fOverlayStore.stop();
+ fOverlayStore= null;
+ }
+
+ super.dispose();
+ }
+
+ private Control addColorButton(Composite composite, String label, String key, int indentation) {
+
+ Label labelControl= new Label(composite, SWT.NONE);
+ labelControl.setText(label);
+
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.horizontalIndent= indentation;
+ labelControl.setLayoutData(gd);
+
+ ColorEditor editor= new ColorEditor(composite);
+ Button button= editor.getButton();
+ button.setData(editor);
+
+ gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ button.setLayoutData(gd);
+ button.addSelectionListener(fColorButtonListener);
+
+ fColorButtons.put(editor, key);
+
+ return composite;
+ }
+
+ private Button addCheckBox(Composite parent, String label, String key, int indentation) {
+ Button checkBox= new Button(parent, SWT.CHECK);
+ checkBox.setText(label);
+
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.horizontalIndent= indentation;
+ gd.horizontalSpan= 2;
+ checkBox.setLayoutData(gd);
+ checkBox.addSelectionListener(fCheckBoxListener);
+
+ fCheckBoxes.put(checkBox, key);
+
+ return checkBox;
+ }
+
+ private Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
+
+ Label labelControl= new Label(composite, SWT.NONE);
+ labelControl.setText(label);
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.horizontalIndent= indentation;
+ labelControl.setLayoutData(gd);
+
+ Text textControl= new Text(composite, SWT.BORDER | SWT.SINGLE);
+ gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.widthHint= convertWidthInCharsToPixels(textLimit + 1);
+ textControl.setLayoutData(gd);
+ textControl.setTextLimit(textLimit);
+ fTextFields.put(textControl, key);
+ if (isNumber) {
+ fNumberFields.add(textControl);
+ textControl.addModifyListener(fNumberFieldListener);
+ } else {
+ textControl.addModifyListener(fTextFieldListener);
+ }
+
+ return textControl;
+ }
+
+ private void addTextFontEditor(Composite parent, String label, String key) {
+
+ Composite editorComposite= new Composite(parent, SWT.NONE);
+ GridLayout layout= new GridLayout();
+ layout.numColumns= 3;
+ editorComposite.setLayout(layout);
+ fFontEditor= new WorkbenchChainedTextFontFieldEditor(key, label, editorComposite);
+ fFontEditor.setChangeButtonText(PHPUIMessages.getString("PHPEditorPreferencePage.change")); //$NON-NLS-1$
+
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan= 2;
+ editorComposite.setLayoutData(gd);
+ }
+
+ private String loadPreviewContentFromFile(String filename) {
+ String line;
+ String separator= System.getProperty("line.separator"); //$NON-NLS-1$
+ StringBuffer buffer= new StringBuffer(512);
+ BufferedReader reader= null;
+ try {
+ reader= new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(filename)));
+ while ((line= reader.readLine()) != null) {
+ buffer.append(line);
+ buffer.append(separator);
+ }
+ } catch (IOException io) {
+ PHPeclipsePlugin.log(io);
+ } finally {
+ if (reader != null) {
+ try { reader.close(); } catch (IOException e) {}
+ }
+ }
+ return buffer.toString();
+ }
+
+ private void numberFieldChanged(Text textControl) {
+ String number= textControl.getText();
+ IStatus status= validatePositiveNumber(number);
+ if (!status.matches(IStatus.ERROR))
+ fOverlayStore.setValue((String) fTextFields.get(textControl), number);
+ updateStatus(status);
+ }
+
+ private IStatus validatePositiveNumber(String number) {
+ StatusInfo status= new StatusInfo();
+ if (number.length() == 0) {
+ status.setError(PHPUIMessages.getString("PHPEditorPreferencePage.empty_input")); //$NON-NLS-1$
+ } else {
+ try {
+ int value= Integer.parseInt(number);
+ if (value < 0)
+ status.setError(PHPUIMessages.getFormattedString("PHPEditorPreferencePage.invalid_input", number)); //$NON-NLS-1$
+ } catch (NumberFormatException e) {
+ status.setError(PHPUIMessages.getFormattedString("PHPEditorPreferencePage.invalid_input", number)); //$NON-NLS-1$
+ }
+ }
+ return status;
+ }
+
+ private void updateStatus(IStatus status) {
+ if (!status.matches(IStatus.ERROR)) {
+ for (int i= 0; i < fNumberFields.size(); i++) {
+ Text text= (Text) fNumberFields.get(i);
+ IStatus s= validatePositiveNumber(text.getText());
+ status= StatusUtil.getMoreSevere(s, status);
+ }
+ }
+ setValid(!status.matches(IStatus.ERROR));
+ StatusUtil.applyToStatusLine(this, status);
+ }
+
+ /**
+ * @deprecated Inline to avoid reference to preference page
+ */
+ public static boolean indicateQuixFixableProblems() {
+ return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CORRECTION_INDICATION);
+ }
+
+ /**
+ * @deprecated Inline to avoid reference to preference page
+ */
+ static public boolean synchronizeOutlineOnCursorMove() {
+ return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE);
+ }
+
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/TemplatePreferencePage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/TemplatePreferencePage.java
index 2fc70d4..ca44370 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/TemplatePreferencePage.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/TemplatePreferencePage.java
@@ -14,6 +14,7 @@ import net.sourceforge.phpdt.internal.corext.template.Templates;
import net.sourceforge.phpdt.internal.ui.text.template.TemplateContentProvider;
import net.sourceforge.phpdt.internal.ui.text.template.TemplateLabelProvider;
import net.sourceforge.phpdt.internal.ui.util.SWTUtil;
+import net.sourceforge.phpdt.ui.text.JavaTextTools;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.phpeditor.PHPEditorEnvironment;
import net.sourceforge.phpeclipse.phpeditor.PHPSourceViewerConfiguration;
@@ -26,6 +27,7 @@ import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
@@ -59,7 +61,9 @@ import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
-public class TemplatePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+public class TemplatePreferencePage
+ extends PreferencePage
+ implements IWorkbenchPreferencePage {
// preference store keys
private static final String PREF_FORMAT_TEMPLATES = PHPeclipsePlugin.PLUGIN_ID + ".template.format"; //$NON-NLS-1$
@@ -110,7 +114,10 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
gd.horizontalSpan = 2;
innerParent.setLayoutData(gd);
- Table table = new Table(innerParent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
+ Table table =
+ new Table(
+ innerParent,
+ SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
GridData data = new GridData(GridData.FILL_BOTH);
data.widthHint = convertWidthInCharsToPixels(3);
@@ -144,7 +151,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
int result = left.getName().compareToIgnoreCase(right.getName());
if (result != 0)
return result;
- return left.getDescription().compareToIgnoreCase(right.getDescription());
+ return left.getDescription().compareToIgnoreCase(
+ right.getDescription());
}
return super.compare(viewer, object1, object2);
}
@@ -268,7 +276,13 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
// fFormatButton.setSelection(prefs.getBoolean(PREF_FORMAT_TEMPLATES));
updateButtons();
- configureTableResizing(innerParent, buttons, table, column1, column2, column3);
+ configureTableResizing(
+ innerParent,
+ buttons,
+ table,
+ column1,
+ column2,
+ column3);
// WorkbenchHelp.setHelp(parent, IJavaHelpContextIds.TEMPLATE_PREFERENCE_PAGE);
@@ -338,17 +352,20 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
data.horizontalSpan = 2;
label.setLayoutData(data);
- SourceViewer viewer = new SourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
- // JavaTextTools tools= PHPeclipsePlugin.getDefault().getJavaTextTools();
+ SourceViewer viewer =
+ new SourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+ JavaTextTools tools = PHPeclipsePlugin.getDefault().getJavaTextTools();
IDocument document = new Document();
- // IDocumentPartitioner partitioner= new PHPPartitionScanner(); //tools.createDocumentPartitioner();
- // document.setDocumentPartitioner(partitioner);
- // partitioner.connect(document);
+ IDocumentPartitioner partitioner = tools.createDocumentPartitioner();
+ document.setDocumentPartitioner(partitioner);
+ partitioner.connect(document);
- viewer.configure(new PHPSourceViewerConfiguration(null)); // (tools, null));
+ viewer.configure(new PHPSourceViewerConfiguration(tools, null));
+ // (tools, null));
viewer.setEditable(false);
viewer.setDocument(document);
- viewer.getTextWidget().setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+ viewer.getTextWidget().setBackground(
+ getShell().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
Font font = JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT);
viewer.getTextWidget().setFont(font);
@@ -371,7 +388,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
}
private void selectionChanged1() {
- IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
+ IStructuredSelection selection =
+ (IStructuredSelection) fTableViewer.getSelection();
if (selection.size() == 1) {
Template template = (Template) selection.getFirstElement();
@@ -384,7 +402,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
}
private void updateButtons() {
- int selectionCount = ((IStructuredSelection) fTableViewer.getSelection()).size();
+ int selectionCount =
+ ((IStructuredSelection) fTableViewer.getSelection()).size();
int itemCount = fTableViewer.getTable().getItemCount();
fEditButton.setEnabled(selectionCount == 1);
@@ -410,7 +429,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
}
template.setContext(contextTypeName); //$NON-NLS-1$
- EditTemplateDialog dialog = new EditTemplateDialog(getShell(), template, false);
+ EditTemplateDialog dialog =
+ new EditTemplateDialog(getShell(), template, false);
if (dialog.open() == EditTemplateDialog.OK) {
fTemplates.add(template);
fTableViewer.refresh();
@@ -420,7 +440,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
}
private void edit() {
- IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
+ IStructuredSelection selection =
+ (IStructuredSelection) fTableViewer.getSelection();
Object[] objects = selection.toArray();
if ((objects == null) || (objects.length != 1))
@@ -432,7 +453,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
private void edit(Template template) {
Template newTemplate = new Template(template);
- EditTemplateDialog dialog = new EditTemplateDialog(getShell(), newTemplate, true);
+ EditTemplateDialog dialog =
+ new EditTemplateDialog(getShell(), newTemplate, true);
if (dialog.open() == EditTemplateDialog.OK) {
if (!newTemplate.getName().equals(template.getName()) && MessageDialog.openQuestion(getShell(), TemplateMessages.getString("TemplatePreferencePage.question.create.new.title"), //$NON-NLS-1$
@@ -479,7 +501,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
}
private void export() {
- IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
+ IStructuredSelection selection =
+ (IStructuredSelection) fTableViewer.getSelection();
Object[] templates = selection.toArray();
TemplateSet templateSet = new TemplateSet();
@@ -517,7 +540,8 @@ public class TemplatePreferencePage extends PreferencePage implements IWorkbench
}
private void remove() {
- IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
+ IStructuredSelection selection =
+ (IStructuredSelection) fTableViewer.getSelection();
Iterator elements = selection.iterator();
while (elements.hasNext()) {
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/BufferedDocumentScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/BufferedDocumentScanner.java
new file mode 100644
index 0000000..26116e0
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/BufferedDocumentScanner.java
@@ -0,0 +1,151 @@
+package net.sourceforge.phpdt.internal.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.util.Assert;
+
+
+
+/**
+ * A buffered document scanner. The buffer always contains a section
+ * of a fixed size of the document to be scanned.
+ */
+
+public final class BufferedDocumentScanner implements ICharacterScanner {
+
+ /** The document being scanned. */
+ private IDocument fDocument;
+ /** The offset of the document range to scan. */
+ private int fRangeOffset;
+ /** The length of the document range to scan. */
+ private int fRangeLength;
+ /** The delimiters of the document. */
+ private char[][] fDelimiters;
+
+ /** The buffer. */
+ private final char[] fBuffer;
+ /** The offset of the buffer within the document. */
+ private int fBufferOffset;
+ /** The valid length of the buffer for access. */
+ private int fBufferLength;
+ /** The offset of the scanner within the buffer. */
+ private int fOffset;
+
+
+ /**
+ * Creates a new buffered document scanner.
+ * The buffer size is set to the given number of characters.
+ *
+ * @param size the buffer size
+ */
+ public BufferedDocumentScanner(int size) {
+ Assert.isTrue(size >= 1);
+ fBuffer= new char[size];
+ }
+
+ /**
+ * Fills the buffer with the contens of the document starting at the given offset.
+ *
+ * @param offset the document offset at which the buffer starts
+ */
+ private final void updateBuffer(int offset) {
+
+ fBufferOffset= offset;
+
+ if (fBufferOffset + fBuffer.length > fRangeOffset + fRangeLength)
+ fBufferLength= fRangeLength - (fBufferOffset - fRangeOffset);
+ else
+ fBufferLength= fBuffer.length;
+
+ try {
+ final String content= fDocument.get(fBufferOffset, fBufferLength);
+ content.getChars(0, fBufferLength, fBuffer, 0);
+ } catch (BadLocationException e) {
+ }
+ }
+
+ /**
+ * Configures the scanner by providing access to the document range over which to scan.
+ *
+ * @param document the document to scan
+ * @param offset the offset of the document range to scan
+ * @param length the length of the document range to scan
+ */
+ public final void setRange(IDocument document, int offset, int length) {
+
+ fDocument= document;
+ fRangeOffset= offset;
+ fRangeLength= length;
+
+ String[] delimiters= document.getLegalLineDelimiters();
+ fDelimiters= new char[delimiters.length][];
+ for (int i= 0; i < delimiters.length; i++)
+ fDelimiters[i]= delimiters[i].toCharArray();
+
+ updateBuffer(offset);
+ fOffset= 0;
+ }
+
+ /*
+ * @see ICharacterScanner#read()
+ */
+ public final int read() {
+
+ if (fOffset == fBufferLength) {
+ if (fBufferOffset + fBufferLength == fDocument.getLength())
+ return EOF;
+ else {
+ updateBuffer(fBufferOffset + fBufferLength);
+ fOffset= 0;
+ }
+ }
+
+ return fBuffer[fOffset++];
+ }
+
+ /*
+ * @see ICharacterScanner#unread
+ */
+ public final void unread() {
+
+ if (fOffset == 0) {
+ if (fBufferOffset == fRangeOffset) {
+ // error: BOF
+ } else {
+ updateBuffer(fBufferOffset - fBuffer.length);
+ fOffset= fBuffer.length - 1;
+ }
+ } else {
+ --fOffset;
+ }
+ }
+
+ /*
+ * @see ICharacterScanner#getColumn()
+ */
+ public final int getColumn() {
+
+ try {
+ final int offset= fBufferOffset + fOffset;
+ final int line= fDocument.getLineOfOffset(offset);
+ final int start= fDocument.getLineOffset(line);
+ return offset - start;
+ } catch (BadLocationException e) {
+ }
+
+ return -1;
+ }
+
+ /*
+ * @see ICharacterScanner#getLegalLineDelimiters()
+ */
+ public final char[][] getLegalLineDelimiters() {
+ return fDelimiters;
+ }
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java
new file mode 100644
index 0000000..41246b6
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java
@@ -0,0 +1,526 @@
+package net.sourceforge.phpdt.internal.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IPartitionTokenScanner;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+
+/**
+ * This scanner recognizes the JavaDoc comments, Java multi line comments, Java single line comments,
+ * Java strings and Java characters.
+ */
+public class FastJavaPartitionScanner implements IPartitionTokenScanner {
+
+ private final static String SKIP= "__skip"; //$NON-NLS-1$
+ public final static String JAVA_STRING= "__php_string"; //$NON-NLS-1$
+ public final static String JAVA_SINGLE_LINE_COMMENT= "__php_singleline_comment"; //$NON-NLS-1$
+ public final static String JAVA_MULTI_LINE_COMMENT= "__php_multiline_comment"; //$NON-NLS-1$
+ public final static String JAVA_DOC= "__php_phpdoc"; //$NON-NLS-1$
+
+ // states
+ private static final int JAVA= 0;
+ private static final int SINGLE_LINE_COMMENT= 1;
+ private static final int MULTI_LINE_COMMENT= 2;
+ private static final int JAVADOC= 3;
+ private static final int CHARACTER= 4;
+ private static final int STRING= 5;
+
+ // beginning of prefixes and postfixes
+ private static final int NONE= 0;
+ private static final int BACKSLASH= 1; // postfix for STRING and CHARACTER
+ private static final int SLASH= 2; // prefix for SINGLE_LINE or MULTI_LINE or JAVADOC
+ private static final int SLASH_STAR= 3; // prefix for MULTI_LINE_COMMENT or JAVADOC
+ private static final int SLASH_STAR_STAR= 4; // prefix for MULTI_LINE_COMMENT or JAVADOC
+ private static final int STAR= 5; // postfix for MULTI_LINE_COMMENT or JAVADOC
+ private static final int CARRIAGE_RETURN=6; // postfix for STRING, CHARACTER and SINGLE_LINE_COMMENT
+
+ /** The scanner. */
+// private final BufferedRuleBasedScanner fScanner= new BufferedRuleBasedScanner(1000);
+ private final BufferedDocumentScanner fScanner= new BufferedDocumentScanner(1000); // faster implementation
+
+ /** The offset of the last returned token. */
+ private int fTokenOffset;
+ /** The length of the last returned token. */
+ private int fTokenLength;
+
+ /** The state of the scanner. */
+ private int fState;
+ /** The last significant characters read. */
+ private int fLast;
+ /** The amount of characters already read on first call to nextToken(). */
+ private int fPrefixLength;
+
+ // emulate JavaPartitionScanner
+ private static final boolean fgEmulate= false;
+ private int fJavaOffset;
+ private int fJavaLength;
+
+ private final IToken[] fTokens= new IToken[] {
+ new Token(null),
+ new Token(JAVA_SINGLE_LINE_COMMENT),
+ new Token(JAVA_MULTI_LINE_COMMENT),
+ new Token(JAVA_DOC),
+ new Token(SKIP),
+ new Token(JAVA_STRING)
+ };
+
+ /*
+ * @see org.eclipse.jface.text.rules.ITokenScanner#nextToken()
+ */
+ public IToken nextToken() {
+
+ // emulate JavaPartitionScanner
+ if (fgEmulate) {
+ if (fJavaOffset != -1 && fTokenOffset + fTokenLength != fJavaOffset + fJavaLength) {
+ fTokenOffset += fTokenLength;
+ return fTokens[JAVA];
+ } else {
+ fJavaOffset= -1;
+ fJavaLength= 0;
+ }
+ }
+
+ fTokenOffset += fTokenLength;
+ fTokenLength= fPrefixLength;
+
+ while (true) {
+ final int ch= fScanner.read();
+
+ // characters
+ switch (ch) {
+ case ICharacterScanner.EOF:
+ if (fTokenLength > 0) {
+ fLast= NONE; // ignore last
+ return preFix(fState, JAVA, NONE, 0);
+
+ } else {
+ fLast= NONE;
+ fPrefixLength= 0;
+ return Token.EOF;
+ }
+
+ case '\r':
+ // emulate JavaPartitionScanner
+ if (!fgEmulate && fLast != CARRIAGE_RETURN) {
+ fLast= CARRIAGE_RETURN;
+ fTokenLength++;
+ continue;
+
+ } else {
+
+ switch (fState) {
+ case SINGLE_LINE_COMMENT:
+ case CHARACTER:
+ case STRING:
+ if (fTokenLength > 0) {
+ IToken token= fTokens[fState];
+
+ // emulate JavaPartitionScanner
+ if (fgEmulate) {
+ fTokenLength++;
+ fLast= NONE;
+ fPrefixLength= 0;
+ } else {
+ fLast= CARRIAGE_RETURN;
+ fPrefixLength= 1;
+ }
+
+ fState= JAVA;
+ return token;
+
+ } else {
+ consume();
+ continue;
+ }
+
+ default:
+ consume();
+ continue;
+ }
+ }
+
+ case '\n':
+ switch (fState) {
+ case SINGLE_LINE_COMMENT:
+ case CHARACTER:
+ case STRING:
+ // assert(fTokenLength > 0);
+ return postFix(fState);
+
+ default:
+ consume();
+ continue;
+ }
+
+ default:
+ if (!fgEmulate && fLast == CARRIAGE_RETURN) {
+ switch (fState) {
+ case SINGLE_LINE_COMMENT:
+ case CHARACTER:
+ case STRING:
+
+ int last;
+ int newState;
+ switch (ch) {
+ case '/':
+ last= SLASH;
+ newState= JAVA;
+ break;
+
+ case '*':
+ last= STAR;
+ newState= JAVA;
+ break;
+
+ case '\'':
+ last= NONE;
+ newState= CHARACTER;
+ break;
+
+ case '"':
+ last= NONE;
+ newState= STRING;
+ break;
+
+ case '\r':
+ last= CARRIAGE_RETURN;
+ newState= JAVA;
+ break;
+
+ case '\\':
+ last= BACKSLASH;
+ newState= JAVA;
+ break;
+
+ default:
+ last= NONE;
+ newState= JAVA;
+ break;
+ }
+
+ fLast= NONE; // ignore fLast
+ return preFix(fState, newState, last, 1);
+
+ default:
+ break;
+ }
+ }
+ }
+
+ // states
+ switch (fState) {
+ case JAVA:
+ switch (ch) {
+ case '/':
+ if (fLast == SLASH) {
+ if (fTokenLength - getLastLength(fLast) > 0) {
+ return preFix(JAVA, SINGLE_LINE_COMMENT, NONE, 2);
+ } else {
+ preFix(JAVA, SINGLE_LINE_COMMENT, NONE, 2);
+ fTokenOffset += fTokenLength;
+ fTokenLength= fPrefixLength;
+ break;
+ }
+
+ } else {
+ fTokenLength++;
+ fLast= SLASH;
+ break;
+ }
+
+ case '*':
+ if (fLast == SLASH) {
+ if (fTokenLength - getLastLength(fLast) > 0)
+ return preFix(JAVA, MULTI_LINE_COMMENT, SLASH_STAR, 2);
+ else {
+ preFix(JAVA, MULTI_LINE_COMMENT, SLASH_STAR, 2);
+ fTokenOffset += fTokenLength;
+ fTokenLength= fPrefixLength;
+ break;
+ }
+
+ } else {
+ consume();
+ break;
+ }
+
+ case '\'':
+ fLast= NONE; // ignore fLast
+ if (fTokenLength > 0)
+ return preFix(JAVA, CHARACTER, NONE, 1);
+ else {
+ preFix(JAVA, CHARACTER, NONE, 1);
+ fTokenOffset += fTokenLength;
+ fTokenLength= fPrefixLength;
+ break;
+ }
+
+ case '"':
+ fLast= NONE; // ignore fLast
+ if (fTokenLength > 0)
+ return preFix(JAVA, STRING, NONE, 1);
+ else {
+ preFix(JAVA, STRING, NONE, 1);
+ fTokenOffset += fTokenLength;
+ fTokenLength= fPrefixLength;
+ break;
+ }
+
+ default:
+ consume();
+ break;
+ }
+ break;
+
+ case SINGLE_LINE_COMMENT:
+ consume();
+ break;
+
+ case JAVADOC:
+ switch (ch) {
+ case '/':
+ switch (fLast) {
+ case SLASH_STAR_STAR:
+ return postFix(MULTI_LINE_COMMENT);
+
+ case STAR:
+ return postFix(JAVADOC);
+
+ default:
+ consume();
+ break;
+ }
+ break;
+
+ case '*':
+ fTokenLength++;
+ fLast= STAR;
+ break;
+
+ default:
+ consume();
+ break;
+ }
+ break;
+
+ case MULTI_LINE_COMMENT:
+ switch (ch) {
+ case '*':
+ if (fLast == SLASH_STAR) {
+ fLast= SLASH_STAR_STAR;
+ fTokenLength++;
+ fState= JAVADOC;
+ } else {
+ fTokenLength++;
+ fLast= STAR;
+ }
+ break;
+
+ case '/':
+ if (fLast == STAR) {
+ return postFix(MULTI_LINE_COMMENT);
+ } else {
+ consume();
+ break;
+ }
+
+ default:
+ consume();
+ break;
+ }
+ break;
+
+ case STRING:
+ switch (ch) {
+ case '\\':
+ fLast= (fLast == BACKSLASH) ? NONE : BACKSLASH;
+ fTokenLength++;
+ break;
+
+ case '\"':
+ if (fLast != BACKSLASH) {
+ return postFix(STRING);
+
+ } else {
+ consume();
+ break;
+ }
+
+ default:
+ consume();
+ break;
+ }
+ break;
+
+ case CHARACTER:
+ switch (ch) {
+ case '\\':
+ fLast= (fLast == BACKSLASH) ? NONE : BACKSLASH;
+ fTokenLength++;
+ break;
+
+ case '\'':
+ if (fLast != BACKSLASH) {
+ return postFix(CHARACTER);
+
+ } else {
+ consume();
+ break;
+ }
+
+ default:
+ consume();
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ private static final int getLastLength(int last) {
+ switch (last) {
+ default:
+ return -1;
+
+ case NONE:
+ return 0;
+
+ case CARRIAGE_RETURN:
+ case BACKSLASH:
+ case SLASH:
+ case STAR:
+ return 1;
+
+ case SLASH_STAR:
+ return 2;
+
+ case SLASH_STAR_STAR:
+ return 3;
+ }
+ }
+
+ private final void consume() {
+ fTokenLength++;
+ fLast= NONE;
+ }
+
+ private final IToken postFix(int state) {
+ fTokenLength++;
+ fLast= NONE;
+ fState= JAVA;
+ fPrefixLength= 0;
+ return fTokens[state];
+ }
+
+ private final IToken preFix(int state, int newState, int last, int prefixLength) {
+ // emulate JavaPartitionScanner
+ if (fgEmulate && state == JAVA && (fTokenLength - getLastLength(fLast) > 0)) {
+ fTokenLength -= getLastLength(fLast);
+ fJavaOffset= fTokenOffset;
+ fJavaLength= fTokenLength;
+ fTokenLength= 1;
+ fState= newState;
+ fPrefixLength= prefixLength;
+ fLast= last;
+ return fTokens[state];
+
+ } else {
+ fTokenLength -= getLastLength(fLast);
+ fLast= last;
+ fPrefixLength= prefixLength;
+ IToken token= fTokens[state];
+ fState= newState;
+ return token;
+ }
+ }
+
+ private static int getState(String contentType) {
+
+ if (contentType == null)
+ return JAVA;
+
+ else if (contentType.equals(JAVA_SINGLE_LINE_COMMENT))
+ return SINGLE_LINE_COMMENT;
+
+ else if (contentType.equals(JAVA_MULTI_LINE_COMMENT))
+ return MULTI_LINE_COMMENT;
+
+ else if (contentType.equals(JAVA_DOC))
+ return JAVADOC;
+
+ else if (contentType.equals(JAVA_STRING))
+ return STRING;
+
+ else if (contentType.equals(SKIP))
+ return CHARACTER;
+
+ else
+ return JAVA;
+ }
+
+ /*
+ * @see IPartitionTokenScanner#setPartialRange(IDocument, int, int, String, int)
+ */
+ public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) {
+
+ fScanner.setRange(document, offset, length);
+ fTokenOffset= partitionOffset;
+ fTokenLength= 0;
+ fPrefixLength= offset - partitionOffset;
+ fLast= NONE;
+
+ if (offset == partitionOffset) {
+ // restart at beginning of partition
+ fState= JAVA;
+ } else {
+ fState= getState(contentType);
+ }
+
+ // emulate JavaPartitionScanner
+ if (fgEmulate) {
+ fJavaOffset= -1;
+ fJavaLength= 0;
+ }
+ }
+
+ /*
+ * @see ITokenScanner#setRange(IDocument, int, int)
+ */
+ public void setRange(IDocument document, int offset, int length) {
+
+ fScanner.setRange(document, offset, length);
+ fTokenOffset= offset;
+ fTokenLength= 0;
+ fPrefixLength= 0;
+ fLast= NONE;
+ fState= JAVA;
+
+ // emulate JavaPartitionScanner
+ if (fgEmulate) {
+ fJavaOffset= -1;
+ fJavaLength= 0;
+ }
+ }
+
+ /*
+ * @see ITokenScanner#getTokenLength()
+ */
+ public int getTokenLength() {
+ return fTokenLength;
+ }
+
+ /*
+ * @see ITokenScanner#getTokenOffset()
+ */
+ public int getTokenOffset() {
+ return fTokenOffset;
+ }
+
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/HTML2TextReader.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/HTML2TextReader.java
new file mode 100644
index 0000000..e9cb748
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/HTML2TextReader.java
@@ -0,0 +1,296 @@
+package net.sourceforge.phpdt.internal.ui.text;
+
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+
+import java.io.IOException;
+import java.io.PushbackReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import net.sourceforge.phpdt.internal.ui.PHPUIMessages;
+
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+
+
+
+
+/**
+ * Reads the text contents from a reader of HTML contents and translates
+ * the tags or cut them out.
+ */
+public class HTML2TextReader extends SubstitutionTextReader {
+
+
+ private static final String LINE_DELIM= System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ private static final String EMPTY_STRING= ""; //$NON-NLS-1$
+ private static final Map fgEntityLookup;
+ private static final Set fgTags;
+
+ static {
+
+ fgTags= new HashSet();
+ fgTags.add("b"); //$NON-NLS-1$
+ fgTags.add("br"); //$NON-NLS-1$
+ fgTags.add("h5"); //$NON-NLS-1$
+ fgTags.add("p"); //$NON-NLS-1$
+ fgTags.add("dl"); //$NON-NLS-1$
+ fgTags.add("dt"); //$NON-NLS-1$
+ fgTags.add("dd"); //$NON-NLS-1$
+ fgTags.add("li"); //$NON-NLS-1$
+ fgTags.add("ul"); //$NON-NLS-1$
+ fgTags.add("pre"); //$NON-NLS-1$
+
+ fgEntityLookup= new HashMap(7);
+ fgEntityLookup.put("lt", "<"); //$NON-NLS-1$ //$NON-NLS-2$
+ fgEntityLookup.put("gt", ">"); //$NON-NLS-1$ //$NON-NLS-2$
+ fgEntityLookup.put("nbsp", " "); //$NON-NLS-1$ //$NON-NLS-2$
+ fgEntityLookup.put("amp", "&"); //$NON-NLS-1$ //$NON-NLS-2$
+ fgEntityLookup.put("circ", "^"); //$NON-NLS-1$ //$NON-NLS-2$
+ fgEntityLookup.put("tilde", "~"); //$NON-NLS-2$ //$NON-NLS-1$
+ fgEntityLookup.put("quot", "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private int fCounter= 0;
+ private TextPresentation fTextPresentation;
+ private int fBold= 0;
+ private int fStartOffset= -1;
+ private boolean fInParagraph= false;
+ private boolean fIsPreformattedText= false;
+
+ /**
+ * Transforms the html text from the reader to formatted text.
+ * @param presentation If not null
, formattings will be applied to
+ * the presentation.
+ */
+ public HTML2TextReader(Reader reader, TextPresentation presentation) {
+ super(new PushbackReader(reader));
+ fTextPresentation= presentation;
+ }
+
+ public int read() throws IOException {
+ int c= super.read();
+ if (c != -1)
+ ++ fCounter;
+ return c;
+ }
+
+ protected void startBold() {
+ if (fBold == 0)
+ fStartOffset= fCounter;
+ ++ fBold;
+ }
+
+ protected void startPreformattedText() {
+ fIsPreformattedText= true;
+ setSkipWhitespace(false);
+ }
+
+ protected void stopPreformattedText() {
+ fIsPreformattedText= false;
+ setSkipWhitespace(true);
+ }
+
+ protected void stopBold() {
+ -- fBold;
+ if (fBold == 0) {
+ if (fTextPresentation != null) {
+ fTextPresentation.addStyleRange(new StyleRange(fStartOffset, fCounter - fStartOffset, null, null, SWT.BOLD));
+ }
+ fStartOffset= -1;
+ }
+ }
+
+ /**
+ * @see SubstitutionTextReader#computeSubstitution(char)
+ */
+ protected String computeSubstitution(int c) throws IOException {
+
+ if (c == '<')
+ return processHTMLTag();
+ else if (c == '&')
+ return processEntity();
+ else if (fIsPreformattedText)
+ return processPreformattedText(c);
+
+ return null;
+ }
+
+ private String html2Text(String html) {
+
+ String tag= html;
+ if ('/' == tag.charAt(0))
+ tag= tag.substring(1);
+
+ if (!fgTags.contains(tag))
+ return EMPTY_STRING;
+
+
+ if ("pre".equals(html)) { //$NON-NLS-1$
+ startPreformattedText();
+ return EMPTY_STRING;
+ }
+
+ if ("/pre".equals(html)) { //$NON-NLS-1$
+ stopPreformattedText();
+ return EMPTY_STRING;
+ }
+
+ if (fIsPreformattedText)
+ return EMPTY_STRING;
+
+ if ("b".equals(html)) { //$NON-NLS-1$
+ startBold();
+ return EMPTY_STRING;
+ }
+
+ if ("h5".equals(html) || "dt".equals(html)) { //$NON-NLS-1$ //$NON-NLS-2$
+ startBold();
+ return EMPTY_STRING;
+ }
+
+ if ("dl".equals(html)) //$NON-NLS-1$
+ return LINE_DELIM;
+
+ if ("dd".equals(html)) //$NON-NLS-1$
+ return "\t"; //$NON-NLS-1$
+
+ if ("li".equals(html)) //$NON-NLS-1$
+ return LINE_DELIM + "\t" + PHPUIMessages.getString("HTML2TextReader.dash"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if ("/b".equals(html)) { //$NON-NLS-1$
+ stopBold();
+ return EMPTY_STRING;
+ }
+
+ if ("p".equals(html)) { //$NON-NLS-1$
+ fInParagraph= true;
+ return LINE_DELIM;
+ }
+
+ if ("br".equals(html)) //$NON-NLS-1$
+ return LINE_DELIM;
+
+ if ("/p".equals(html)) { //$NON-NLS-1$
+ boolean inParagraph= fInParagraph;
+ fInParagraph= false;
+ return inParagraph ? EMPTY_STRING : LINE_DELIM;
+ }
+
+ if ("/h5".equals(html) || "/dt".equals(html)) { //$NON-NLS-1$ //$NON-NLS-2$
+ stopBold();
+ return LINE_DELIM;
+ }
+
+ if ("/dd".equals(html)) //$NON-NLS-1$
+ return LINE_DELIM;
+
+ return EMPTY_STRING;
+ }
+
+ /*
+ * A '<' has been read. Process a html tag
+ */
+ private String processHTMLTag() throws IOException {
+
+ StringBuffer buf= new StringBuffer();
+ int ch;
+ do {
+
+ ch= nextChar();
+
+ while (ch != -1 && ch != '>') {
+ buf.append(Character.toLowerCase((char) ch));
+ ch= nextChar();
+ if (ch == '"'){
+ buf.append(Character.toLowerCase((char) ch));
+ ch= nextChar();
+ while (ch != -1 && ch != '"'){
+ buf.append(Character.toLowerCase((char) ch));
+ ch= nextChar();
+ }
+ }
+ if (ch == '<'){
+ unread(ch);
+ return '<' + buf.toString();
+ }
+ }
+
+ if (ch == -1)
+ return null;
+
+ int tagLen= buf.length();
+ // needs special treatment for comments
+ if ((tagLen >= 3 && "!--".equals(buf.substring(0, 3))) //$NON-NLS-1$
+ && !(tagLen >= 5 && "--!".equals(buf.substring(tagLen - 3)))) { //$NON-NLS-1$
+ // unfinished comment
+ buf.append(ch);
+ } else {
+ break;
+ }
+ } while (true);
+
+ return html2Text(buf.toString());
+ }
+
+ private String processPreformattedText(int c) {
+ if (c == '\r' || c == '\n')
+ fCounter++;
+ return null;
+ }
+
+
+ private void unread(int ch) throws IOException {
+ ((PushbackReader) getReader()).unread(ch);
+ }
+
+ protected String entity2Text(String symbol) {
+ if (symbol.length() > 1 && symbol.charAt(0) == '#') {
+ int ch;
+ try {
+ if (symbol.charAt(1) == 'x') {
+ ch= Integer.parseInt(symbol.substring(2), 16);
+ } else {
+ ch= Integer.parseInt(symbol.substring(1), 10);
+ }
+ return EMPTY_STRING + (char)ch;
+ } catch (NumberFormatException e) {
+ }
+ } else {
+ String str= (String) fgEntityLookup.get(symbol);
+ if (str != null) {
+ return str;
+ }
+ }
+ return "&" + symbol; // not found //$NON-NLS-1$
+ }
+
+ /*
+ * A '&' has been read. Process a entity
+ */
+ private String processEntity() throws IOException {
+ StringBuffer buf= new StringBuffer();
+ int ch= nextChar();
+ while (Character.isLetterOrDigit((char)ch) || ch == '#') {
+ buf.append((char) ch);
+ ch= nextChar();
+ }
+
+ if (ch == ';')
+ return entity2Text(buf.toString());
+
+ buf.insert(0, '&');
+ if (ch != -1)
+ buf.append((char) ch);
+ return buf.toString();
+ }
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/HTMLTextPresenter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/HTMLTextPresenter.java
new file mode 100644
index 0000000..dc9587a
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/HTMLTextPresenter.java
@@ -0,0 +1,188 @@
+package net.sourceforge.phpdt.internal.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Iterator;
+
+import net.sourceforge.phpdt.internal.ui.PHPUIMessages;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Display;
+
+
+
+
+public class HTMLTextPresenter implements DefaultInformationControl.IInformationPresenter {
+
+ private static final String LINE_DELIM= System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private int fCounter;
+ private boolean fEnforceUpperLineLimit;
+
+ public HTMLTextPresenter(boolean enforceUpperLineLimit) {
+ super();
+ fEnforceUpperLineLimit= enforceUpperLineLimit;
+ }
+
+ public HTMLTextPresenter() {
+ this(true);
+ }
+
+ protected Reader createReader(String hoverInfo, TextPresentation presentation) {
+ return new HTML2TextReader(new StringReader(hoverInfo), presentation);
+ }
+
+ protected void adaptTextPresentation(TextPresentation presentation, int offset, int insertLength) {
+
+ int yoursStart= offset;
+ int yoursEnd= offset + insertLength -1;
+ yoursEnd= Math.max(yoursStart, yoursEnd);
+
+ Iterator e= presentation.getAllStyleRangeIterator();
+ while (e.hasNext()) {
+
+ StyleRange range= (StyleRange) e.next();
+
+ int myStart= range.start;
+ int myEnd= range.start + range.length -1;
+ myEnd= Math.max(myStart, myEnd);
+
+ if (myEnd < yoursStart)
+ continue;
+
+ if (myStart < yoursStart)
+ range.length += insertLength;
+ else
+ range.start += insertLength;
+ }
+ }
+
+ private void append(StringBuffer buffer, String string, TextPresentation presentation) {
+
+ int length= string.length();
+ buffer.append(string);
+
+ if (presentation != null)
+ adaptTextPresentation(presentation, fCounter, length);
+
+ fCounter += length;
+ }
+
+ private String getIndent(String line) {
+ int length= line.length();
+
+ int i= 0;
+ while (i < length && Character.isWhitespace(line.charAt(i))) ++i;
+
+ return (i == length ? line : line.substring(0, i)) + " "; //$NON-NLS-1$
+ }
+
+ /*
+ * @see IHoverInformationPresenter#updatePresentation(Display display, String, TextPresentation, int, int)
+ */
+ public String updatePresentation(Display display, String hoverInfo, TextPresentation presentation, int maxWidth, int maxHeight) {
+
+ if (hoverInfo == null)
+ return null;
+
+ GC gc= new GC(display);
+ try {
+
+ StringBuffer buffer= new StringBuffer();
+ int maxNumberOfLines= Math.round(maxHeight / gc.getFontMetrics().getHeight());
+
+ fCounter= 0;
+ LineBreakingReader reader= new LineBreakingReader(createReader(hoverInfo, presentation), gc, maxWidth);
+
+ boolean lastLineFormatted= false;
+ String lastLineIndent= null;
+
+ String line=reader.readLine();
+ boolean lineFormatted= reader.isFormattedLine();
+ boolean firstLineProcessed= false;
+
+ while (line != null) {
+
+ if (fEnforceUpperLineLimit && maxNumberOfLines <= 0)
+ break;
+
+ if (firstLineProcessed) {
+ if (!lastLineFormatted)
+ append(buffer, LINE_DELIM, null);
+ else {
+ append(buffer, LINE_DELIM, presentation);
+ if (lastLineIndent != null)
+ append(buffer, lastLineIndent, presentation);
+ }
+ }
+
+ append(buffer, line, null);
+ firstLineProcessed= true;
+
+ lastLineFormatted= lineFormatted;
+ if (!lineFormatted)
+ lastLineIndent= null;
+ else if (lastLineIndent == null)
+ lastLineIndent= getIndent(line);
+
+ line= reader.readLine();
+ lineFormatted= reader.isFormattedLine();
+
+ maxNumberOfLines--;
+ }
+
+ if (line != null) {
+ append(buffer, LINE_DELIM, lineFormatted ? presentation : null);
+ append(buffer, PHPUIMessages.getString("HTMLTextPresenter.ellipsis"), presentation); //$NON-NLS-1$
+ }
+
+ return trim(buffer, presentation);
+
+ } catch (IOException e) {
+
+ PHPeclipsePlugin.log(e);
+ return null;
+
+ } finally {
+ gc.dispose();
+ }
+ }
+
+ private String trim(StringBuffer buffer, TextPresentation presentation) {
+
+ int length= buffer.length();
+
+ int end= length -1;
+ while (end >= 0 && Character.isWhitespace(buffer.charAt(end)))
+ -- end;
+
+ if (end == -1)
+ return ""; //$NON-NLS-1$
+
+ if (end < length -1)
+ buffer.delete(end + 1, length);
+ else
+ end= length;
+
+ int start= 0;
+ while (start < end && Character.isWhitespace(buffer.charAt(start)))
+ ++ start;
+
+ buffer.delete(0, start);
+ presentation.setResultWindow(new Region(start, buffer.length()));
+ return buffer.toString();
+ }
+}
+
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/JavaColorManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/JavaColorManager.java
new file mode 100644
index 0000000..69d31c5
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/JavaColorManager.java
@@ -0,0 +1,105 @@
+package net.sourceforge.phpdt.internal.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+import net.sourceforge.phpdt.ui.text.IColorManager;
+import net.sourceforge.phpdt.ui.text.IColorManagerExtension;
+
+/**
+ * Java color manager.
+ */
+public class JavaColorManager implements IColorManager, IColorManagerExtension {
+
+ protected Map fKeyTable= new HashMap(10);
+ protected Map fDisplayTable= new HashMap(2);
+
+
+ public JavaColorManager() {
+ }
+
+ private void dispose(Display display) {
+ Map colorTable= (Map) fDisplayTable.get(display);
+ if (colorTable != null) {
+ Iterator e= colorTable.values().iterator();
+ while (e.hasNext())
+ ((Color) e.next()).dispose();
+ }
+ }
+
+ /*
+ * @see IColorManager#getColor(RGB)
+ */
+ public Color getColor(RGB rgb) {
+
+ if (rgb == null)
+ return null;
+
+ final Display display= Display.getCurrent();
+ Map colorTable= (Map) fDisplayTable.get(display);
+ if (colorTable == null) {
+ colorTable= new HashMap(10);
+ fDisplayTable.put(display, colorTable);
+ display.disposeExec(new Runnable() {
+ public void run() {
+ dispose(display);
+ }
+ });
+ }
+
+ Color color= (Color) colorTable.get(rgb);
+ if (color == null) {
+ color= new Color(Display.getCurrent(), rgb);
+ colorTable.put(rgb, color);
+ }
+
+ return color;
+ }
+
+ /*
+ * @see IColorManager#dispose
+ */
+ public void dispose() {
+ // nothing to dispose
+ }
+
+ /*
+ * @see IColorManager#getColor(String)
+ */
+ public Color getColor(String key) {
+
+ if (key == null)
+ return null;
+
+ RGB rgb= (RGB) fKeyTable.get(key);
+ return getColor(rgb);
+ }
+
+ /*
+ * @see IColorManagerExtension#bindColor(String, RGB)
+ */
+ public void bindColor(String key, RGB rgb) {
+ Object value= fKeyTable.get(key);
+ if (value != null)
+ throw new UnsupportedOperationException();
+
+ fKeyTable.put(key, rgb);
+ }
+
+ /*
+ * @see IColorManagerExtension#unbindColor(String)
+ */
+ public void unbindColor(String key) {
+ fKeyTable.remove(key);
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java
new file mode 100644
index 0000000..ce4a46d
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java
@@ -0,0 +1,108 @@
+package net.sourceforge.phpdt.internal.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import java.text.BreakIterator;
+import org.eclipse.swt.graphics.GC;
+
+/*
+ * Not a real reader. Could change if requested
+ */
+public class LineBreakingReader {
+
+ private BufferedReader fReader;
+ private GC fGC;
+ private int fMaxWidth;
+
+ private String fLine;
+ private int fOffset;
+
+ private BreakIterator fLineBreakIterator;
+
+ /**
+ * Creates a reader that breaks an input text to fit in a given width.
+ * @param reader Reader of the input text
+ * @param gc The graphic context that defines the currently used font sizes
+ * @param maxLineWidth The max width (pixes) where the text has to fit in
+ */
+ public LineBreakingReader(Reader reader, GC gc, int maxLineWidth) {
+ fReader= new BufferedReader(reader);
+ fGC= gc;
+ fMaxWidth= maxLineWidth;
+ fOffset= 0;
+ fLine= null;
+ fLineBreakIterator= BreakIterator.getLineInstance();
+ }
+
+ public boolean isFormattedLine() {
+ return fLine != null;
+ }
+
+ /**
+ * Reads the next line. The lengths of the line will not exceed the gived maximum
+ * width.
+ */
+ public String readLine() throws IOException {
+ if (fLine == null) {
+ String line= fReader.readLine();
+ if (line == null)
+ return null;
+
+ int lineLen= fGC.textExtent(line).x;
+ if (lineLen < fMaxWidth) {
+ return line;
+ }
+ fLine= line;
+ fLineBreakIterator.setText(line);
+ fOffset= 0;
+ }
+ int breakOffset= findNextBreakOffset(fOffset);
+ String res;
+ if (breakOffset != BreakIterator.DONE) {
+ res= fLine.substring(fOffset, breakOffset);
+ fOffset= findWordBegin(breakOffset);
+ if (fOffset == fLine.length()) {
+ fLine= null;
+ }
+ } else {
+ res= fLine.substring(fOffset);
+ fLine= null;
+ }
+ return res;
+ }
+
+ private int findNextBreakOffset(int currOffset) {
+ int currWidth= 0;
+ int nextOffset= fLineBreakIterator.following(currOffset);
+ while (nextOffset != BreakIterator.DONE) {
+ String word= fLine.substring(currOffset, nextOffset);
+ int wordWidth= fGC.textExtent(word).x;
+ int nextWidth= wordWidth + currWidth;
+ if (nextWidth > fMaxWidth) {
+ if (currWidth > 0) {
+ return currOffset;
+ } else {
+ return nextOffset;
+ }
+ }
+ currWidth= nextWidth;
+ currOffset= nextOffset;
+ nextOffset= fLineBreakIterator.next();
+ }
+ return nextOffset;
+ }
+
+ private int findWordBegin(int idx) {
+ while (idx < fLine.length() && Character.isWhitespace(fLine.charAt(idx))) {
+ idx++;
+ }
+ return idx;
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/SubstitutionTextReader.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/SubstitutionTextReader.java
new file mode 100644
index 0000000..7570e05
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/SubstitutionTextReader.java
@@ -0,0 +1,153 @@
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+**********************************************************************/
+
+package net.sourceforge.phpdt.internal.ui.text;
+
+
+import java.io.IOException;
+import java.io.Reader;
+
+import net.sourceforge.phpdt.internal.corext.phpdoc.SingleCharReader;
+
+
+/**
+ * Reads the text contents from a reader and computes for each character
+ * a potential substitution. The substitution may eat more characters than
+ * only the one passed into the computation routine.
+ */
+public abstract class SubstitutionTextReader extends SingleCharReader {
+
+ protected static final String LINE_DELIM= System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private Reader fReader;
+ private boolean fWasWhiteSpace;
+ private int fCharAfterWhiteSpace;
+
+ /**
+ * Tells whether white space characters are skipped.
+ */
+ private boolean fSkipWhiteSpace= true;
+
+ private boolean fReadFromBuffer;
+ private StringBuffer fBuffer;
+ private int fIndex;
+
+
+ protected SubstitutionTextReader(Reader reader) {
+ fReader= reader;
+ fBuffer= new StringBuffer();
+ fIndex= 0;
+ fReadFromBuffer= false;
+ fCharAfterWhiteSpace= -1;
+ fWasWhiteSpace= true;
+ }
+
+ /**
+ * Implement to compute the substitution for the given character and
+ * if necessary subsequent characters. Use nextChar
+ * to read subsequent characters.
+ */
+ protected abstract String computeSubstitution(int c) throws IOException;
+
+ /**
+ * Returns the internal reader.
+ */
+ protected Reader getReader() {
+ return fReader;
+ }
+
+ /**
+ * Returns the next character.
+ */
+ protected int nextChar() throws IOException {
+ fReadFromBuffer= (fBuffer.length() > 0);
+ if (fReadFromBuffer) {
+ char ch= fBuffer.charAt(fIndex++);
+ if (fIndex >= fBuffer.length()) {
+ fBuffer.setLength(0);
+ fIndex= 0;
+ }
+ return ch;
+ } else {
+ int ch= fCharAfterWhiteSpace;
+ if (ch == -1) {
+ ch= fReader.read();
+ }
+ if (fSkipWhiteSpace && Character.isWhitespace((char)ch)) {
+ do {
+ ch= fReader.read();
+ } while (Character.isWhitespace((char)ch));
+ if (ch != -1) {
+ fCharAfterWhiteSpace= ch;
+ return ' ';
+ }
+ } else {
+ fCharAfterWhiteSpace= -1;
+ }
+ return ch;
+ }
+ }
+
+ /**
+ * @see Reader#read()
+ */
+ public int read() throws IOException {
+ int c;
+ do {
+
+ c= nextChar();
+ while (!fReadFromBuffer) {
+ String s= computeSubstitution(c);
+ if (s == null)
+ break;
+ if (s.length() > 0)
+ fBuffer.insert(0, s);
+ c= nextChar();
+ }
+
+ } while (fSkipWhiteSpace && fWasWhiteSpace && (c == ' '));
+ fWasWhiteSpace= (c == ' ' || c == '\r' || c == '\n');
+ return c;
+ }
+
+ /**
+ * @see Reader#ready()
+ */
+ public boolean ready() throws IOException {
+ return fReader.ready();
+ }
+
+ /**
+ * @see Reader#close()
+ */
+ public void close() throws IOException {
+ fReader.close();
+ }
+
+ /**
+ * @see Reader#reset()
+ */
+ public void reset() throws IOException {
+ fReader.reset();
+ fWasWhiteSpace= true;
+ fCharAfterWhiteSpace= -1;
+ fBuffer.setLength(0);
+ fIndex= 0;
+ }
+
+ protected final void setSkipWhitespace(boolean state) {
+ fSkipWhiteSpace= state;
+ }
+
+ protected final boolean isSkippingWhitespace() {
+ return fSkipWhiteSpace;
+ }
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/IReconcilingParticipant.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/IReconcilingParticipant.java
new file mode 100644
index 0000000..96f9563
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/IReconcilingParticipant.java
@@ -0,0 +1,19 @@
+package net.sourceforge.phpdt.internal.ui.text.java;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+
+
+/**
+ * Interface of an object participating in reconciling.
+ */
+public interface IReconcilingParticipant {
+
+ /**
+ * Called after reconciling has been finished.
+ */
+ void reconciled();
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionListener.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionListener.java
index 3d19ac4..08fab6e 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionListener.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionListener.java
@@ -1,7 +1,14 @@
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+**********************************************************************/
+
package net.sourceforge.phpdt.internal.ui.text.link;
import org.eclipse.jface.text.Position;
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionManager.java
index 425891b..0745ef7 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionManager.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionManager.java
@@ -1,7 +1,14 @@
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+**********************************************************************/
+
package net.sourceforge.phpdt.internal.ui.text.link;
import java.util.Arrays;
@@ -13,7 +20,9 @@ import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DocumentCommand;
import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension;
import org.eclipse.jface.text.IDocumentListener;
@@ -22,7 +31,6 @@ import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.TypedPosition;
import org.eclipse.jface.util.Assert;
-//import org.eclipse.jdt.internal.ui.JavaPlugin;
/**
* This class manages linked positions in a document. Positions are linked
@@ -42,20 +50,17 @@ import org.eclipse.jface.util.Assert;
* gain control of the same document.
*
*/
-public class LinkedPositionManager implements IDocumentListener, IPositionUpdater {
-
- private static class PositionComparator implements Comparator {
- /*
- * @see Comparator#compare(Object, Object)
- */
- public int compare(Object object0, Object object1) {
- Position position0= (Position) object0;
- Position position1= (Position) object1;
-
- return position0.getOffset() - position1.getOffset();
- }
- }
-
+public class LinkedPositionManager implements IDocumentListener, IPositionUpdater, IAutoEditStrategy {
+
+ // This class still exists to properly handle code assist.
+ // This is due to the fact that it cannot be distinguished betweeen document changes which are
+ // issued by code assist and document changes which origin from another text viewer.
+ // There is a conflict in interest since in the latter case the linked mode should be left, but in the former case
+ // the linked mode should remain.
+ // To support content assist, document changes have to be propagated to connected positions
+ // by registering replace commands using IDocumentExtension.
+ // if it wasn't for the support of content assist, the documentChanged() method could be reduced to
+ // a simple call to leave(true)
private class Replace implements IDocumentExtension.IReplace {
private Position fReplacePosition;
@@ -81,6 +86,18 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
document.addDocumentListener(owner);
}
}
+
+ private static class PositionComparator implements Comparator {
+ /*
+ * @see Comparator#compare(Object, Object)
+ */
+ public int compare(Object object0, Object object1) {
+ Position position0= (Position) object0;
+ Position position1= (Position) object1;
+
+ return position0.getOffset() - position1.getOffset();
+ }
+ }
private static final String LINKED_POSITION= "LinkedPositionManager.linked.position"; //$NON-NLS-1$
private static final Comparator fgPositionComparator= new PositionComparator();
@@ -140,7 +157,7 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
try {
fDocument.addPosition(LINKED_POSITION, new TypedPosition(offset, length, type));
} catch (BadPositionCategoryException e) {
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
Assert.isTrue(false);
}
}
@@ -184,11 +201,11 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
fDocument.removePositionCategory(LINKED_POSITION);
} catch (BadLocationException e) {
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
Assert.isTrue(false);
} catch (BadPositionCategoryException e) {
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
Assert.isTrue(false);
} finally {
@@ -198,6 +215,24 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
}
/**
+ * Returns the position at the given offset, null
if there is no position.
+ * @since 2.1
+ */
+ public Position getPosition(int offset) {
+ Position[] positions= getPositions(fDocument);
+ if (positions == null)
+ return null;
+
+ for (int i= positions.length - 1; i >= 0; i--) {
+ Position position= positions[i];
+ if (offset >= position.getOffset() && offset <= position.getOffset() + position.getLength())
+ return positions[i];
+ }
+
+ return null;
+ }
+
+ /**
* Returns the first linked position.
*
* @return returns null
if no linked position exist.
@@ -242,17 +277,20 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
* @return returns null
if no linked position exist.
*/
public Position getPreviousPosition(int offset) {
- Position[] positions= getPositions(fDocument);
+ Position[] positions= getPositions(fDocument);
if (positions == null)
return null;
+ TypedPosition currentPosition= (TypedPosition) findCurrentPosition(positions, offset);
+ String currentType= currentPosition == null ? null : currentPosition.getType();
+
Position lastPosition= null;
Position position= getFirstPosition();
-
- while ((position != null) && (position.getOffset() < offset)) {
+
+ while ((position != null) && (position.getOffset() < offset) && !((TypedPosition) position).getType().equals(currentType)) {
lastPosition= position;
position= findNextPosition(positions, position.getOffset());
- }
+ }
return lastPosition;
}
@@ -264,7 +302,7 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
return positions;
} catch (BadPositionCategoryException e) {
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
Assert.isTrue(false);
}
@@ -303,29 +341,21 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
* @see IDocumentListener#documentAboutToBeChanged(DocumentEvent)
*/
public void documentAboutToBeChanged(DocumentEvent event) {
+
IDocument document= event.getDocument();
Position[] positions= getPositions(document);
- Position position= findCurrentEditablePosition(positions, event.getOffset());
+ Position position= findCurrentPosition(positions, event.getOffset());
// modification outside editable position
if (position == null) {
- position= findCurrentPosition(positions, event.getOffset());
-
- // modification outside any position
- if (position == null) {
- // check for destruction of constraints (spacing of at least 1)
- if ((event.getText().length() == 0) &&
- (findCurrentPosition(positions, event.getOffset()) != null) &&
- (findCurrentPosition(positions, event.getOffset() + event.getLength()) != null))
- {
- leave(true);
- }
-
- // modification intersects non-editable position
- } else {
+ // check for destruction of constraints (spacing of at least 1)
+ if ((event.getText() == null || event.getText().length() == 0) &&
+ (findCurrentPosition(positions, event.getOffset()) != null) &&
+ (findCurrentPosition(positions, event.getOffset() + event.getLength()) != null))
+ {
leave(true);
- }
+ }
// modification intersects editable position
} else {
@@ -344,11 +374,15 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
/*
* @see IDocumentListener#documentChanged(DocumentEvent)
*/
- public void documentChanged(DocumentEvent event) {
+ public void documentChanged(DocumentEvent event) {
+
+ // have to handle code assist, so can't just leave the linked mode
+ // leave(true);
+
IDocument document= event.getDocument();
Position[] positions= getPositions(document);
- TypedPosition currentPosition= (TypedPosition) findCurrentEditablePosition(positions, event.getOffset());
+ TypedPosition currentPosition= (TypedPosition) findCurrentPosition(positions, event.getOffset());
// ignore document changes (assume it won't invalidate constraints)
if (currentPosition == null)
@@ -356,9 +390,11 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
int deltaOffset= event.getOffset() - currentPosition.getOffset();
- if (fListener != null)
- fListener.setCurrentPosition(currentPosition, deltaOffset + event.getText().length());
-
+ if (fListener != null) {
+ int length= event.getText() == null ? 0 : event.getText().length();
+ fListener.setCurrentPosition(currentPosition, deltaOffset + length);
+ }
+
for (int i= 0; i != positions.length; i++) {
TypedPosition p= (TypedPosition) positions[i];
@@ -373,7 +409,7 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
* @see IPositionUpdater#update(DocumentEvent)
*/
public void update(DocumentEvent event) {
- int deltaLength= event.getText().length() - event.getLength();
+ int deltaLength= (event.getText() == null ? 0 : event.getText().length()) - event.getLength();
Position[] positions= getPositions(event.getDocument());
TypedPosition currentPosition= (TypedPosition) findCurrentPosition(positions, event.getOffset());
@@ -414,16 +450,11 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
return null;
}
- private static Position findCurrentEditablePosition(Position[] positions, int offset) {
- Position position= positions[0];
-
- while ((position != null) && !includes(position, offset, 0))
- position= findNextPosition(positions, position.getOffset());
-
- return position;
- }
-
private boolean containsLineDelimiters(String string) {
+
+ if (string == null)
+ return false;
+
String[] delimiters= fDocument.getLegalLineDelimiters();
for (int i= 0; i != delimiters.length; i++)
@@ -439,11 +470,55 @@ public class LinkedPositionManager implements IDocumentListener, IPositionUpdate
public boolean anyPositionIncludes(int offset, int length) {
Position[] positions= getPositions(fDocument);
- Position position= findCurrentEditablePosition(positions, offset);
+ Position position= findCurrentPosition(positions, offset);
if (position == null)
return false;
return includes(position, offset, length);
}
-}
+ /*
+ * @see org.eclipse.jface.text.IAutoIndentStrategy#customizeDocumentCommand(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.DocumentCommand)
+ */
+ public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
+
+ // don't interfere with preceding auto edit strategies
+ if (command.getCommandCount() != 1) {
+ leave(true);
+ return;
+ }
+
+ Position[] positions= getPositions(document);
+ TypedPosition currentPosition= (TypedPosition) findCurrentPosition(positions, command.offset);
+
+ // handle edits outside of a position
+ if (currentPosition == null) {
+ leave(true);
+ return;
+ }
+
+ if (! command.doit)
+ return;
+
+ command.doit= false;
+ command.owner= this;
+ command.caretOffset= command.offset + command.length;
+
+ int deltaOffset= command.offset - currentPosition.getOffset();
+
+ if (fListener != null)
+ fListener.setCurrentPosition(currentPosition, deltaOffset + command.text.length());
+
+ for (int i= 0; i != positions.length; i++) {
+ TypedPosition position= (TypedPosition) positions[i];
+
+ try {
+ if (position.getType().equals(currentPosition.getType()) && !position.equals(currentPosition))
+ command.addCommand(position.getOffset() + deltaOffset, command.length, command.text, this);
+ } catch (BadLocationException e) {
+ PHPeclipsePlugin.log(e);
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionUI.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionUI.java
index be32c18..d02d674 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionUI.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/link/LinkedPositionUI.java
@@ -6,6 +6,8 @@ package net.sourceforge.phpdt.internal.ui.text.link;
import java.lang.reflect.InvocationTargetException;
+import net.sourceforge.phpdt.internal.ui.util.ExceptionHandler;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.core.runtime.CoreException;
@@ -19,10 +21,14 @@ import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IPositionUpdater;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.ITextViewerExtension;
+import org.eclipse.jface.text.ITextViewerExtension2;
+import org.eclipse.jface.text.ITextViewerExtension3;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
@@ -33,6 +39,8 @@ import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Color;
@@ -46,7 +54,7 @@ import org.eclipse.swt.widgets.Shell;
* A user interface for LinkedPositionManager
, using ITextViewer
.
*/
public class LinkedPositionUI implements LinkedPositionListener,
- ITextInputListener, ModifyListener, VerifyListener, VerifyKeyListener, PaintListener, IPropertyChangeListener {
+ ITextInputListener, ITextListener, ModifyListener, VerifyListener, VerifyKeyListener, PaintListener, IPropertyChangeListener, ShellListener {
/**
* A listener for notification when the user cancelled the edit operation.
@@ -55,13 +63,24 @@ public class LinkedPositionUI implements LinkedPositionListener,
void exit(boolean accept);
}
- /** Preference key for linked position color */
- // public final static String LINKED_POSITION_COLOR= "_linkedPositionColor"; //$NON-NLS-1$
+ public static class ExitFlags {
+ public int flags;
+ public boolean doit;
+ public ExitFlags(int flags, boolean doit) {
+ this.flags= flags;
+ this.doit= doit;
+ }
+ }
+
+ public interface ExitPolicy {
+ ExitFlags doExit(LinkedPositionManager manager, VerifyEvent event, int offset, int length);
+ }
+
// leave flags
private static final int UNINSTALL= 1; // uninstall linked position manager
- private static final int COMMIT= 2; // commit changes
+ public static final int COMMIT= 2; // commit changes
private static final int DOCUMENT_CHANGED= 4; // document has changed
- private static final int UPDATE_CARET= 8; // update caret
+ public static final int UPDATE_CARET= 8; // update caret
private static final String CARET_POSITION= "LinkedPositionUI.caret.position"; //$NON-NLS-1$
private static final IPositionUpdater fgUpdater= new DefaultPositionUpdater(CARET_POSITION);
@@ -74,10 +93,16 @@ public class LinkedPositionUI implements LinkedPositionListener,
private int fFinalCaretOffset= -1; // no final caret offset
private Position fFramePosition;
+ private int fInitialOffset= -1;
private int fCaretOffset;
+ private ExitPolicy fExitPolicy;
private ExitListener fExitListener;
+ private boolean fNeedRedraw;
+
+ private String fContentType;
+
/**
* Creates a user interface for LinkedPositionManager
.
*
@@ -100,8 +125,7 @@ public class LinkedPositionUI implements LinkedPositionListener,
* @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
- // if (event.getProperty().equals(CompilationUnitEditor.LINKED_POSITION_COLOR)) {
- if (event.getProperty().equals(PHPeclipsePlugin.LINKED_POSITION_COLOR)) {
+ if (event.getProperty().equals(PreferenceConstants.EDITOR_LINKED_POSITION_COLOR)) {
initializeHighlightColor(fViewer);
redrawRegion();
}
@@ -115,9 +139,8 @@ public class LinkedPositionUI implements LinkedPositionListener,
StyledText text= viewer.getTextWidget();
if (text != null) {
Display display= text.getDisplay();
- // fFrameColor= createColor(fgStore, CompilationUnitEditor.LINKED_POSITION_COLOR, display);
- fFrameColor= createColor(fgStore, PHPeclipsePlugin.LINKED_POSITION_COLOR, display);
- }
+ fFrameColor= createColor(fgStore, PreferenceConstants.EDITOR_LINKED_POSITION_COLOR, display);
+ }
}
/**
@@ -141,6 +164,14 @@ public class LinkedPositionUI implements LinkedPositionListener,
return null;
}
+
+ /**
+ * Sets the initial offset.
+ * @param offset
+ */
+ public void setInitialOffset(int offset) {
+ fInitialOffset= offset;
+ }
/**
* Sets the final position of the caret when the linked mode is exited
@@ -158,12 +189,20 @@ public class LinkedPositionUI implements LinkedPositionListener,
fExitListener= listener;
}
+ /**
+ * Sets an ExitPolicy
which decides when and how
+ * the linked mode is exited.
+ */
+ public void setExitPolicy(ExitPolicy policy) {
+ fExitPolicy= policy;
+ }
+
/*
* @see LinkedPositionManager.LinkedPositionListener#setCurrentPositions(Position, int)
*/
public void setCurrentPosition(Position position, int caretOffset) {
if (!fFramePosition.equals(position)) {
- redrawRegion();
+ fNeedRedraw= true;
fFramePosition= position;
}
@@ -177,10 +216,12 @@ public class LinkedPositionUI implements LinkedPositionListener,
* @see #exit(boolean)
*/
public void enter() {
+
// track final caret
IDocument document= fViewer.getDocument();
document.addPositionCategory(CARET_POSITION);
document.addPositionUpdater(fgUpdater);
+
try {
if (fFinalCaretOffset != -1)
document.addPosition(CARET_POSITION, new Position(fFinalCaretOffset));
@@ -188,11 +229,12 @@ public class LinkedPositionUI implements LinkedPositionListener,
handleException(fViewer.getTextWidget().getShell(), e);
} catch (BadPositionCategoryException e) {
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
Assert.isTrue(false);
}
fViewer.addTextInputListener(this);
+ fViewer.addTextListener(this);
ITextViewerExtension extension= (ITextViewerExtension) fViewer;
extension.prependVerifyKeyListener(this);
@@ -203,11 +245,28 @@ public class LinkedPositionUI implements LinkedPositionListener,
text.addPaintListener(this);
text.showSelection();
- fFramePosition= fManager.getFirstPosition();
- if (fFramePosition == null)
+ Shell shell= text.getShell();
+ shell.addShellListener(this);
+
+ fFramePosition= (fInitialOffset == -1) ? fManager.getFirstPosition() : fManager.getPosition(fInitialOffset);
+ if (fFramePosition == null) {
leave(UNINSTALL | COMMIT | UPDATE_CARET);
+ return;
+ }
fgStore.addPropertyChangeListener(this);
+
+ try {
+ fContentType= document.getContentType(fFramePosition.offset);
+ if (fViewer instanceof ITextViewerExtension2) {
+ ((ITextViewerExtension2) fViewer).prependAutoEditStrategy(fManager, fContentType);
+ } else {
+ Assert.isTrue(false);
+ }
+
+ } catch (BadLocationException e) {
+ handleException(fViewer.getTextWidget().getShell(), e);
+ }
}
/*
@@ -230,6 +289,9 @@ public class LinkedPositionUI implements LinkedPositionListener,
}
private void leave(int flags) {
+
+ fInitialOffset= -1;
+
if ((flags & UNINSTALL) != 0)
fManager.uninstall((flags & COMMIT) != 0);
@@ -245,13 +307,20 @@ public class LinkedPositionUI implements LinkedPositionListener,
text.removeModifyListener(this);
text.removeVerifyListener(this);
+ Shell shell= text.getShell();
+ shell.removeShellListener(this);
+
ITextViewerExtension extension= (ITextViewerExtension) fViewer;
extension.removeVerifyKeyListener(this);
+ if (fViewer instanceof ITextViewerExtension2 && fContentType != null)
+ ((ITextViewerExtension2) fViewer).removeAutoEditStrategy(fManager, fContentType);
+ fContentType= null;
+
+ fViewer.removeTextListener(this);
fViewer.removeTextInputListener(this);
try {
- IRegion region= fViewer.getVisibleRegion();
IDocument document= fViewer.getDocument();
if (((flags & COMMIT) != 0) &&
@@ -259,11 +328,20 @@ public class LinkedPositionUI implements LinkedPositionListener,
((flags & UPDATE_CARET) != 0))
{
Position[] positions= document.getPositions(CARET_POSITION);
-
if ((positions != null) && (positions.length != 0)) {
- int offset= positions[0].getOffset() - region.getOffset();
- if ((offset >= 0) && (offset <= region.getLength()))
- text.setSelection(offset, offset);
+
+ if (fViewer instanceof ITextViewerExtension3) {
+ ITextViewerExtension3 extension3= (ITextViewerExtension3) fViewer;
+ int widgetOffset= extension3.modelOffset2WidgetOffset(positions[0].getOffset());
+ if (widgetOffset >= 0)
+ text.setSelection(widgetOffset, widgetOffset);
+
+ } else {
+ IRegion region= fViewer.getVisibleRegion();
+ int offset= positions[0].getOffset() - region.getOffset();
+ if ((offset >= 0) && (offset <= region.getLength()))
+ text.setSelection(offset, offset);
+ }
}
}
@@ -276,7 +354,7 @@ public class LinkedPositionUI implements LinkedPositionListener,
((flags & DOCUMENT_CHANGED) != 0));
} catch (BadPositionCategoryException e) {
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
Assert.isTrue(false);
}
@@ -306,25 +384,35 @@ public class LinkedPositionUI implements LinkedPositionListener,
fFramePosition= position;
selectRegion();
redrawRegion();
- }
+ }
}
/*
* @see VerifyKeyListener#verifyKey(VerifyEvent)
*/
public void verifyKey(VerifyEvent event) {
+
+ if (!event.doit)
+ return;
+
+ Point selection= fViewer.getSelectedRange();
+ int offset= selection.x;
+ int length= selection.y;
+
+ ExitFlags exitFlags= fExitPolicy == null ? null : fExitPolicy.doExit(fManager, event, offset, length);
+ if (exitFlags != null) {
+ leave(UNINSTALL | exitFlags.flags);
+ event.doit= exitFlags.doit;
+ return;
+ }
+
switch (event.character) {
// [SHIFT-]TAB = hop between edit boxes
case 0x09:
{
- Point selection= fViewer.getTextWidget().getSelection();
- IRegion region= fViewer.getVisibleRegion();
- int offset= selection.x + region.getOffset();
- int length= selection.y - selection.x;
-
// if tab was treated as a document change, would it exceed variable range?
if (!LinkedPositionManager.includes(fFramePosition, offset, length)) {
- leave(UNINSTALL | COMMIT | UPDATE_CARET);
+ leave(UNINSTALL | COMMIT);
return;
}
}
@@ -358,11 +446,25 @@ public class LinkedPositionUI implements LinkedPositionListener,
if (!event.doit)
return;
- IRegion region= fViewer.getVisibleRegion();
-
- int offset= event.start + region.getOffset();
- int length= event.end - event.start;
+ int offset= 0;
+ int length= 0;
+
+ if (fViewer instanceof ITextViewerExtension3) {
+ ITextViewerExtension3 extension= (ITextViewerExtension3) fViewer;
+ IRegion modelRange= extension.widgetRange2ModelRange(new Region(event.start, event.end - event.start));
+ if (modelRange == null)
+ return;
+
+ offset= modelRange.getOffset();
+ length= modelRange.getLength();
+
+ } else {
+ IRegion visibleRegion= fViewer.getVisibleRegion();
+ offset= event.start + visibleRegion.getOffset();
+ length= event.end - event.start;
+ }
+
// allow changes only within linked positions when coming through UI
if (!fManager.anyPositionIncludes(offset, length))
leave(UNINSTALL | COMMIT);
@@ -374,18 +476,16 @@ public class LinkedPositionUI implements LinkedPositionListener,
public void paintControl(PaintEvent event) {
if (fFramePosition == null)
return;
-
- IRegion region= fViewer.getVisibleRegion();
-
- // #6824
- if (!includes(region, fFramePosition)) {
- leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
- return;
- }
-
- int offset= fFramePosition.getOffset() - region.getOffset();
- int length= fFramePosition.getLength();
+ IRegion widgetRange= asWidgetRange(fFramePosition);
+ if (widgetRange == null) {
+ leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
+ return;
+ }
+
+ int offset= widgetRange.getOffset();
+ int length= widgetRange.getLength();
+
StyledText text= fViewer.getTextWidget();
// support for bidi
@@ -400,6 +500,22 @@ public class LinkedPositionUI implements LinkedPositionListener,
gc.setForeground(fFrameColor);
gc.drawLine(x1, y, x2, y);
}
+
+ protected IRegion asWidgetRange(Position position) {
+ if (fViewer instanceof ITextViewerExtension3) {
+
+ ITextViewerExtension3 extension= (ITextViewerExtension3) fViewer;
+ return extension.modelRange2WidgetRange(new Region(position.getOffset(), position.getLength()));
+
+ } else {
+
+ IRegion region= fViewer.getVisibleRegion();
+ if (includes(region, position))
+ return new Region(position.getOffset() - region.getOffset(), position.getLength());
+ }
+
+ return null;
+ }
private static Point getMinimumLocation(StyledText text, int offset, int length) {
Point minLocation= new Point(Integer.MAX_VALUE, Integer.MAX_VALUE);
@@ -432,52 +548,45 @@ public class LinkedPositionUI implements LinkedPositionListener,
}
private void redrawRegion() {
- IRegion region= fViewer.getVisibleRegion();
-
- if (!includes(region, fFramePosition)) {
+ IRegion widgetRange= asWidgetRange(fFramePosition);
+ if (widgetRange == null) {
leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
return;
}
-
- int offset= fFramePosition.getOffset() - region.getOffset();
- int length= fFramePosition.getLength();
-
+
StyledText text= fViewer.getTextWidget();
- if (text != null && !text.isDisposed())
- text.redrawRange(offset, length, true);
+ if (text != null && !text.isDisposed())
+ text.redrawRange(widgetRange.getOffset(), widgetRange.getLength(), true);
}
private void selectRegion() {
- IRegion region= fViewer.getVisibleRegion();
-
- if (!includes(region, fFramePosition)) {
+
+ IRegion widgetRange= asWidgetRange(fFramePosition);
+ if (widgetRange == null) {
leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
return;
}
- int start= fFramePosition.getOffset() - region.getOffset();
- int end= fFramePosition.getLength() + start;
-
StyledText text= fViewer.getTextWidget();
- if (text != null && !text.isDisposed())
+ if (text != null && !text.isDisposed()) {
+ int start= widgetRange.getOffset();
+ int end= widgetRange.getLength() + start;
text.setSelection(start, end);
+ }
}
-
+
private void updateCaret() {
- IRegion region= fViewer.getVisibleRegion();
-
- if (!includes(region, fFramePosition)) {
+
+ IRegion widgetRange= asWidgetRange(fFramePosition);
+ if (widgetRange == null) {
leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
return;
}
-
- int offset= fFramePosition.getOffset() + fCaretOffset - region.getOffset();
- if ((offset >= 0) && (offset <= region.getLength())) {
- StyledText text= fViewer.getTextWidget();
- if (text != null && !text.isDisposed())
- text.setCaretOffset(offset);
- }
+ int offset= widgetRange.getOffset() + fCaretOffset;
+ StyledText text= fViewer.getTextWidget();
+ if (text != null && !text.isDisposed())
+ text.setCaretOffset(offset);
}
/*
@@ -492,14 +601,12 @@ public class LinkedPositionUI implements LinkedPositionListener,
private static void handleException(Shell shell, Exception e) {
String title= LinkedPositionMessages.getString("LinkedPositionUI.error.title"); //$NON-NLS-1$
if (e instanceof CoreException)
- PHPeclipsePlugin.log(e);
- // ExceptionHandler.handle((CoreException)e, shell, title, null);
+ ExceptionHandler.handle((CoreException)e, shell, title, null);
else if (e instanceof InvocationTargetException)
- PHPeclipsePlugin.log(e);
- // ExceptionHandler.handle((InvocationTargetException)e, shell, title, null);
+ ExceptionHandler.handle((InvocationTargetException)e, shell, title, null);
else {
MessageDialog.openError(shell, title, e.getMessage());
- PHPeclipsePlugin.log(e);
+ PHPeclipsePlugin.log(e);
}
}
@@ -524,4 +631,48 @@ public class LinkedPositionUI implements LinkedPositionListener,
position.getOffset() + position.getLength() <= region.getOffset() + region.getLength();
}
+ /*
+ * @see org.eclipse.jface.text.ITextListener#textChanged(TextEvent)
+ */
+ public void textChanged(TextEvent event) {
+ if (!fNeedRedraw)
+ return;
+
+ redrawRegion();
+ fNeedRedraw= false;
+ }
+
+ /*
+ * @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
+ */
+ public void shellActivated(ShellEvent event) {
+ }
+
+ /*
+ * @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
+ */
+ public void shellClosed(ShellEvent event) {
+ leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
+ }
+
+ /*
+ * @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
+ */
+ public void shellDeactivated(ShellEvent event) {
+ leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
+ }
+
+ /*
+ * @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
+ */
+ public void shellDeiconified(ShellEvent event) {
+ }
+
+ /*
+ * @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
+ */
+ public void shellIconified(ShellEvent event) {
+ leave(UNINSTALL | COMMIT | DOCUMENT_CHANGED);
+ }
+
}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/phpdoc/PHPDocCodeScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/phpdoc/PHPDocCodeScanner.java
index ab422d1..9b0ec7f 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/phpdoc/PHPDocCodeScanner.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/phpdoc/PHPDocCodeScanner.java
@@ -14,9 +14,11 @@ package net.sourceforge.phpdt.internal.ui.text.phpdoc;
import java.util.ArrayList;
import java.util.List;
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextAttribute;
@@ -131,7 +133,7 @@ public final class PHPDocCodeScanner extends RuleBasedScanner {
// };
- public PHPDocCodeScanner(PHPColorProvider provider) { // , IPreferenceStore store) {
+ public PHPDocCodeScanner(JavaColorManager provider, IPreferenceStore store) {
// super(manager, store);
// initialize();
createRules(provider);
@@ -150,7 +152,7 @@ public final class PHPDocCodeScanner extends RuleBasedScanner {
/* create the rules for PHPDoc
*/
- protected List createRules(PHPColorProvider provider) {
+ protected List createRules(JavaColorManager provider) {
List list= new ArrayList();
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java
new file mode 100644
index 0000000..f978141
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java
@@ -0,0 +1,1765 @@
+/*******************************************************************************
+ * Copyright (c) 2002 International Business Machines Corp. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package net.sourceforge.phpdt.ui;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+import org.eclipse.ui.texteditor.WorkbenchChainedTextFontFieldEditor;
+
+//import org.phpeclipse.phpdt.core.IClasspathEntry;
+//
+//import org.phpeclipse.phpdt.ui.text.IJavaColorConstants;
+//
+//import org.phpeclipse.phpdt.internal.ui.JavaPlugin;
+//import org.phpeclipse.phpdt.internal.ui.preferences.NewJavaProjectPreferencePage;
+
+/**
+ * Preference constants used in the JDT-UI preference store. Clients should only read the
+ * JDT-UI preference store using these values. Clients are not allowed to modify the
+ * preference store programmatically.
+ *
+ * @since 2.0
+ */
+public class PreferenceConstants {
+
+ private PreferenceConstants() {
+ }
+
+ /**
+ * A named preference that controls return type rendering of methods in the UI.
+ * Boolean
: if true
return types
+ * are rendered
+ * Boolean
: if true
override
+ * indicators are rendered
+ * String
. For example foe the given package name 'org.eclipse.jdt' pattern
+ * '.' will compress it to '..jdt', '1~' to 'o~.e~.jdt'.
+ * Boolean
.
+ * Boolean
: if true
empty
+ * inner packages are folded.
+ * JavaElementSorter
.
+ * String
: A comma separated list of the
+ * following entries. Each entry must be in the list, no duplication. List
+ * order defines the sort order.
+ *
+ *
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
: comma separated list of prefixed
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
: comma separated list of suffixes
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
: semicolon separated list of package
+ * names
+ *
+ * Value is of type Int
: positive value specifing the number of non star-import is used
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
. if true
new projects are created with a source and
+ * output folder. If false
source and output folder equals to the project.
+ *
SRCBIN_FOLDERS_IN_NEWPROJ
is set to false
.
+ *
+ * Value is of type String
.
+ *
SRCBIN_FOLDERS_IN_NEWPROJ
is set to false
.
+ *
+ * Value is of type String
.
+ *
IClasspathEntry
s, that will represent the
+ * JRE on the new project's classpath.
+ *
+ * Value is of type String
: a semicolon separated list of encoded JRE libraries.
+ * NEWPROJECT_JRELIBRARY_INDEX
defines the currently used library. Clients
+ * should use the method encodeJRELibrary
to encode a JRE library into a string
+ * and the methods decodeJRELibraryDescription(String)
and
+ * decodeJRELibraryClasspathEntries(String)
to decode the description and the array
+ * of classpath entries from an encoded string.
+ *
+ * Value is of type Int
: an index into the list of possible JRE libraries.
+ *
+ * Value is of type String
: possible values are
+ * OPEN_TYPE_HIERARCHY_IN_PERSPECTIVE
or
+ * OPEN_TYPE_HIERARCHY_IN_VIEW_PART
.
+ *
OPEN_TYPE_HIERARCHY
.
+ *
+ * @see #OPEN_TYPE_HIERARCHY
+ */
+ public static final String OPEN_TYPE_HIERARCHY_IN_PERSPECTIVE= "perspective"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference OPEN_TYPE_HIERARCHY
.
+ *
+ * @see #OPEN_TYPE_HIERARCHY
+ */
+ public static final String OPEN_TYPE_HIERARCHY_IN_VIEW_PART= "viewPart"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls the behaviour when double clicking on a container in the packages view.
+ *
+ * Value is of type String
: possible values are
+ * DOUBLE_CLICK_GOES_INTO
or
+ * DOUBLE_CLICK_EXPANDS
.
+ *
DOUBLE_CLICK
.
+ *
+ * @see #DOUBLE_CLICK
+ */
+ public static final String DOUBLE_CLICK_GOES_INTO= "packageview.gointo"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference DOUBLE_CLICK
.
+ *
+ * @see #DOUBLE_CLICK
+ */
+ public static final String DOUBLE_CLICK_EXPANDS= "packageview.doubleclick.expands"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls whether Java views update their presentation while editing or when saving the
+ * content of an editor.
+ *
+ * Value is of type String
: possible values are
+ * UPDATE_ON_SAVE
or
+ * UPDATE_WHILE_EDITING
.
+ *
UPDATE_JAVA_VIEWS
+ *
+ * @see #UPDATE_JAVA_VIEWS
+ */
+ public static final String UPDATE_ON_SAVE= "JavaUI.update.onSave"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference UPDATE_JAVA_VIEWS
+ *
+ * @see #UPDATE_JAVA_VIEWS
+ */
+ public static final String UPDATE_WHILE_EDITING= "JavaUI.update.whileEditing"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the path of the Javadoc command used by the Javadoc creation wizard.
+ *
+ * Value is of type String
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
. If true
spaces instead of tabs are used
+ * in the editor. If false
the editor inserts a tab character when pressing the tab
+ * key.
+ *
+ * Value is of type Int
: positive int value specifying the number of
+ * spaces per tab.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
. If true
multi line comments are rendered
+// * in bold. If false
the are rendered using no font style attribute.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
. If true
single line comments are rendered
+// * in bold. If false
the are rendered using no font style attribute.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+// * Value is of type String
. A RGB color value encoded as a string
+// * using class PreferenceConverter
+// *
+// * Value is of type Boolean
.
+// *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ * Value is of type Boolean
.
+ *
Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a hover
+ * contributed as phpEditorTextHovers
.
+ *
CTRL
modifier key is pressed.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a
+ * hover contributed as phpEditorTextHovers
.
+ *
SHIFT
modifier key is pressed.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a
+ * hover contributed as phpEditorTextHovers
.
+ *
CTRL + ALT
modifier keys is pressed.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a
+ * hover contributed as phpEditorTextHovers
.
+ *
CTRL + ALT + SHIFT
modifier keys is pressed.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a
+ * hover contributed as phpEditorTextHovers
.
+ *
CTRL + SHIFT
modifier keys is pressed.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a
+ * hover contributed as phpEditorTextHovers
.
+ *
ALT
modifier key is pressed.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
,
+ * EDITOR_DEFAULT_HOVER_CONFIGURED_ID
or the hover id of a
+ * hover contributed as phpEditorTextHovers
.
+ *
EDITOR_DEFAULT_HOVER
property.
+ * @since 2.1
+ */
+ public static final String EDITOR_DEFAULT_HOVER_CONFIGURED_ID= "defaultHoverConfiguredId"; //$NON-NLS-1$
+
+ /**
+ * A named preference that defines the hover named the 'default hover'.
+ * Value is of type String
: possible values are
+ * EDITOR_NO_HOVER_CONFIGURED_ID
or the hover id of a hover
+ * contributed as phpEditorTextHovers
.
+ *
+ *@since 2.1
+ */
+ public static final String EDITOR_DEFAULT_HOVER= "defaultHover"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if segmented view (show selected element only) is turned on or off.
+ *
+ * Value is of type Boolean
.
+ *
+ */
+ public static final String EDITOR_SHOW_SEGMENTS= "net.sourceforge.phpdt.ui.editor.showSegments"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if the Java code assist gets auto activated.
+ *
+ * Value is of type Boolean
.
+ *
+ */
+ public final static String CODEASSIST_AUTOACTIVATION= "content_assist_autoactivation"; //$NON-NLS-1$
+
+ /**
+ * A name preference that holds the auto activation delay time in milli seconds.
+ *
+ * Value is of type Int
.
+ *
+ */
+ public final static String CODEASSIST_AUTOACTIVATION_DELAY= "content_assist_autoactivation_delay"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if code assist contains only visible proposals.
+ *
+ * Value is of type Boolean
. if true code assist only contains visible members. If
+ * false
all members are included.
+ *
+ */
+ public final static String CODEASSIST_SHOW_VISIBLE_PROPOSALS= "content_assist_show_visible_proposals"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if the Java code assist inserts a
+ * proposal automatically if only one proposal is available.
+ *
+ * Value is of type Boolean
.
+ *
+ * @since 2.1
+ */
+ public final static String CODEASSIST_AUTOINSERT= "content_assist_autoinsert"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if the Java code assist adds import
+ * statements.
+ *
+ * Value is of type Boolean
.
+ *
+ * @since 2.1
+ */
+ public final static String CODEASSIST_ADDIMPORT= "content_assist_add_import"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if the Java code assist only inserts
+ * completions. If set to false the proposals can also _replace_ code.
+ *
+ * Value is of type Boolean
.
+ *
+ * @since 2.1
+ */
+ public final static String CODEASSIST_INSERT_COMPLETION= "content_assist_insert_completion"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls whether code assist proposals filtering is case sensitive or not.
+ *
+ * Value is of type Boolean
.
+ *
+ */
+ public final static String CODEASSIST_CASE_SENSITIVITY= "content_assist_case_sensitivity"; //$NON-NLS-1$
+
+ /**
+ * A named preference that defines if code assist proposals are sorted in alphabetical order.
+ *
+ * Value is of type Boolean
. If true
that are sorted in alphabetical
+ * order. If false
that are unsorted.
+ *
+ */
+ public final static String CODEASSIST_ORDER_PROPOSALS= "content_assist_order_proposals"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if argument names are filled in when a method is selected from as list
+ * of code assist proposal.
+ *
+ * Value is of type Boolean
.
+ *
+ */
+ public final static String CODEASSIST_FILL_ARGUMENT_NAMES= "content_assist_fill_method_arguments"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if method arguments are guessed when a
+ * method is selected from as list of code assist proposal.
+ *
+ * Value is of type Boolean
.
+ *
+ * @since 2.1
+ */
+ public final static String CODEASSIST_GUESS_METHOD_ARGUMENTS= "content_assist_guess_method_arguments"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the characters that auto activate code assist in Java code.
+ *
+ * Value is of type Sring
. All characters that trigger auto code assist in Java code.
+ *
+ */
+ public final static String CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA= "content_assist_autoactivation_triggers_php"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the characters that auto activate code assist in Javadoc.
+ *
+ * Value is of type Sring
. All characters that trigger auto code assist in Javadoc.
+ *
+ */
+ public final static String CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVADOC= "content_assist_autoactivation_triggers_phpdoc"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the background color used in the code assist selection dialog.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ *
+ * @see org.eclipse.jface.resource.StringConverter
+ * @see org.eclipse.jface.preference.PreferenceConverter
+ */
+ public final static String CODEASSIST_PROPOSALS_BACKGROUND= "content_assist_proposals_background"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the foreground color used in the code assist selection dialog.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ *
+ * @see org.eclipse.jface.resource.StringConverter
+ * @see org.eclipse.jface.preference.PreferenceConverter
+ */
+ public final static String CODEASSIST_PROPOSALS_FOREGROUND= "content_assist_proposals_foreground"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the background color used for parameter hints.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ *
+ * @see org.eclipse.jface.resource.StringConverter
+ * @see org.eclipse.jface.preference.PreferenceConverter
+ */
+ public final static String CODEASSIST_PARAMETERS_BACKGROUND= "content_assist_parameters_background"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the foreground color used in the code assist selection dialog
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ *
+ * @see org.eclipse.jface.resource.StringConverter
+ * @see org.eclipse.jface.preference.PreferenceConverter
+ */
+ public final static String CODEASSIST_PARAMETERS_FOREGROUND= "content_assist_parameters_foreground"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the background color used in the code
+ * assist selection dialog to mark replaced code.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ *
+ * @see org.eclipse.jface.resource.StringConverter
+ * @see org.eclipse.jface.preference.PreferenceConverter
+ * @since 2.1
+ */
+ public final static String CODEASSIST_REPLACEMENT_BACKGROUND= "content_assist_completion_replacement_background"; //$NON-NLS-1$
+
+ /**
+ * A named preference that holds the foreground color used in the code
+ * assist selection dialog to mark replaced code.
+ *
+ * Value is of type String
. A RGB color value encoded as a string
+ * using class PreferenceConverter
+ *
+ *
+ * @see org.eclipse.jface.resource.StringConverter
+ * @see org.eclipse.jface.preference.PreferenceConverter
+ * @since 2.1
+ */
+ public final static String CODEASSIST_REPLACEMENT_FOREGROUND= "content_assist_completion_replacement_foreground"; //$NON-NLS-1$
+
+
+ /**
+ * A named preference that controls the behaviour of the refactoring wizard for showing the error page.
+ *
+ * Value is of type String
. Valid values are:
+ * REFACTOR_FATAL_SEVERITY
,
+ * REFACTOR_ERROR_SEVERITY
,
+ * REFACTOR_WARNING_SEVERITY
+ * REFACTOR_INFO_SEVERITY
,
+ * REFACTOR_OK_SEVERITY
.
+ *
+ *
+ * @see #REFACTOR_FATAL_SEVERITY
+ * @see #REFACTOR_ERROR_SEVERITY
+ * @see #REFACTOR_WARNING_SEVERITY
+ * @see #REFACTOR_INFO_SEVERITY
+ * @see #REFACTOR_OK_SEVERITY
+ */
+ public static final String REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD= "Refactoring.ErrorPage.severityThreshold"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
.
+ *
+ * @see #REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
+ */
+ public static final String REFACTOR_FATAL_SEVERITY= "4"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
.
+ *
+ * @see #REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
+ */
+ public static final String REFACTOR_ERROR_SEVERITY= "3"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
.
+ *
+ * @see #REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
+ */
+ public static final String REFACTOR_WARNING_SEVERITY= "2"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
.
+ *
+ * @see #REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
+ */
+ public static final String REFACTOR_INFO_SEVERITY= "1"; //$NON-NLS-1$
+
+ /**
+ * A string value used by the named preference REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
.
+ *
+ * @see #REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD
+ */
+ public static final String REFACTOR_OK_SEVERITY= "0"; //$NON-NLS-1$
+
+ /**
+ * A named preference thet controls whether all dirty editors are automatically saved before a refactoring is
+ * executed.
+ *
+ * Value is of type Boolean
.
+ *
+ */
+ public static final String REFACTOR_SAVE_ALL_EDITORS= "Refactoring.savealleditors"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls if the Java Browsing views are linked to the active editor.
+ *
+ * Value is of type Boolean
.
+ *
+ *
+ * @see #LINK_PACKAGES_TO_EDITOR
+ */
+ public static final String BROWSING_LINK_VIEW_TO_EDITOR= "net.sourceforge.phpdt.ui.browsing.linktoeditor"; //$NON-NLS-1$
+
+ /**
+ * A named preference that controls the layout of the Java Browsing views vertically. Boolean value.
+ *
+ * Value is of type Boolean
. If true the views are stacked vertical.
+ * If false
they are stacked horizontal.
+ *
+ */
+ public static final String BROWSING_STACK_VERTICALLY= "net.sourceforge.phpdt.ui.browsing.stackVertically"; //$NON-NLS-1$
+
+
+ /**
+ * A named preference that controls if templates are formatted when applied.
+ *
+ * Value is of type Boolean
.
+ *
+ *
+ * @since 2.1
+ */
+ public static final String TEMPLATES_USE_CODEFORMATTER= "net.sourceforge.phpdt.ui.template.format"; //$NON-NLS-1$
+
+
+
+ public static void initializeDefaultValues(IPreferenceStore store) {
+ store.setDefault(PreferenceConstants.EDITOR_SHOW_SEGMENTS, false);
+
+ // JavaBasePreferencePage
+ store.setDefault(PreferenceConstants.LINK_PACKAGES_TO_EDITOR, true);
+ store.setDefault(PreferenceConstants.LINK_TYPEHIERARCHY_TO_EDITOR, false);
+ store.setDefault(PreferenceConstants.LINK_BROWSING_VIEW_TO_EDITOR, true);
+ store.setDefault(PreferenceConstants.OPEN_TYPE_HIERARCHY, PreferenceConstants.OPEN_TYPE_HIERARCHY_IN_VIEW_PART);
+ store.setDefault(PreferenceConstants.DOUBLE_CLICK, PreferenceConstants.DOUBLE_CLICK_EXPANDS);
+ store.setDefault(PreferenceConstants.UPDATE_JAVA_VIEWS, PreferenceConstants.UPDATE_WHILE_EDITING);
+
+ // AppearancePreferencePage
+ store.setDefault(PreferenceConstants.APPEARANCE_COMPRESS_PACKAGE_NAMES, false);
+ store.setDefault(PreferenceConstants.APPEARANCE_METHOD_RETURNTYPE, false);
+ store.setDefault(PreferenceConstants.SHOW_CU_CHILDREN, true);
+ store.setDefault(PreferenceConstants.APPEARANCE_OVERRIDE_INDICATOR, true);
+ store.setDefault(PreferenceConstants.BROWSING_STACK_VERTICALLY, false);
+ store.setDefault(PreferenceConstants.APPEARANCE_PKG_NAME_PATTERN_FOR_PKG_VIEW, ""); //$NON-NLS-1$
+ store.setDefault(PreferenceConstants.APPEARANCE_FOLD_PACKAGES_IN_PACKAGE_EXPLORER, true);
+
+ // ImportOrganizePreferencePage
+ store.setDefault(PreferenceConstants.ORGIMPORTS_IMPORTORDER, "php;phpx;org;com"); //$NON-NLS-1$
+ store.setDefault(PreferenceConstants.ORGIMPORTS_ONDEMANDTHRESHOLD, 99);
+ store.setDefault(PreferenceConstants.ORGIMPORTS_IGNORELOWERCASE, true);
+
+ // ClasspathVariablesPreferencePage
+ // CodeFormatterPreferencePage
+ // CompilerPreferencePage
+ // no initialization needed
+
+ // RefactoringPreferencePage
+ store.setDefault(PreferenceConstants.REFACTOR_ERROR_PAGE_SEVERITY_THRESHOLD, PreferenceConstants.REFACTOR_ERROR_SEVERITY);
+ store.setDefault(PreferenceConstants.REFACTOR_SAVE_ALL_EDITORS, false);
+ store.setDefault("RefactoringUI", "dialog");
+
+ // TemplatePreferencePage
+ store.setDefault(PreferenceConstants.TEMPLATES_USE_CODEFORMATTER, true);
+
+ // CodeGenerationPreferencePage
+ store.setDefault(PreferenceConstants.CODEGEN_USE_GETTERSETTER_PREFIX, false);
+ store.setDefault(PreferenceConstants.CODEGEN_USE_GETTERSETTER_SUFFIX, false);
+ store.setDefault(PreferenceConstants.CODEGEN_GETTERSETTER_PREFIX, "fg, f, _$, _, m_"); //$NON-NLS-1$
+ store.setDefault(PreferenceConstants.CODEGEN_GETTERSETTER_SUFFIX, "_"); //$NON-NLS-1$
+ store.setDefault(PreferenceConstants.CODEGEN__JAVADOC_STUBS, true);
+ store.setDefault(PreferenceConstants.CODEGEN__NON_JAVADOC_COMMENTS, false);
+ store.setDefault(PreferenceConstants.CODEGEN__FILE_COMMENTS, false);
+
+ // MembersOrderPreferencePage
+ store.setDefault(PreferenceConstants.APPEARANCE_MEMBER_SORT_ORDER, "T,SI,SF,SM,I,F,C,M"); //$NON-NLS-1$
+ // must add here to guarantee that it is the first in the listener list
+ // store.addPropertyChangeListener(PHPeclipsePlugin.getDefault().getMemberOrderPreferenceCache());
+
+
+ // PHPEditorPreferencePage
+ /*
+ * Ensure that the display is accessed only in the UI thread.
+ * Ensure that there are no side effects of switching the thread.
+ */
+ final RGB[] rgbs= new RGB[3];
+ final Display display= Display.getDefault();
+ display.syncExec(new Runnable() {
+ public void run() {
+ Color c= display.getSystemColor(SWT.COLOR_GRAY);
+ rgbs[0]= c.getRGB();
+ c= display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+ rgbs[1]= c.getRGB();
+ c= display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+ rgbs[2]= c.getRGB();
+ }
+ });
+
+ store.setDefault(PreferenceConstants.EDITOR_MATCHING_BRACKETS, true);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR, rgbs[0]);
+
+ store.setDefault(PreferenceConstants.EDITOR_CURRENT_LINE, true);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_CURRENT_LINE_COLOR, new RGB(225, 235, 224));
+
+ store.setDefault(PreferenceConstants.EDITOR_PRINT_MARGIN, false);
+ store.setDefault(PreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, 80);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_PRINT_MARGIN_COLOR, new RGB(176, 180 , 185));
+
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_FIND_SCOPE_COLOR, new RGB(185, 176 , 180));
+
+ store.setDefault(PreferenceConstants.EDITOR_PROBLEM_INDICATION, true);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_PROBLEM_INDICATION_COLOR, new RGB(255, 0 , 128));
+ store.setDefault(PreferenceConstants.EDITOR_ERROR_INDICATION_IN_OVERVIEW_RULER, true);
+
+ store.setDefault(PreferenceConstants.EDITOR_WARNING_INDICATION, true);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_WARNING_INDICATION_COLOR, new RGB(244, 200 , 45));
+ store.setDefault(PreferenceConstants.EDITOR_WARNING_INDICATION_IN_OVERVIEW_RULER, true);
+
+ store.setDefault(PreferenceConstants.EDITOR_TASK_INDICATION, false);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_TASK_INDICATION_COLOR, new RGB(0, 128, 255));
+ store.setDefault(PreferenceConstants.EDITOR_TASK_INDICATION_IN_OVERVIEW_RULER, false);
+
+ store.setDefault(PreferenceConstants.EDITOR_BOOKMARK_INDICATION, false);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_BOOKMARK_INDICATION_COLOR, new RGB(34, 164, 99));
+ store.setDefault(PreferenceConstants.EDITOR_BOOKMARK_INDICATION_IN_OVERVIEW_RULER, false);
+
+ store.setDefault(PreferenceConstants.EDITOR_SEARCH_RESULT_INDICATION, false);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_SEARCH_RESULT_INDICATION_COLOR, new RGB(192, 192, 192));
+ store.setDefault(PreferenceConstants.EDITOR_SEARCH_RESULT_INDICATION_IN_OVERVIEW_RULER, false);
+
+ store.setDefault(PreferenceConstants.EDITOR_UNKNOWN_INDICATION, false);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_UNKNOWN_INDICATION_COLOR, new RGB(0, 0, 0));
+ store.setDefault(PreferenceConstants.EDITOR_UNKNOWN_INDICATION_IN_OVERVIEW_RULER, false);
+
+ store.setDefault(PreferenceConstants.EDITOR_CORRECTION_INDICATION, true);
+ store.setDefault(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE, false);
+
+ store.setDefault(PreferenceConstants.EDITOR_EVALUTE_TEMPORARY_PROBLEMS, true);
+
+ store.setDefault(PreferenceConstants.EDITOR_OVERVIEW_RULER, true);
+
+ store.setDefault(PreferenceConstants.EDITOR_LINE_NUMBER_RULER, false);
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR, new RGB(0, 0, 0));
+
+ WorkbenchChainedTextFontFieldEditor.startPropagate(store, JFaceResources.TEXT_FONT);
+
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_LINKED_POSITION_COLOR, new RGB(0, 200 , 100));
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_LINK_COLOR, new RGB(0, 0, 255));
+
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_FOREGROUND_COLOR, rgbs[1]);
+ store.setDefault(PreferenceConstants.EDITOR_FOREGROUND_DEFAULT_COLOR, true);
+
+ PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_BACKGROUND_COLOR, rgbs[2]);
+ store.setDefault(PreferenceConstants.EDITOR_BACKGROUND_DEFAULT_COLOR, true);
+
+ store.setDefault(PreferenceConstants.EDITOR_TAB_WIDTH, 4);
+ store.setDefault(PreferenceConstants.EDITOR_SPACES_FOR_TABS, false);
+
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR, new RGB(63, 127, 95));
+// store.setDefault(PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_BOLD, false);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR, new RGB(63, 127, 95));
+// store.setDefault(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_BOLD, false);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_JAVA_KEYWORD_COLOR, new RGB(127, 0, 85));
+// store.setDefault(PreferenceConstants.EDITOR_JAVA_KEYWORD_BOLD, true);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_STRING_COLOR, new RGB(42, 0, 255));
+// store.setDefault(PreferenceConstants.EDITOR_STRING_BOLD, false);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_JAVA_DEFAULT_COLOR, new RGB(0, 0, 0));
+// store.setDefault(PreferenceConstants.EDITOR_JAVA_DEFAULT_BOLD, false);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_JAVADOC_KEYWORD_COLOR, new RGB(127, 159, 191));
+// store.setDefault(PreferenceConstants.EDITOR_JAVADOC_KEYWORD_BOLD, true);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_JAVADOC_TAG_COLOR, new RGB(127, 127, 159));
+// store.setDefault(PreferenceConstants.EDITOR_JAVADOC_TAG_BOLD, false);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_JAVADOC_LINKS_COLOR, new RGB(63, 63, 191));
+// store.setDefault(PreferenceConstants.EDITOR_JAVADOC_LINKS_BOLD, false);
+//
+// PreferenceConverter.setDefault(store, PreferenceConstants.EDITOR_JAVADOC_DEFAULT_COLOR, new RGB(63, 95, 191));
+// store.setDefault(PreferenceConstants.EDITOR_JAVADOC_DEFAULT_BOLD, false);
+
+ store.setDefault(PreferenceConstants.CODEASSIST_AUTOACTIVATION, true);
+ store.setDefault(PreferenceConstants.CODEASSIST_AUTOACTIVATION_DELAY, 500);
+
+ store.setDefault(PreferenceConstants.CODEASSIST_AUTOINSERT, true);
+ PreferenceConverter.setDefault(store, PreferenceConstants.CODEASSIST_PROPOSALS_BACKGROUND, new RGB(254, 241, 233));
+ PreferenceConverter.setDefault(store, PreferenceConstants.CODEASSIST_PROPOSALS_FOREGROUND, new RGB(0, 0, 0));
+ PreferenceConverter.setDefault(store, PreferenceConstants.CODEASSIST_PARAMETERS_BACKGROUND, new RGB(254, 241, 233));
+ PreferenceConverter.setDefault(store, PreferenceConstants.CODEASSIST_PARAMETERS_FOREGROUND, new RGB(0, 0, 0));
+ PreferenceConverter.setDefault(store, PreferenceConstants.CODEASSIST_REPLACEMENT_BACKGROUND, new RGB(255, 255, 0));
+ PreferenceConverter.setDefault(store, PreferenceConstants.CODEASSIST_REPLACEMENT_FOREGROUND, new RGB(255, 0, 0));
+ store.setDefault(PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA, "."); //$NON-NLS-1$
+ store.setDefault(PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVADOC, "@"); //$NON-NLS-1$
+ store.setDefault(PreferenceConstants.CODEASSIST_SHOW_VISIBLE_PROPOSALS, true);
+ store.setDefault(PreferenceConstants.CODEASSIST_CASE_SENSITIVITY, false);
+ store.setDefault(PreferenceConstants.CODEASSIST_ORDER_PROPOSALS, false);
+ store.setDefault(PreferenceConstants.CODEASSIST_ADDIMPORT, true);
+ store.setDefault(PreferenceConstants.CODEASSIST_INSERT_COMPLETION, true);
+ store.setDefault(PreferenceConstants.CODEASSIST_FILL_ARGUMENT_NAMES, false);
+ store.setDefault(PreferenceConstants.CODEASSIST_GUESS_METHOD_ARGUMENTS, true);
+
+ store.setDefault(PreferenceConstants.EDITOR_SMART_HOME_END, true);
+ store.setDefault(PreferenceConstants.EDITOR_SMART_PASTE, true);
+ store.setDefault(PreferenceConstants.EDITOR_CLOSE_STRINGS, true);
+ store.setDefault(PreferenceConstants.EDITOR_CLOSE_BRACKETS, true);
+ store.setDefault(PreferenceConstants.EDITOR_CLOSE_BRACES, true);
+ store.setDefault(PreferenceConstants.EDITOR_CLOSE_JAVADOCS, true);
+ store.setDefault(PreferenceConstants.EDITOR_WRAP_STRINGS, true);
+ store.setDefault(PreferenceConstants.EDITOR_ADD_JAVADOC_TAGS, true);
+ store.setDefault(PreferenceConstants.EDITOR_FORMAT_JAVADOCS, true);
+
+ // store.setDefault(PreferenceConstants.EDITOR_DEFAULT_HOVER, JavaPlugin.ID_BESTMATCH_HOVER);
+ store.setDefault(PreferenceConstants.EDITOR_NONE_HOVER, PreferenceConstants.EDITOR_DEFAULT_HOVER_CONFIGURED_ID);
+// store.setDefault(PreferenceConstants.EDITOR_CTRL_HOVER, JavaPlugin.ID_SOURCE_HOVER);
+ store.setDefault(PreferenceConstants.EDITOR_SHIFT_HOVER, PreferenceConstants.EDITOR_DEFAULT_HOVER_CONFIGURED_ID);
+ store.setDefault(PreferenceConstants.EDITOR_CTRL_SHIFT_HOVER, PreferenceConstants.EDITOR_DEFAULT_HOVER_CONFIGURED_ID);
+ store.setDefault(PreferenceConstants.EDITOR_CTRL_ALT_HOVER, PreferenceConstants.EDITOR_DEFAULT_HOVER_CONFIGURED_ID);
+ store.setDefault(PreferenceConstants.EDITOR_ALT_SHIFT_HOVER, PreferenceConstants.EDITOR_DEFAULT_HOVER_CONFIGURED_ID);
+ store.setDefault(PreferenceConstants.EDITOR_CTRL_ALT_SHIFT_HOVER, PreferenceConstants.EDITOR_DEFAULT_HOVER_CONFIGURED_ID);
+
+ // do more complicated stuff
+ // NewJavaProjectPreferencePage.initDefaults(store);
+ }
+
+ /**
+ * Returns the JDT-UI preference store.
+ *
+ * @return the JDT-UI preference store
+ */
+ public static IPreferenceStore getPreferenceStore() {
+ return PHPeclipsePlugin.getDefault().getPreferenceStore();
+ }
+
+// /**
+// * Encodes a JRE library to be used in the named preference NEWPROJECT_JRELIBRARY_LIST
.
+// *
+// * @param description a string value describing the JRE library. The description is used
+// * to indentify the JDR library in the UI
+// * @param entries an array of classpath entries to be encoded
+// *
+// * @return the encoded string.
+// */
+// public static String encodeJRELibrary(String description, IClasspathEntry[] entries) {
+// return NewJavaProjectPreferencePage.encodeJRELibrary(description, entries);
+// }
+//
+// /**
+// * Decodes an encoded JRE library and returns its description string.
+// *
+// * @return the description of an encoded JRE library
+// *
+// * @see #encodeJRELibrary(String, IClasspathEntry[])
+// */
+// public static String decodeJRELibraryDescription(String encodedLibrary) {
+// return NewJavaProjectPreferencePage.decodeJRELibraryDescription(encodedLibrary);
+// }
+//
+// /**
+// * Decodes an encoded JRE library and returns its classpath entries.
+// *
+// * @return the array of classpath entries of an encoded JRE library.
+// *
+// * @see #encodeJRELibrary(String, IClasspathEntry[])
+// */
+// public static IClasspathEntry[] decodeJRELibraryClasspathEntries(String encodedLibrary) {
+// return NewJavaProjectPreferencePage.decodeJRELibraryClasspathEntries(encodedLibrary);
+// }
+//
+// /**
+// * Returns the current configuration for the JRE to be used as default in new Java projects.
+// * This is a convenience method to access the named preference NEWPROJECT_JRELIBRARY_LIST
+// *
with the index defined by NEWPROJECT_JRELIBRARY_INDEX
.
+// *
+// * @return the current default set of classpath entries
+// *
+// * @see #NEWPROJECT_JRELIBRARY_LIST
+// * @see #NEWPROJECT_JRELIBRARY_INDEX
+// */
+// public static IClasspathEntry[] getDefaultJRELibrary() {
+// return NewJavaProjectPreferencePage.getDefaultJRELibrary();
+// }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/AbstractJavaScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/AbstractJavaScanner.java
new file mode 100644
index 0000000..fe27645
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/AbstractJavaScanner.java
@@ -0,0 +1,179 @@
+package net.sourceforge.phpdt.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.RGB;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.StringConverter;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.util.PropertyChangeEvent;
+
+import net.sourceforge.phpdt.ui.text.IColorManager;
+import net.sourceforge.phpdt.ui.text.IColorManagerExtension;
+
+
+/**
+ * Initialized with a color manager and a preference store, its subclasses are
+ * only responsible for providing a list of preference keys based on which tokens
+ * are generated and to use this tokens to define the rules controlling this scanner.
+ */
+public abstract class AbstractJavaScanner extends BufferedRuleBasedScanner {
+
+
+ private IColorManager fColorManager;
+ private IPreferenceStore fPreferenceStore;
+
+ private Map fTokenMap= new HashMap();
+ private String[] fPropertyNamesColor;
+ private String[] fPropertyNamesStyle;
+
+
+ /**
+ * Returns the list of preference keys which define the tokens
+ * used in the rules of this scanner.
+ */
+ abstract protected String[] getTokenProperties();
+
+ /**
+ * Creates the list of rules controlling this scanner.
+ */
+ abstract protected List createRules();
+
+
+ /**
+ * Creates an abstract Java scanner.
+ */
+ public AbstractJavaScanner(IColorManager manager, IPreferenceStore store) {
+ super();
+ fColorManager= manager;
+ fPreferenceStore= store;
+ }
+
+ /**
+ * Must be called after the constructor has been called.
+ */
+ public final void initialize() {
+
+ fPropertyNamesColor= getTokenProperties();
+ int length= fPropertyNamesColor.length;
+ fPropertyNamesStyle= new String[length];
+ for (int i= 0; i < length; i++) {
+ fPropertyNamesStyle[i]= fPropertyNamesColor[i] + "_bold"; //$NON-NLS-1$
+ addToken(fPropertyNamesColor[i], fPropertyNamesStyle[i]);
+ }
+
+ initializeRules();
+ }
+
+ private void addToken(String colorKey, String styleKey) {
+ RGB rgb= PreferenceConverter.getColor(fPreferenceStore, colorKey);
+ if (fColorManager instanceof IColorManagerExtension) {
+ IColorManagerExtension ext= (IColorManagerExtension) fColorManager;
+ ext.unbindColor(colorKey);
+ ext.bindColor(colorKey, rgb);
+ }
+
+ boolean bold= fPreferenceStore.getBoolean(styleKey);
+ fTokenMap.put(colorKey, new Token(new TextAttribute(fColorManager.getColor(colorKey), null, bold ? SWT.BOLD : SWT.NORMAL)));
+ }
+
+ protected Token getToken(String key) {
+ return (Token) fTokenMap.get(key);
+ }
+
+ private void initializeRules() {
+ List rules= createRules();
+ if (rules != null) {
+ IRule[] result= new IRule[rules.size()];
+ rules.toArray(result);
+ setRules(result);
+ }
+ }
+
+ private int indexOf(String property) {
+ if (property != null) {
+ int length= fPropertyNamesColor.length;
+ for (int i= 0; i < length; i++) {
+ if (property.equals(fPropertyNamesColor[i]) || property.equals(fPropertyNamesStyle[i]))
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public boolean affectsBehavior(PropertyChangeEvent event) {
+ return indexOf(event.getProperty()) >= 0;
+ }
+
+ public void adaptToPreferenceChange(PropertyChangeEvent event) {
+ String p= event.getProperty();
+ int index= indexOf(p);
+ Token token= getToken(fPropertyNamesColor[index]);
+ if (fPropertyNamesColor[index].equals(p))
+ adaptToColorChange(token, event);
+ else
+ adaptToStyleChange(token, event);
+ }
+
+ private void adaptToColorChange(Token token, PropertyChangeEvent event) {
+ RGB rgb= null;
+
+ Object value= event.getNewValue();
+ if (value instanceof RGB)
+ rgb= (RGB) value;
+ else if (value instanceof String)
+ rgb= StringConverter.asRGB((String) value);
+
+ if (rgb != null) {
+
+ String property= event.getProperty();
+
+ if (fColorManager instanceof IColorManagerExtension) {
+ IColorManagerExtension ext= (IColorManagerExtension) fColorManager;
+ ext.unbindColor(property);
+ ext.bindColor(property, rgb);
+ }
+
+ Object data= token.getData();
+ if (data instanceof TextAttribute) {
+ TextAttribute oldAttr= (TextAttribute) data;
+ token.setData(new TextAttribute(fColorManager.getColor(property), oldAttr.getBackground(), oldAttr.getStyle()));
+ }
+ }
+ }
+
+ private void adaptToStyleChange(Token token, PropertyChangeEvent event) {
+ boolean bold= false;
+ Object value= event.getNewValue();
+ if (value instanceof Boolean)
+ bold= ((Boolean) value).booleanValue();
+ else if (value instanceof String) {
+ String s= (String) value;
+ if (IPreferenceStore.TRUE.equals(s))
+ bold= true;
+ else if (IPreferenceStore.FALSE.equals(s))
+ bold= false;
+ }
+
+ Object data= token.getData();
+ if (data instanceof TextAttribute) {
+ TextAttribute oldAttr= (TextAttribute) data;
+ boolean isBold= (oldAttr.getStyle() == SWT.BOLD);
+ if (isBold != bold)
+ token.setData(new TextAttribute(oldAttr.getForeground(), oldAttr.getBackground(), bold ? SWT.BOLD : SWT.NORMAL));
+ }
+ }
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IColorManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IColorManager.java
new file mode 100644
index 0000000..8961a41
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IColorManager.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2001 International Business Machines Corp. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package net.sourceforge.phpdt.ui.text;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+
+
+/**
+ * Manages SWT color objects for given color keys and
+ * given RGB
objects. Until the dispose
+ * method is called, the same color object is returned for
+ * equal keys and equal RGB
values.
+ *
+ * This interface may be implemented by clients.
+ *
+ *
+ * @see IJavaColorConstants
+ */
+public interface IColorManager {
+
+ /**
+ * Returns a color object for the given key. The color objects
+ * are remembered internally; the same color object is returned
+ * for equal keys.
+ *
+ * @param key the color key
+ * @return the color object for the given key
+ */
+ Color getColor(String key);
+
+ /**
+ * Returns the color object for the value represented by the given
+ * RGB
object.
+ *
+ * @param rgb the rgb color specification
+ * @return the color object for the given rgb value
+ */
+ Color getColor(RGB rgb);
+
+ /**
+ * Disposes all color objects remembered by this color manager.
+ */
+ void dispose();
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IColorManagerExtension.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IColorManagerExtension.java
new file mode 100644
index 0000000..1b38030
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IColorManagerExtension.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2002 International Business Machines Corp. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package net.sourceforge.phpdt.ui.text;
+
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ * A color manager extension for extending IColorManager
+ * instances with new functionality.
+ *
+ * @since 2.0
+ */
+public interface IColorManagerExtension {
+
+ /**
+ * Remembers the given color specification under the given key.
+ *
+ * @param key the color key
+ * @param rgb the color specification
+ * @exception UnsupportedOperationException if there is already a
+ * color specification remembered under the given key
+ */
+ void bindColor(String key, RGB rgb);
+
+
+ /**
+ * Forgets the color specification remembered under the given key.
+ * @param key the color key
+ */
+ void unbindColor(String key);
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IJavaColorConstants.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IJavaColorConstants.java
new file mode 100644
index 0000000..6e2a6cf
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/IJavaColorConstants.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2002 International Business Machines Corp. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package net.sourceforge.phpdt.ui.text;
+
+/**
+ * Color keys used for syntax highlighting Java
+ * code and JavaDoc compliant comments.
+ * A IColorManager
is responsible for mapping
+ * concrete colors to these keys.
+ *
+ * This interface declares static final fields only; it is not intended to be
+ * implemented.
+ *
+ *
+ * @see IColorManager
+ */
+public interface IJavaColorConstants {
+
+ /**
+ * Note: This constant is for internal use only. Clients should not use this constant.
+ * The prefix all color constants start with.
+ */
+ String PREFIX= "php_"; //$NON-NLS-1$
+
+ /** The color key for multi-line comments in Java code. */
+ String JAVA_MULTI_LINE_COMMENT= "php_multi_line_comment"; //$NON-NLS-1$
+ /** The color key for single-line comments in Java code. */
+ String JAVA_SINGLE_LINE_COMMENT= "php_single_line_comment"; //$NON-NLS-1$
+ /** The color key for Java keywords in Java code. */
+ String JAVA_KEYWORD= "php_keyword"; //$NON-NLS-1$
+ /** The color key for string and character literals in Java code. */
+ String JAVA_STRING= "php_string"; //$NON-NLS-1$
+ /** The color key for everthing in Java code for which no other color is specified. */
+ String JAVA_DEFAULT= "php_default"; //$NON-NLS-1$
+ /**
+ * The color key for the Java built-in types such as int and char in Java code.
+ * @deprecated no longer used, use JAVA_KEYWORD
instead
+ */
+ String JAVA_TYPE= "php_type"; //$NON-NLS-1$
+
+
+ /** The color key for JavaDoc keywords (@foo
) in JavaDoc comments. */
+ String JAVADOC_KEYWORD= "php_doc_keyword"; //$NON-NLS-1$
+ /** The color key for HTML tags (<foo>
) in JavaDoc comments. */
+ String JAVADOC_TAG= "php_doc_tag"; //$NON-NLS-1$
+ /** The color key for JavaDoc links ({foo}
) in JavaDoc comments. */
+ String JAVADOC_LINK= "php_doc_link"; //$NON-NLS-1$
+ /** The color key for everthing in JavaDoc comments for which no other color is specified. */
+ String JAVADOC_DEFAULT= "php_doc_default"; //$NON-NLS-1$
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/JavaTextTools.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/JavaTextTools.java
new file mode 100644
index 0000000..b3073f1
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/JavaTextTools.java
@@ -0,0 +1,257 @@
+package net.sourceforge.phpdt.ui.text;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import net.sourceforge.phpdt.internal.ui.text.FastJavaPartitionScanner;
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
+import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCodeScanner;
+import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.rules.DefaultPartitioner;
+import org.eclipse.jface.text.rules.IPartitionTokenScanner;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+//
+//import org.phpeclipse.phpdt.internal.ui.text.FastJavaPartitionScanner;
+//import org.phpeclipse.phpdt.internal.ui.text.JavaColorManager;
+//import org.phpeclipse.phpdt.internal.ui.text.JavaPartitionScanner;
+//import org.phpeclipse.phpdt.internal.ui.text.SingleTokenJavaScanner;
+//import org.phpeclipse.phpdt.internal.ui.text.php.JavaCodeScanner;
+//import org.phpeclipse.phpdt.internal.ui.text.phpdoc.JavaDocScanner;
+
+
+/**
+ * Tools required to configure a Java text viewer.
+ * The color manager and all scanner exist only one time, i.e.
+ * the same instances are returned to all clients. Thus, clients
+ * share those tools.
+ *
+ * This class may be instantiated; it is not intended to be subclassed.
+ *
+ */
+public class JavaTextTools {
+
+ private class PreferenceListener implements IPropertyChangeListener {
+ public void propertyChange(PropertyChangeEvent event) {
+ adaptToPreferenceChange(event);
+ }
+ };
+
+ /** The color manager */
+ private JavaColorManager fColorManager;
+ /** The Java source code scanner */
+ private PHPCodeScanner fCodeScanner;
+ /** The Java multiline comment scanner */
+ private SingleTokenPHPScanner fMultilineCommentScanner;
+ /** The Java singleline comment scanner */
+ private SingleTokenPHPScanner fSinglelineCommentScanner;
+ /** The Java string scanner */
+ private SingleTokenPHPScanner fStringScanner;
+ /** The JavaDoc scanner */
+ private PHPDocCodeScanner fJavaDocScanner;
+ /** The Java partitions scanner */
+ private FastJavaPartitionScanner fPartitionScanner;
+
+ /** The preference store */
+ private IPreferenceStore fPreferenceStore;
+ /** The preference change listener */
+ private PreferenceListener fPreferenceListener= new PreferenceListener();
+
+
+ /**
+ * Creates a new Java text tools collection.
+ *
+ * @param store the preference store to initialize the text tools. The text tool
+ * instance installs a listener on the passed preference store to adapt itself to
+ * changes in the preference store. In general PreferenceConstants.
+ * getPreferenceStore()
shoould be used to initialize the text tools.
+ *
+ * @see org.phpeclipse.phpdt.ui.PreferenceConstants#getPreferenceStore()
+ * @since 2.0
+ */
+ public JavaTextTools(IPreferenceStore store) {
+ fPreferenceStore= store;
+ fPreferenceStore.addPropertyChangeListener(fPreferenceListener);
+
+ fColorManager= new JavaColorManager();
+ fCodeScanner= new PHPCodeScanner(fColorManager, store);
+ fMultilineCommentScanner= new SingleTokenPHPScanner(fColorManager, store, IJavaColorConstants.JAVA_MULTI_LINE_COMMENT);
+ fSinglelineCommentScanner= new SingleTokenPHPScanner(fColorManager, store, IJavaColorConstants.JAVA_SINGLE_LINE_COMMENT);
+ fStringScanner= new SingleTokenPHPScanner(fColorManager, store, IJavaColorConstants.JAVA_STRING);
+ fJavaDocScanner= new PHPDocCodeScanner(fColorManager, store);
+ fPartitionScanner= new FastJavaPartitionScanner();
+ }
+
+ /**
+ * Disposes all the individual tools of this tools collection.
+ */
+ public void dispose() {
+
+ fCodeScanner= null;
+ fMultilineCommentScanner= null;
+ fSinglelineCommentScanner= null;
+ fStringScanner= null;
+ fJavaDocScanner= null;
+ fPartitionScanner= null;
+
+ if (fColorManager != null) {
+ fColorManager.dispose();
+ fColorManager= null;
+ }
+
+ if (fPreferenceStore != null) {
+ fPreferenceStore.removePropertyChangeListener(fPreferenceListener);
+ fPreferenceStore= null;
+ fPreferenceListener= null;
+ }
+ }
+
+ /**
+ * Returns the color manager which is used to manage
+ * any Java-specific colors needed for such things like syntax highlighting.
+ *
+ * @return the color manager to be used for Java text viewers
+ */
+ public JavaColorManager getColorManager() {
+ return fColorManager;
+ }
+
+ /**
+ * Returns a scanner which is configured to scan Java source code.
+ *
+ * @return a Java source code scanner
+ */
+ public RuleBasedScanner getCodeScanner() {
+ return fCodeScanner;
+ }
+
+ /**
+ * Returns a scanner which is configured to scan Java multiline comments.
+ *
+ * @return a Java multiline comment scanner
+ *
+ * @since 2.0
+ */
+ public RuleBasedScanner getMultilineCommentScanner() {
+ return fMultilineCommentScanner;
+ }
+
+ /**
+ * Returns a scanner which is configured to scan Java singleline comments.
+ *
+ * @return a Java singleline comment scanner
+ *
+ * @since 2.0
+ */
+ public RuleBasedScanner getSinglelineCommentScanner() {
+ return fSinglelineCommentScanner;
+ }
+
+ /**
+ * Returns a scanner which is configured to scan Java strings.
+ *
+ * @return a Java string scanner
+ *
+ * @since 2.0
+ */
+ public RuleBasedScanner getStringScanner() {
+ return fStringScanner;
+ }
+
+ /**
+ * Returns a scanner which is configured to scan JavaDoc compliant comments.
+ * Notes that the start sequence "/**" and the corresponding end sequence
+ * are part of the JavaDoc comment.
+ *
+ * @return a JavaDoc scanner
+ */
+ public RuleBasedScanner getJavaDocScanner() {
+ return fJavaDocScanner;
+ }
+
+ /**
+ * Returns a scanner which is configured to scan
+ * Java-specific partitions, which are multi-line comments,
+ * JavaDoc comments, and regular Java source code.
+ *
+ * @return a Java partition scanner
+ */
+ public IPartitionTokenScanner getPartitionScanner() {
+ return fPartitionScanner;
+ }
+
+ /**
+ * Factory method for creating a Java-specific document partitioner
+ * using this object's partitions scanner. This method is a
+ * convenience method.
+ *
+ * @return a newly created Java document partitioner
+ */
+ public IDocumentPartitioner createDocumentPartitioner() {
+
+ String[] types= new String[] {
+ FastJavaPartitionScanner.JAVA_DOC,
+ FastJavaPartitionScanner.JAVA_MULTI_LINE_COMMENT,
+ FastJavaPartitionScanner.JAVA_SINGLE_LINE_COMMENT,
+ FastJavaPartitionScanner.JAVA_STRING
+ };
+
+ return new DefaultPartitioner(getPartitionScanner(), types);
+ }
+
+ /**
+ * Returns the names of the document position categories used by the document
+ * partitioners created by this object to manage their partition information.
+ * If the partitioners don't use document position categories, the returned
+ * result is null
.
+ *
+ * @return the partition managing position categories or null
+ * if there is none
+ */
+ public String[] getPartitionManagingPositionCategories() {
+ return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
+ }
+
+ /**
+ * Determines whether the preference change encoded by the given event
+ * changes the behavior of one its contained components.
+ *
+ * @param event the event to be investigated
+ * @return true
if event causes a behavioral change
+ *
+ * @since 2.0
+ */
+ public boolean affectsBehavior(PropertyChangeEvent event) {
+ return // fCodeScanner.affectsBehavior(event) ||
+ fMultilineCommentScanner.affectsBehavior(event) ||
+ fSinglelineCommentScanner.affectsBehavior(event) ||
+ fStringScanner.affectsBehavior(event); // ||
+// fJavaDocScanner.affectsBehavior(event);
+ }
+
+ /**
+ * Adapts the behavior of the contained components to the change
+ * encoded in the given event.
+ *
+ * @param event the event to which to adapt
+ * @since 2.0
+ */
+ protected void adaptToPreferenceChange(PropertyChangeEvent event) {
+// if (fCodeScanner.affectsBehavior(event))
+// fCodeScanner.adaptToPreferenceChange(event);
+ if (fMultilineCommentScanner.affectsBehavior(event))
+ fMultilineCommentScanner.adaptToPreferenceChange(event);
+ if (fSinglelineCommentScanner.affectsBehavior(event))
+ fSinglelineCommentScanner.adaptToPreferenceChange(event);
+ if (fStringScanner.affectsBehavior(event))
+ fStringScanner.adaptToPreferenceChange(event);
+// if (fJavaDocScanner.affectsBehavior(event))
+// fJavaDocScanner.adaptToPreferenceChange(event);
+ }
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/SingleTokenPHPScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/SingleTokenPHPScanner.java
new file mode 100644
index 0000000..3966235
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/text/SingleTokenPHPScanner.java
@@ -0,0 +1,43 @@
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+package net.sourceforge.phpdt.ui.text;
+
+
+import java.util.List;
+import org.eclipse.jface.preference.IPreferenceStore;
+import net.sourceforge.phpdt.ui.text.IColorManager;
+
+
+/**
+ *
+ */
+public final class SingleTokenPHPScanner extends AbstractJavaScanner{
+
+
+ private String[] fProperty;
+
+ public SingleTokenPHPScanner(IColorManager manager, IPreferenceStore store, String property) {
+ super(manager, store);
+ fProperty= new String[] { property };
+ initialize();
+ }
+
+ /*
+ * @see AbstractJavaScanner#getTokenProperties()
+ */
+ protected String[] getTokenProperties() {
+ return fProperty;
+ }
+
+ /*
+ * @see AbstractJavaScanner#createRules()
+ */
+ protected List createRules() {
+ setDefaultReturnToken(getToken(fProperty[0]));
+ return null;
+ }
+}
+
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
index 51a215a..9384fc1 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
@@ -13,6 +13,8 @@ package net.sourceforge.phpeclipse;
import net.sourceforge.phpdt.internal.ui.preferences.TemplatePreferencePage;
import net.sourceforge.phpdt.internal.ui.viewsupport.ImageDescriptorRegistry;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
+import net.sourceforge.phpdt.ui.text.JavaTextTools;
import net.sourceforge.phpeclipse.phpeditor.PHPDocumentProvider;
import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
@@ -78,6 +80,9 @@ public class PHPeclipsePlugin
private ImageDescriptorRegistry fImageDescriptorRegistry;
private PHPDocumentProvider fCompilationUnitDocumentProvider;
+
+ private JavaTextTools fJavaTextTools;
+
/**
* The Java virtual machine that we are running on.
*/
@@ -239,7 +244,13 @@ public class PHPeclipsePlugin
static IPath getInstallLocation() {
return new Path(getDefault().getDescriptor().getInstallURL().getFile());
}
-
+
+ public synchronized JavaTextTools getJavaTextTools() {
+ if (fJavaTextTools == null)
+ fJavaTextTools= new JavaTextTools(getPreferenceStore());
+ return fJavaTextTools;
+ }
+
/**
* Returns the string from the plugin's resource bundle,
* or 'key' if not found.
@@ -403,6 +414,7 @@ public class PHPeclipsePlugin
new PHPSyntaxRdr();
PHPCore.initializeDefaultPluginPreferences();
+ PreferenceConstants.initializeDefaultValues(store);
}
public void startup() throws CoreException {
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/AnnotationType.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/AnnotationType.java
new file mode 100644
index 0000000..c6ed4c2
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/AnnotationType.java
@@ -0,0 +1,25 @@
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+**********************************************************************/
+package net.sourceforge.phpeclipse.phpeditor;
+
+public final class AnnotationType {
+
+ public final static AnnotationType ALL= new AnnotationType();
+ public final static AnnotationType UNKNOWN= new AnnotationType();
+ public final static AnnotationType BOOKMARK= new AnnotationType();
+ public final static AnnotationType TASK= new AnnotationType();
+ public final static AnnotationType ERROR= new AnnotationType();
+ public final static AnnotationType WARNING= new AnnotationType();
+ public final static AnnotationType SEARCH_RESULT= new AnnotationType();
+
+ private AnnotationType() {
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BracketPainter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BracketPainter.java
new file mode 100644
index 0000000..55eea03
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BracketPainter.java
@@ -0,0 +1,171 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewerExtension3;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+
+
+public final class BracketPainter implements IPainter, PaintListener {
+
+ private PHPPairMatcher fMatcher= new PHPPairMatcher(new char[] { '{', '}', '(', ')', '[', ']' });
+ private Position fBracketPosition= new Position(0, 0);
+ private int fAnchor;
+
+ private boolean fIsActive= false;
+ private ISourceViewer fSourceViewer;
+ private StyledText fTextWidget;
+ private Color fColor;
+
+ private IPositionManager fPositionManager;
+
+
+ public BracketPainter(ISourceViewer sourceViewer) {
+ fSourceViewer= sourceViewer;
+ fTextWidget= sourceViewer.getTextWidget();
+ }
+
+ public void setHighlightColor(Color color) {
+ fColor= color;
+ }
+
+ public void dispose() {
+ if (fMatcher != null) {
+ fMatcher.dispose();
+ fMatcher= null;
+ }
+
+ fColor= null;
+ fTextWidget= null;
+ }
+
+ public void deactivate(boolean redraw) {
+ if (fIsActive) {
+ fIsActive= false;
+ fTextWidget.removePaintListener(this);
+ if (fPositionManager != null)
+ fPositionManager.removeManagedPosition(fBracketPosition);
+ if (redraw)
+ handleDrawRequest(null);
+ }
+ }
+
+ public void paintControl(PaintEvent event) {
+ if (fTextWidget != null)
+ handleDrawRequest(event.gc);
+ }
+
+ private void handleDrawRequest(GC gc) {
+
+ if (fBracketPosition.isDeleted)
+ return;
+
+ int offset= fBracketPosition.getOffset();
+ int length= fBracketPosition.getLength();
+ if (length < 1)
+ return;
+
+ if (fSourceViewer instanceof ITextViewerExtension3) {
+ ITextViewerExtension3 extension= (ITextViewerExtension3) fSourceViewer;
+ IRegion widgetRange= extension.modelRange2WidgetRange(new Region(offset, length));
+ if (widgetRange == null)
+ return;
+
+ offset= widgetRange.getOffset();
+ length= widgetRange.getLength();
+
+ } else {
+ IRegion region= fSourceViewer.getVisibleRegion();
+ if (region.getOffset() > offset || region.getOffset() + region.getLength() < offset + length)
+ return;
+ offset -= region.getOffset();
+ }
+
+ if (PHPPairMatcher.RIGHT == fAnchor)
+ draw(gc, offset, 1);
+ else
+ draw(gc, offset + length -1, 1);
+ }
+
+ private void draw(GC gc, int offset, int length) {
+ if (gc != null) {
+ Point left= fTextWidget.getLocationAtOffset(offset);
+ Point right= fTextWidget.getLocationAtOffset(offset + length);
+
+ gc.setForeground(fColor);
+ gc.drawRectangle(left.x, left.y, right.x - left.x - 1, gc.getFontMetrics().getHeight() - 1);
+
+ } else {
+ fTextWidget.redrawRange(offset, length, true);
+ }
+ }
+
+ /*
+ * @see IPainter#paint(int)
+ */
+ public void paint(int reason) {
+ Point selection= fSourceViewer.getSelectedRange();
+ if (selection.y > 0) {
+ deactivate(true);
+ return;
+ }
+
+ IRegion pair= fMatcher.match(fSourceViewer.getDocument(), selection.x);
+ if (pair == null) {
+ deactivate(true);
+ return;
+ }
+
+ if (fIsActive) {
+ // only if different
+ if (pair.getOffset() != fBracketPosition.getOffset() ||
+ pair.getLength() != fBracketPosition.getLength() ||
+ fMatcher.getAnchor() != fAnchor) {
+
+ // remove old highlighting
+ handleDrawRequest(null);
+ // update position
+ fBracketPosition.isDeleted= false;
+ fBracketPosition.offset= pair.getOffset();
+ fBracketPosition.length= pair.getLength();
+ fAnchor= fMatcher.getAnchor();
+ // apply new highlighting
+ handleDrawRequest(null);
+
+ }
+ } else {
+
+ fIsActive= true;
+
+ fBracketPosition.isDeleted= false;
+ fBracketPosition.offset= pair.getOffset();
+ fBracketPosition.length= pair.getLength();
+ fAnchor= fMatcher.getAnchor();
+
+ fTextWidget.addPaintListener(this);
+ fPositionManager.addManagedPosition(fBracketPosition);
+ handleDrawRequest(null);
+ }
+ }
+
+ /*
+ * @see IPainter#setPositionManager(IPositionManager)
+ */
+ public void setPositionManager(IPositionManager manager) {
+ fPositionManager= manager;
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IPainter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IPainter.java
new file mode 100644
index 0000000..ce0caba
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IPainter.java
@@ -0,0 +1,39 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+
+public interface IPainter {
+
+ /** Paint reasons */
+ int SELECTION= 0;
+ int TEXT_CHANGE= 1;
+ int KEY_STROKE= 2;
+ int MOUSE_BUTTON= 4;
+ int INTERNAL= 8;
+ int CONFIGURATION= 16;
+
+
+ /**
+ * Disposes this painter.
+ *
+ * XXX: The relationship with deactivate is not yet defined.
+ *
+ * */
+ void dispose();
+
+ void paint(int reason);
+
+ /**
+ * Deactivates the painter.
+ *
+ * XXX: The relationship with dispose is not yet defined.
+ *
+ */
+ void deactivate(boolean redraw);
+
+ void setPositionManager(IPositionManager manager);
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IPositionManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IPositionManager.java
new file mode 100644
index 0000000..9b96295
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IPositionManager.java
@@ -0,0 +1,16 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.jface.text.Position;
+
+
+public interface IPositionManager {
+
+ void addManagedPosition(Position position);
+
+ void removeManagedPosition(Position position);
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IProblemAnnotation.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IProblemAnnotation.java
new file mode 100644
index 0000000..6413787
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/IProblemAnnotation.java
@@ -0,0 +1,62 @@
+package net.sourceforge.phpeclipse.phpeditor;
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+
+import java.util.Iterator;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * Interface of annotations representing problems.
+ */
+public interface IProblemAnnotation {
+
+ AnnotationType getAnnotationType();
+
+ boolean isTemporary();
+
+ String getMessage();
+
+ String[] getArguments();
+
+ int getId();
+
+
+ Image getImage(Display display);
+
+ boolean isRelevant();
+
+ boolean hasOverlay();
+
+ Iterator getOverlaidIterator();
+
+ void addOverlaid(IProblemAnnotation annotation);
+
+ void removeOverlaid(IProblemAnnotation annotation);
+
+
+ /**
+ * @deprecated
+ */
+ boolean isProblem();
+
+ /**
+ * @deprecated
+ */
+ boolean isTask();
+
+ /**
+ * @deprecated
+ */
+ boolean isWarning();
+
+ /**
+ * @deprecated
+ */
+ boolean isError();
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/LinePainter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/LinePainter.java
new file mode 100644
index 0000000..a3b7167
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/LinePainter.java
@@ -0,0 +1,172 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.custom.LineBackgroundEvent;
+import org.eclipse.swt.custom.LineBackgroundListener;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+
+public class LinePainter implements IPainter, LineBackgroundListener {
+
+ private final ISourceViewer fViewer;
+ private Color fHighlightColor;
+ private IPositionManager fPositionManager;
+
+ // positions to keep track of beginning and end of line to be painted or cleared
+ private Position fCurrentLine= new Position(0, 0);
+ private Position fLastLine= new Position(0, 0);
+ // used to keep track of the last line painted
+ private int fLastLineNumber= -1;
+ private boolean fIsActive;
+
+ public LinePainter(ISourceViewer sourceViewer) {
+ fViewer= sourceViewer;
+ }
+
+ public void setHighlightColor(Color highlightColor) {
+ fHighlightColor= highlightColor;
+ }
+
+ /*
+ * @see LineBackgroundListener#lineGetBackground(LineBackgroundEvent)
+ */
+ public void lineGetBackground(LineBackgroundEvent event) {
+ // don't use cached line information because of asynch painting
+
+ StyledText textWidget= fViewer.getTextWidget();
+ if (textWidget != null) {
+
+ int caret= textWidget.getCaretOffset();
+ int length= event.lineText.length();
+
+ if (event.lineOffset <= caret && caret <= event.lineOffset + length)
+ event.lineBackground= fHighlightColor;
+ else
+ event.lineBackground= textWidget.getBackground();
+ }
+ }
+
+ private boolean updateHighlightLine() {
+ try {
+
+ IDocument document= fViewer.getDocument();
+
+ int offset= fViewer.getTextWidget().getCaretOffset() + fViewer.getVisibleRegion().getOffset();
+ int lineNumber= document.getLineOfOffset(offset);
+
+ // redraw if the current line number is different from the last line number we painted
+ // initially fLastLineNumber is -1
+ if (lineNumber != fLastLineNumber) {
+
+ fLastLine.offset= fCurrentLine.offset;
+ fLastLine.length= fCurrentLine.length;
+ fLastLine.isDeleted= fCurrentLine.isDeleted;
+
+ fCurrentLine.isDeleted= false;
+ fCurrentLine.offset= document.getLineOffset(lineNumber);
+ if (lineNumber == document.getNumberOfLines() - 1)
+ fCurrentLine.length= document.getLength() - fCurrentLine.offset;
+ else
+ fCurrentLine.length= document.getLineOffset(lineNumber + 1) - fCurrentLine.offset;
+
+ fLastLineNumber= lineNumber;
+ return true;
+
+ }
+
+ } catch (BadLocationException e) {
+ }
+
+ return false;
+ }
+
+ private void drawHighlightLine(Position position, int visibleOffset) {
+ StyledText textWidget= fViewer.getTextWidget();
+
+ // if the position that is about to be drawn was deleted then we can't
+ if (position.isDeleted())
+ return;
+
+ int delta= position.offset - visibleOffset;
+ if (0 <= delta && delta <= fViewer.getVisibleRegion().getLength()) {
+ Point upperLeft= textWidget.getLocationAtOffset(delta);
+ int width= textWidget.getClientArea().width + textWidget.getHorizontalPixel();
+ int height= textWidget.getLineHeight();
+ textWidget.redraw(upperLeft.x, upperLeft.y, width, height, false);
+ }
+ }
+
+ /*
+ * @see IPainter#deactivate(boolean)
+ */
+ public void deactivate(boolean redraw) {
+ if (fIsActive) {
+ fIsActive= false;
+
+ /* on turning off the feature one has to paint the currently
+ * highlighted line with the standard background color
+ */
+ if (redraw)
+ drawHighlightLine(fCurrentLine, fViewer.getVisibleRegion().getOffset());
+
+ fViewer.getTextWidget().removeLineBackgroundListener(this);
+
+ if (fPositionManager != null)
+ fPositionManager.removeManagedPosition(fCurrentLine);
+
+ fLastLineNumber= -1;
+ }
+ }
+
+ /*
+ * @see IPainter#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * @see IPainter#paint(int)
+ */
+ public void paint(int reason) {
+
+ // check selection
+ Point selection= fViewer.getTextWidget().getSelectionRange();
+ if (selection.y > 0) {
+ deactivate(true);
+ return;
+ }
+
+ // initialization
+ if (!fIsActive) {
+ fViewer.getTextWidget().addLineBackgroundListener(this);
+ fPositionManager.addManagedPosition(fCurrentLine);
+ fIsActive= true;
+ }
+
+ //redraw line highlight only if it hasn't been drawn yet on the respective line
+ if (updateHighlightLine()) {
+ // used to handle segmented view of source files
+ int visibleRegionOffset= fViewer.getVisibleRegion().getOffset();
+ // clear last line
+ drawHighlightLine(fLastLine, visibleRegionOffset);
+ // draw new line
+ drawHighlightLine(fCurrentLine, visibleRegionOffset);
+ }
+ }
+
+ /*
+ * @see IPainter#setPositionManager(IPositionManager)
+ */
+ public void setPositionManager(IPositionManager manager) {
+ fPositionManager = manager;
+ }
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/OverviewRuler.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/OverviewRuler.java
new file mode 100644
index 0000000..dfd4408
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/OverviewRuler.java
@@ -0,0 +1,775 @@
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+**********************************************************************/
+
+package net.sourceforge.phpeclipse.phpeditor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension3;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelListener;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ *
+ */
+public class OverviewRuler implements IVerticalRulerInfo {
+
+ /**
+ * Internal listener class.
+ */
+ class InternalListener implements ITextListener, IAnnotationModelListener {
+
+ /*
+ * @see ITextListener#textChanged
+ */
+ public void textChanged(TextEvent e) {
+ if (fTextViewer != null
+ && e.getDocumentEvent() == null
+ && e.getViewerRedrawState()) {
+ // handle only changes of visible document
+ redraw();
+ }
+ }
+
+ /*
+ * @see IAnnotationModelListener#modelChanged(IAnnotationModel)
+ */
+ public void modelChanged(IAnnotationModel model) {
+ update();
+ }
+ }
+
+ /**
+ * Filters problems based on their types.
+ */
+ class FilterIterator implements Iterator {
+
+ private final static int IGNORE = 0;
+ private final static int TEMPORARY = 1;
+ private final static int PERSISTENT = 2;
+
+ private Iterator fIterator;
+ private AnnotationType fType;
+ private IProblemAnnotation fNext;
+ private int fTemporary;
+
+ public FilterIterator(AnnotationType type) {
+ this(type, IGNORE);
+ }
+
+ public FilterIterator(AnnotationType type, boolean temporary) {
+ this(type, temporary ? TEMPORARY : PERSISTENT);
+ }
+
+ private FilterIterator(AnnotationType type, int temporary) {
+ fType = type;
+ fTemporary = temporary;
+ if (fModel != null) {
+ fIterator = fModel.getAnnotationIterator();
+ skip();
+ }
+ }
+
+ private void skip() {
+ while (fIterator.hasNext()) {
+ Object next = fIterator.next();
+ if (next instanceof IProblemAnnotation) {
+ fNext = (IProblemAnnotation) next;
+ AnnotationType type = fNext.getAnnotationType();
+ if (fType == AnnotationType.ALL || fType == type) {
+ if (fTemporary == IGNORE)
+ return;
+ if (fTemporary == TEMPORARY && fNext.isTemporary())
+ return;
+ if (fTemporary == PERSISTENT && !fNext.isTemporary())
+ return;
+ }
+ }
+ }
+ fNext = null;
+ }
+
+ /*
+ * @see Iterator#hasNext()
+ */
+ public boolean hasNext() {
+ return fNext != null;
+ }
+ /*
+ * @see Iterator#next()
+ */
+ public Object next() {
+ try {
+ return fNext;
+ } finally {
+ if (fModel != null)
+ skip();
+ }
+ }
+ /*
+ * @see Iterator#remove()
+ */
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ private static final int INSET = 2;
+ private static final int PROBLEM_HEIGHT_MIN = 4;
+ private static boolean PROBLEM_HEIGHT_SCALABLE = false;
+
+ /** The model of the overview ruler */
+ private IAnnotationModel fModel;
+ /** The view to which this ruler is connected */
+ private ITextViewer fTextViewer;
+ /** The ruler's canvas */
+ private Canvas fCanvas;
+ /** The drawable for double buffering */
+ private Image fBuffer;
+ /** The internal listener */
+ private InternalListener fInternalListener = new InternalListener();
+ /** The width of this vertical ruler */
+ private int fWidth;
+ /** The hit detection cursor */
+ private Cursor fHitDetectionCursor;
+ /** The last cursor */
+ private Cursor fLastCursor;
+ /** Cache for the actual scroll position in pixels */
+ private int fScrollPos;
+ /** The line of the last mouse button activity */
+ private int fLastMouseButtonActivityLine = -1;
+ /** The actual problem height */
+ private int fProblemHeight = -1;
+
+ private Set fAnnotationSet = new HashSet();
+ private Map fLayers = new HashMap();
+ private Map fColorTable = new HashMap();
+
+ /**
+ * Constructs a vertical ruler with the given width.
+ *
+ * @param width the width of the vertical ruler
+ */
+ public OverviewRuler(int width) {
+ fWidth = width;
+ }
+
+ public Control getControl() {
+ return fCanvas;
+ }
+
+ public int getWidth() {
+ return fWidth;
+ }
+
+ public void setModel(IAnnotationModel model) {
+ if (model != fModel || model != null) {
+
+ if (fModel != null)
+ fModel.removeAnnotationModelListener(fInternalListener);
+
+ fModel = model;
+
+ if (fModel != null)
+ fModel.addAnnotationModelListener(fInternalListener);
+
+ update();
+ }
+ }
+
+ public Control createControl(Composite parent, ITextViewer textViewer) {
+
+ fTextViewer = textViewer;
+
+ fHitDetectionCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
+ fCanvas = new Canvas(parent, SWT.NO_BACKGROUND);
+
+ fCanvas.addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent event) {
+ if (fTextViewer != null)
+ doubleBufferPaint(event.gc);
+ }
+ });
+
+ fCanvas.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent event) {
+ handleDispose();
+ fTextViewer = null;
+ }
+ });
+
+ fCanvas.addMouseListener(new MouseAdapter() {
+ public void mouseDown(MouseEvent event) {
+ handleMouseDown(event);
+ }
+ });
+
+ fCanvas.addMouseMoveListener(new MouseMoveListener() {
+ public void mouseMove(MouseEvent event) {
+ handleMouseMove(event);
+ }
+ });
+
+ if (fTextViewer != null)
+ fTextViewer.addTextListener(fInternalListener);
+
+ return fCanvas;
+ }
+
+ /**
+ * Disposes the ruler's resources.
+ */
+ private void handleDispose() {
+
+ if (fTextViewer != null) {
+ fTextViewer.removeTextListener(fInternalListener);
+ fTextViewer = null;
+ }
+
+ if (fModel != null)
+ fModel.removeAnnotationModelListener(fInternalListener);
+
+ if (fBuffer != null) {
+ fBuffer.dispose();
+ fBuffer = null;
+ }
+
+ if (fHitDetectionCursor != null) {
+ fHitDetectionCursor.dispose();
+ fHitDetectionCursor = null;
+ }
+
+ fAnnotationSet.clear();
+ fLayers.clear();
+ fColorTable.clear();
+ }
+
+ /**
+ * Double buffer drawing.
+ */
+ private void doubleBufferPaint(GC dest) {
+
+ Point size = fCanvas.getSize();
+
+ if (size.x <= 0 || size.y <= 0)
+ return;
+
+ if (fBuffer != null) {
+ Rectangle r = fBuffer.getBounds();
+ if (r.width != size.x || r.height != size.y) {
+ fBuffer.dispose();
+ fBuffer = null;
+ }
+ }
+ if (fBuffer == null)
+ fBuffer = new Image(fCanvas.getDisplay(), size.x, size.y);
+
+ GC gc = new GC(fBuffer);
+ try {
+ gc.setBackground(fCanvas.getBackground());
+ gc.fillRectangle(0, 0, size.x, size.y);
+
+ if (fTextViewer instanceof ITextViewerExtension3)
+ doPaint1(gc);
+ else
+ doPaint(gc);
+
+ } finally {
+ gc.dispose();
+ }
+
+ dest.drawImage(fBuffer, 0, 0);
+ }
+
+ private void doPaint(GC gc) {
+
+ if (fTextViewer == null)
+ return;
+
+ Rectangle r = new Rectangle(0, 0, 0, 0);
+ int yy, hh = PROBLEM_HEIGHT_MIN;
+
+ IDocument document = fTextViewer.getDocument();
+ IRegion visible = fTextViewer.getVisibleRegion();
+
+ StyledText textWidget = fTextViewer.getTextWidget();
+ int maxLines = textWidget.getLineCount();
+ fScrollPos = textWidget.getTopPixel();
+
+ Point size = fCanvas.getSize();
+ int writable = maxLines * textWidget.getLineHeight();
+ if (size.y > writable)
+ size.y = writable;
+
+ List indices = new ArrayList(fLayers.keySet());
+ Collections.sort(indices);
+
+ for (Iterator iterator = indices.iterator(); iterator.hasNext();) {
+ Object layer = iterator.next();
+ AnnotationType annotationType = (AnnotationType) fLayers.get(layer);
+
+ if (skip(annotationType))
+ continue;
+
+ boolean[] temporary = new boolean[] { false, true };
+ for (int t = 0; t < temporary.length; t++) {
+
+ Iterator e = new FilterIterator(annotationType, temporary[t]);
+ Color fill = getFillColor(annotationType, temporary[t]);
+ Color stroke = getStrokeColor(annotationType, temporary[t]);
+
+ for (int i = 0; e.hasNext(); i++) {
+
+ Annotation a = (Annotation) e.next();
+ Position p = fModel.getPosition(a);
+
+ if (p == null
+ || !p.overlapsWith(visible.getOffset(), visible.getLength()))
+ continue;
+
+ int problemOffset = Math.max(p.getOffset(), visible.getOffset());
+ int problemEnd =
+ Math.min(
+ p.getOffset() + p.getLength(),
+ visible.getOffset() + visible.getLength());
+ int problemLength = problemEnd - problemOffset;
+
+ try {
+ if (PROBLEM_HEIGHT_SCALABLE) {
+ int numbersOfLines =
+ document.getNumberOfLines(problemOffset, problemLength);
+ hh = (numbersOfLines * size.y) / maxLines;
+ if (hh < PROBLEM_HEIGHT_MIN)
+ hh = PROBLEM_HEIGHT_MIN;
+ }
+ fProblemHeight = hh;
+
+ int startLine =
+ textWidget.getLineAtOffset(problemOffset - visible.getOffset());
+ yy = Math.min((startLine * size.y) / maxLines, size.y - hh);
+
+ if (fill != null) {
+ gc.setBackground(fill);
+ gc.fillRectangle(INSET, yy, size.x - (2 * INSET), hh);
+ }
+
+ if (stroke != null) {
+ gc.setForeground(stroke);
+ r.x = INSET;
+ r.y = yy;
+ r.width = size.x - (2 * INSET) - 1;
+ r.height = hh;
+ gc.setLineWidth(1);
+ gc.drawRectangle(r);
+ }
+ } catch (BadLocationException x) {
+ }
+ }
+ }
+ }
+ }
+
+ private void doPaint1(GC gc) {
+
+ if (fTextViewer == null)
+ return;
+
+ Rectangle r = new Rectangle(0, 0, 0, 0);
+ int yy, hh = PROBLEM_HEIGHT_MIN;
+
+ ITextViewerExtension3 extension = (ITextViewerExtension3) fTextViewer;
+ IDocument document = fTextViewer.getDocument();
+ StyledText textWidget = fTextViewer.getTextWidget();
+ fScrollPos = textWidget.getTopPixel();
+
+ int maxLines = textWidget.getLineCount();
+ Point size = fCanvas.getSize();
+ int writable = maxLines * textWidget.getLineHeight();
+ if (size.y > writable)
+ size.y = writable;
+
+ List indices = new ArrayList(fLayers.keySet());
+ Collections.sort(indices);
+
+ for (Iterator iterator = indices.iterator(); iterator.hasNext();) {
+ Object layer = iterator.next();
+ AnnotationType annotationType = (AnnotationType) fLayers.get(layer);
+
+ if (skip(annotationType))
+ continue;
+
+ boolean[] temporary = new boolean[] { false, true };
+ for (int t = 0; t < temporary.length; t++) {
+
+ Iterator e = new FilterIterator(annotationType, temporary[t]);
+ Color fill = getFillColor(annotationType, temporary[t]);
+ Color stroke = getStrokeColor(annotationType, temporary[t]);
+
+ for (int i = 0; e.hasNext(); i++) {
+
+ Annotation a = (Annotation) e.next();
+ Position p = fModel.getPosition(a);
+
+ if (p == null)
+ continue;
+
+ IRegion widgetRegion =
+ extension.modelRange2WidgetRange(
+ new Region(p.getOffset(), p.getLength()));
+ if (widgetRegion == null)
+ continue;
+
+ try {
+ if (PROBLEM_HEIGHT_SCALABLE) {
+ int numbersOfLines =
+ document.getNumberOfLines(p.getOffset(), p.getLength());
+ hh = (numbersOfLines * size.y) / maxLines;
+ if (hh < PROBLEM_HEIGHT_MIN)
+ hh = PROBLEM_HEIGHT_MIN;
+ }
+ fProblemHeight = hh;
+
+ int startLine =
+ textWidget.getLineAtOffset(widgetRegion.getOffset());
+ yy = Math.min((startLine * size.y) / maxLines, size.y - hh);
+
+ if (fill != null) {
+ gc.setBackground(fill);
+ gc.fillRectangle(INSET, yy, size.x - (2 * INSET), hh);
+ }
+
+ if (stroke != null) {
+ gc.setForeground(stroke);
+ r.x = INSET;
+ r.y = yy;
+ r.width = size.x - (2 * INSET) - 1;
+ r.height = hh;
+ gc.setLineWidth(1);
+ gc.drawRectangle(r);
+ }
+ } catch (BadLocationException x) {
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Thread-safe implementation.
+ * Can be called from any thread.
+ */
+ public void update() {
+ if (fCanvas != null && !fCanvas.isDisposed()) {
+ Display d = fCanvas.getDisplay();
+ if (d != null) {
+ d.asyncExec(new Runnable() {
+ public void run() {
+ redraw();
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Redraws the overview ruler.
+ */
+ private void redraw() {
+ if (fCanvas != null && !fCanvas.isDisposed()) {
+ GC gc = new GC(fCanvas);
+ doubleBufferPaint(gc);
+ gc.dispose();
+ }
+ }
+
+ private int[] toLineNumbers(int y_coordinate) {
+
+ StyledText textWidget = fTextViewer.getTextWidget();
+ int maxLines = textWidget.getContent().getLineCount();
+
+ int rulerLength = fCanvas.getSize().y;
+ int writable = maxLines * textWidget.getLineHeight();
+
+ if (rulerLength > writable)
+ rulerLength = writable;
+
+ if (y_coordinate >= writable)
+ return new int[] { -1, -1 };
+
+ int[] lines = new int[2];
+
+ int pixel = Math.max(y_coordinate - 1, 0);
+ lines[0] = (pixel * maxLines) / rulerLength;
+
+ pixel = Math.min(rulerLength, y_coordinate + 1);
+ lines[1] = (pixel * maxLines) / rulerLength;
+
+ if (fTextViewer instanceof ITextViewerExtension3) {
+ ITextViewerExtension3 extension = (ITextViewerExtension3) fTextViewer;
+ lines[0] = extension.widgetlLine2ModelLine(lines[0]);
+ lines[1] = extension.widgetlLine2ModelLine(lines[1]);
+ } else {
+ try {
+ IRegion visible = fTextViewer.getVisibleRegion();
+ int lineNumber =
+ fTextViewer.getDocument().getLineOfOffset(visible.getOffset());
+ lines[0] += lineNumber;
+ lines[1] += lineNumber;
+ } catch (BadLocationException x) {
+ }
+ }
+
+ return lines;
+ }
+
+ boolean hasAnnotationAt(int y_coordinate) {
+ return findBestMatchingLineNumber(toLineNumbers(y_coordinate)) != -1;
+ }
+
+ private Position getProblemPositionAt(int[] lineNumbers) {
+ if (lineNumbers[0] == -1)
+ return null;
+
+ Position found = null;
+
+ try {
+ IDocument d = fTextViewer.getDocument();
+ IRegion line = d.getLineInformation(lineNumbers[0]);
+
+ int start = line.getOffset();
+
+ line = d.getLineInformation(lineNumbers[lineNumbers.length - 1]);
+ int end = line.getOffset() + line.getLength();
+
+ Iterator e = new FilterIterator(AnnotationType.ALL);
+ while (e.hasNext()) {
+ Annotation a = (Annotation) e.next();
+ Position p = fModel.getPosition(a);
+ if (start <= p.getOffset() && p.getOffset() < end) {
+ if (found == null || p.getOffset() < found.getOffset())
+ found = p;
+ }
+ }
+
+ } catch (BadLocationException x) {
+ }
+
+ return found;
+ }
+
+ /**
+ * Returns the line which best corresponds to one of
+ * the underlying problem annotations at the given
+ * y ruler coordinate.
+ *
+ * @return the best matching line or -1
if no such line can be found
+ * @since 2.1
+ */
+ private int findBestMatchingLineNumber(int[] lineNumbers) {
+ if (lineNumbers == null || lineNumbers.length < 1)
+ return -1;
+
+ try {
+ Position pos = getProblemPositionAt(lineNumbers);
+ if (pos == null)
+ return -1;
+ return fTextViewer.getDocument().getLineOfOffset(pos.getOffset());
+ } catch (BadLocationException ex) {
+ return -1;
+ }
+ }
+
+ private void handleMouseDown(MouseEvent event) {
+ if (fTextViewer != null) {
+ int[] lines = toLineNumbers(event.y);
+ Position p = getProblemPositionAt(lines);
+ if (p != null) {
+ fTextViewer.revealRange(p.getOffset(), p.getLength());
+ fTextViewer.setSelectedRange(p.getOffset(), p.getLength());
+ }
+ fTextViewer.getTextWidget().setFocus();
+ }
+ fLastMouseButtonActivityLine = toDocumentLineNumber(event.y);
+ }
+
+ private void handleMouseMove(MouseEvent event) {
+ if (fTextViewer != null) {
+ int[] lines = toLineNumbers(event.y);
+ Position p = getProblemPositionAt(lines);
+ Cursor cursor = (p != null ? fHitDetectionCursor : null);
+ if (cursor != fLastCursor) {
+ fCanvas.setCursor(cursor);
+ fLastCursor = cursor;
+ }
+ }
+ }
+
+ private void handleMouseDoubleClick(MouseEvent event) {
+ fLastMouseButtonActivityLine = toDocumentLineNumber(event.y);
+ }
+
+ public void showAnnotation(AnnotationType annotationType, boolean show) {
+ if (show)
+ fAnnotationSet.add(annotationType);
+ else
+ fAnnotationSet.remove(annotationType);
+ }
+
+ public void setLayer(AnnotationType annotationType, int layer) {
+ if (layer >= 0)
+ fLayers.put(new Integer(layer), annotationType);
+ else {
+ Iterator e = fLayers.keySet().iterator();
+ while (e.hasNext()) {
+ Object key = e.next();
+ if (annotationType.equals(fLayers.get(key))) {
+ fLayers.remove(key);
+ return;
+ }
+ }
+ }
+ }
+
+ public void setColor(AnnotationType annotationType, Color color) {
+ if (color != null)
+ fColorTable.put(annotationType, color);
+ else
+ fColorTable.remove(annotationType);
+ }
+
+ private boolean skip(AnnotationType annotationType) {
+ return !fAnnotationSet.contains(annotationType);
+ }
+
+ private static RGB interpolate(RGB fg, RGB bg, double scale) {
+ return new RGB(
+ (int) ((1.0 - scale) * fg.red + scale * bg.red),
+ (int) ((1.0 - scale) * fg.green + scale * bg.green),
+ (int) ((1.0 - scale) * fg.blue + scale * bg.blue));
+ }
+
+ private static double greyLevel(RGB rgb) {
+ if (rgb.red == rgb.green && rgb.green == rgb.blue)
+ return rgb.red;
+ return (0.299 * rgb.red + 0.587 * rgb.green + 0.114 * rgb.blue + 0.5);
+ }
+
+ private static boolean isDark(RGB rgb) {
+ return greyLevel(rgb) > 128;
+ }
+
+ private static Color getColor(RGB rgb) {
+ // PHPTextTools textTools= PHPeclipsePlugin.getDefault().getPHPTextTools();
+ // return textTools.getColorManager().getColor(rgb);
+ return PHPEditorEnvironment.getPHPColorProvider().getColor(rgb);
+ }
+
+ private Color getColor(AnnotationType annotationType, double scale) {
+ Color base = (Color) fColorTable.get(annotationType);
+ if (base == null)
+ return null;
+
+ RGB baseRGB = base.getRGB();
+ RGB background = fCanvas.getBackground().getRGB();
+
+ boolean darkBase = isDark(baseRGB);
+ boolean darkBackground = isDark(background);
+ if (darkBase && darkBackground)
+ background = new RGB(255, 255, 255);
+ else if (!darkBase && !darkBackground)
+ background = new RGB(0, 0, 0);
+
+ return getColor(interpolate(baseRGB, background, scale));
+ }
+
+ private Color getStrokeColor(
+ AnnotationType annotationType,
+ boolean temporary) {
+ return getColor(annotationType, temporary ? 0.5 : 0.2);
+ }
+
+ private Color getFillColor(
+ AnnotationType annotationType,
+ boolean temporary) {
+ return getColor(annotationType, temporary ? 0.9 : 0.6);
+ }
+
+ /**
+ * @see IVerticalRulerInfo#getLineOfLastMouseButtonActivity()
+ * @since 2.1
+ */
+ public int getLineOfLastMouseButtonActivity() {
+ return fLastMouseButtonActivityLine;
+ }
+
+ /**
+ * @see IVerticalRulerInfo#toDocumentLineNumber(int)
+ * @since 2.1
+ */
+ public int toDocumentLineNumber(int y_coordinate) {
+
+ if (fTextViewer == null || y_coordinate == -1)
+ return -1;
+
+ int[] lineNumbers = toLineNumbers(y_coordinate);
+ int bestLine = findBestMatchingLineNumber(lineNumbers);
+ if (bestLine == -1 && lineNumbers.length > 0)
+ return lineNumbers[0];
+ return bestLine;
+ }
+
+ /**
+ * Returns the height of the problem rectangle.
+ *
+ * @return the height of the problem rectangle
+ * @since 2.1
+ */
+ int getAnnotationHeight() {
+ return fProblemHeight;
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/OverviewRulerHoverManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/OverviewRulerHoverManager.java
new file mode 100644
index 0000000..b63d26d
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/OverviewRulerHoverManager.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2000, 2002 IBM Corp. and others..
+ * All rights reserved. Â This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+Â *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ */
+package net.sourceforge.phpeclipse.phpeditor;
+
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.source.AnnotationBarHoverManager;
+import org.eclipse.jface.text.source.IAnnotationHover;
+import org.eclipse.jface.text.source.ISourceViewer;
+
+/**
+ * This manager controls the layout, content, and visibility of an information
+ * control in reaction to mouse hover events issued by the overview ruler of a
+ * source viewer.
+ *
+ * @since 2.1
+ */
+class OverviewRulerHoverManager extends AnnotationBarHoverManager {
+
+ /**
+ * Creates an overview hover manager with the given parameters. In addition,
+ * the hovers anchor is RIGHT and the margin is 5 points to the right.
+ *
+ * @param ruler the overview ruler this manager connects to
+ * @param sourceViewer the source viewer this manager connects to
+ * @param annotationHover the annotation hover providing the information to be displayed
+ * @param creator the information control creator
+ */
+ public OverviewRulerHoverManager(OverviewRuler ruler, ISourceViewer sourceViewer, IAnnotationHover annotationHover, IInformationControlCreator creator) {
+ super(ruler, sourceViewer, annotationHover, creator);
+ }
+
+ /*
+ * @see AbstractHoverInformationControlManager#computeInformation()
+ */
+ protected void computeInformation() {
+ Point location= getHoverEventLocation();
+ int line= getVerticalRulerInfo().toDocumentLineNumber(location.y);
+ setInformation(getAnnotationHover().getHoverInfo(getSourceViewer(), line), computeArea(location.y));
+ }
+
+ /**
+ * Determines graphical area covered for which the hover is valid.
+ *
+ * @param y-coordinate in the vertical ruler
+ * @return the graphical extend where the hover is valid
+ */
+ private Rectangle computeArea(int y) {
+ // This is ok (see constructor)
+ OverviewRuler overviewRuler= (OverviewRuler)getVerticalRulerInfo();
+
+ int hover_height= overviewRuler.getAnnotationHeight();
+ int hover_width= getVerticalRulerInfo().getControl().getSize().x;
+
+ // Calculate y-coordinate for hover
+ int hover_y= y;
+ boolean hasAnnotation= true;
+ while (hasAnnotation && hover_y > y - hover_height) {
+ hover_y--;
+ hasAnnotation= overviewRuler.hasAnnotationAt(hover_y);
+ }
+ hover_y++;
+
+ return new Rectangle(0, hover_y, hover_width, hover_height);
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java
index 198ad1f..4db485f 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPDocumentProvider.java
@@ -16,8 +16,10 @@ import net.sourceforge.phpeclipse.phpeditor.php.IPHPPartitionScannerConstants;
import net.sourceforge.phpeclipse.phpeditor.php.PHPPartitionScanner;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.DefaultLineTracker;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.ILineTracker;
import org.eclipse.jface.text.rules.DefaultPartitioner;
import org.eclipse.ui.editors.text.FileDocumentProvider;
@@ -70,4 +72,15 @@ public class PHPDocumentProvider extends FileDocumentProvider {
fgScanner = new PHPPartitionScanner();
return fgScanner;
}
+
+ /**
+ * Creates a line tracker working with the same line delimiters as the document
+ * of the given element. Assumes the element to be managed by this document provider.
+ *
+ * @param element the element serving as blue print
+ * @return a line tracker based on the same line delimiters as the element's document
+ */
+ public ILineTracker createLineTracker(Object element) {
+ return new DefaultLineTracker();
+ }
}
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 ed60680..c86919b 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java
@@ -11,15 +11,23 @@ Contributors:
IBM Corporation - Initial implementation
Klaus Hartlage - www.eclipseproject.de
**********************************************************************/
+import java.util.ArrayList;
+import java.util.List;
+
import net.sourceforge.phpdt.internal.ui.actions.CompositeActionGroup;
+import net.sourceforge.phpdt.internal.ui.text.HTMLTextPresenter;
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher;
+import net.sourceforge.phpdt.internal.ui.viewsupport.IViewPartInputProvider;
import net.sourceforge.phpdt.ui.actions.GenerateActionGroup;
import net.sourceforge.phpdt.ui.actions.GotoMatchingBracketAction;
+import net.sourceforge.phpdt.ui.text.JavaTextTools;
import net.sourceforge.phpeclipse.IPreferenceConstants;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.phpeditor.php.IPHPPartitionScannerConstants;
import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
-import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
@@ -28,12 +36,17 @@ import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.ITextViewerExtension3;
+import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.information.InformationPresenter;
import org.eclipse.jface.text.source.AnnotationRulerColumn;
import org.eclipse.jface.text.source.CompositeRuler;
import org.eclipse.jface.text.source.ISourceViewer;
@@ -42,29 +55,39 @@ 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.SWT;
+import org.eclipse.swt.custom.BidiSegmentEvent;
+import org.eclipse.swt.custom.BidiSegmentListener;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
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.texteditor.ContentAssistAction;
import org.eclipse.ui.texteditor.DefaultRangeIndicator;
+import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.IEditorStatusLine;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.StatusTextEditor;
import org.eclipse.ui.texteditor.TextOperationAction;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
/**
* PHP specific text editor.
*/
-public class PHPEditor extends TextEditor {
-// extends StatusTextEditor implements IViewPartInputProvider { // extends TextEditor {
+public class PHPEditor
+ extends StatusTextEditor
+ implements IViewPartInputProvider { // extends TextEditor {
// protected PHPActionGroup fActionGroups;
/** The outline page */
private PHPContentOutlinePage fOutlinePage;
- private IPreferenceStore phpPrefStore;
+
+ // protected PHPSyntaxParserThread fValidationThread = null;
+
+ // private IPreferenceStore fPHPPrefStore;
/** The editor's bracket matcher */
private PHPPairMatcher fBracketMatcher;
@@ -75,13 +98,25 @@ public class PHPEditor extends TextEditor {
/** The standard action groups added to the menu */
private GenerateActionGroup fGenerateActionGroup;
private CompositeActionGroup fContextMenuGroup;
+
+ /** The information presenter. */
+ private InformationPresenter fInformationPresenter;
+
/**
* Default constructor.
*/
public PHPEditor() {
super();
- setEditorContextMenuId("#PHPEditorContext"); //$NON-NLS-1$
- setRulerContextMenuId("#PHPRulerContext"); //$NON-NLS-1$
+ JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+ setSourceViewerConfiguration(
+ new PHPSourceViewerConfiguration(textTools, this));
+ setRangeIndicator(new DefaultRangeIndicator());
+ setPreferenceStore(PHPeclipsePlugin.getDefault().getPreferenceStore());
+
+ // if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE))
+ // fUpdater= new OutlinePageSelectionUpdater();
+
+ initializeEditor();
}
//
// /**
@@ -99,6 +134,38 @@ public class PHPEditor extends TextEditor {
// return doc.get().toCharArray();
// }
+ /*
+ * @see net.sourceforge.phpdt.internal.ui.viewsupport.IViewPartInputProvider#getViewPartInput()
+ */
+ public Object getViewPartInput() {
+ return getEditorInput().getAdapter(IResource.class);
+ }
+
+ /*
+ * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.
+ * widgets.Composite)
+ */
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ IInformationControlCreator informationControlCreator =
+ new IInformationControlCreator() {
+ public IInformationControl createInformationControl(Shell parent) {
+ boolean cutDown = false;
+ int style = cutDown ? SWT.NONE : (SWT.V_SCROLL | SWT.H_SCROLL);
+ return new DefaultInformationControl(
+ parent,
+ SWT.RESIZE,
+ style,
+ new HTMLTextPresenter(cutDown));
+ }
+ };
+
+ fInformationPresenter = new InformationPresenter(informationControlCreator);
+ fInformationPresenter.setSizeConstraints(60, 10, true, true);
+ fInformationPresenter.install(getSourceViewer());
+ }
+
/**
* Returns this document's complete text.
*
@@ -192,6 +259,16 @@ public class PHPEditor extends TextEditor {
new CompositeActionGroup(new ActionGroup[] { fGenerateActionGroup });
// rg,
// new LocalHistoryActionGroup(this, ITextEditorActionConstants.GROUP_EDIT)});
+
+ // if (fValidationThread == null) {
+ // fValidationThread =
+ // new PHPSyntaxParserThread(this, getSourceViewer());
+ // //Thread defaults
+ //
+ // fValidationThread.start();
+ // }
+ //
+ // fValidationThread.setText(getSourceViewer().getTextWidget().getText());
}
/** The PHPEditor
implementation of this
@@ -226,7 +303,7 @@ public class PHPEditor extends TextEditor {
public void doSave(IProgressMonitor monitor) {
super.doSave(monitor);
// compile or not, according to the user preferences
- IPreferenceStore store = phpPrefStore;
+ IPreferenceStore store = getPreferenceStore(); // fPHPPrefStore;
if (store.getBoolean(PHPeclipsePlugin.PHP_PARSE_ON_SAVE)) {
IAction a = PHPParserAction.getInstance();
if (a != null)
@@ -250,7 +327,7 @@ public class PHPEditor extends TextEditor {
* AbstractTextEditor
method performs sets the
* input of the outline page after AbstractTextEditor has set input.
*/
- public void doSetInput(IEditorInput input) throws CoreException {
+ protected void doSetInput(IEditorInput input) throws CoreException {
super.doSetInput(input);
if (fOutlinePage != null)
fOutlinePage.setInput(input);
@@ -259,10 +336,10 @@ public class PHPEditor extends TextEditor {
/*
* @see org.phpeclipse.phpdt.internal.ui.viewsupport.IViewPartInputProvider#getViewPartInput()
*/
-// public Object getViewPartInput() {
-// return getEditorInput().getAdapter(IFile.class);
-// }
-
+ // public Object getViewPartInput() {
+ // return getEditorInput().getAdapter(IFile.class);
+ // }
+
/** The PHPEditor
implementation of this
* AbstractTextEditor
method adds any
* PHPEditor specific entries.
@@ -395,7 +472,8 @@ public class PHPEditor extends TextEditor {
*/
private boolean isLineNumberRulerVisible() {
// IPreferenceStore store= getPreferenceStore();
- return phpPrefStore.getBoolean(IPreferenceConstants.LINE_NUMBER_RULER);
+ return getPreferenceStore().getBoolean(
+ IPreferenceConstants.LINE_NUMBER_RULER);
}
/**
* Hides the line number ruler column.
@@ -416,44 +494,45 @@ public class PHPEditor extends TextEditor {
* @param rulerColumn the ruler column to be initialized
*/
protected void initializeLineNumberRulerColumn(LineNumberRulerColumn rulerColumn) {
- // JavaTextTools textTools= JavaPlugin.getDefault().getJavaTextTools();
- PHPColorProvider manager = PHPEditorEnvironment.getPHPColorProvider();
+ JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+ // PHPColorProvider manager = PHPEditorEnvironment.getPHPColorProvider();
+ JavaColorManager manager = textTools.getColorManager();
- if (phpPrefStore != null) {
+ IPreferenceStore store = getPreferenceStore();
+ if (store != null) {
RGB rgb = null;
// foreground color
- if (phpPrefStore.contains(IPreferenceConstants.LINE_NUMBER_COLOR)) {
- if (phpPrefStore.isDefault(IPreferenceConstants.LINE_NUMBER_COLOR))
+ if (store.contains(IPreferenceConstants.LINE_NUMBER_COLOR)) {
+ if (store.isDefault(IPreferenceConstants.LINE_NUMBER_COLOR))
rgb =
PreferenceConverter.getDefaultColor(
- phpPrefStore,
+ store,
IPreferenceConstants.LINE_NUMBER_COLOR);
else
rgb =
PreferenceConverter.getColor(
- phpPrefStore,
+ store,
IPreferenceConstants.LINE_NUMBER_COLOR);
}
rulerColumn.setForeground(manager.getColor(rgb));
rgb = null;
// background color
- if (!phpPrefStore
+ if (!store
.getBoolean(
IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) {
- if (phpPrefStore
- .contains(IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND)) {
- if (phpPrefStore
+ if (store.contains(IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND)) {
+ if (store
.isDefault(IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND))
rgb =
PreferenceConverter.getDefaultColor(
- phpPrefStore,
+ store,
IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND);
else
rgb =
PreferenceConverter.getColor(
- phpPrefStore,
+ store,
IPreferenceConstants.PREFERENCE_COLOR_BACKGROUND);
}
rulerColumn.setBackground(manager.getColor(rgb));
@@ -486,16 +565,14 @@ public class PHPEditor extends TextEditor {
* Method declared on TextEditor
*/
protected void initializeEditor() {
+ IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
PHPEditorEnvironment.connect(this);
- 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() {
+ store.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
PHPCodeScanner scanner = PHPEditorEnvironment.getPHPCodeScanner();
if (scanner != null) {
@@ -516,7 +593,7 @@ public class PHPEditor extends TextEditor {
}
});
}
-
+
private static IRegion getSignedSelection(ITextViewer viewer) {
StyledText text = viewer.getTextWidget();
@@ -638,4 +715,106 @@ public class PHPEditor extends TextEditor {
if (statusLine != null)
statusLine.setMessage(true, msg, null);
}
+
+ /**
+ * Returns a segmentation of the line of the given document appropriate for bidi rendering.
+ * The default implementation returns only the string literals of a php code line as segments.
+ *
+ * @param document the document
+ * @param lineOffset the offset of the line
+ * @return the line's bidi segmentation
+ * @throws BadLocationException in case lineOffset is not valid in document
+ */
+ public static int[] getBidiLineSegments(IDocument document, int lineOffset) throws BadLocationException {
+
+ IRegion line= document.getLineInformationOfOffset(lineOffset);
+ ITypedRegion[] linePartitioning= document.computePartitioning(lineOffset, line.getLength());
+
+ List segmentation= new ArrayList();
+ for (int i= 0; i < linePartitioning.length; i++) {
+ if (IPHPPartitionScannerConstants.PHP_STRING.equals(linePartitioning[i].getType()))
+ segmentation.add(linePartitioning[i]);
+ }
+
+
+ if (segmentation.size() == 0)
+ return null;
+
+ int size= segmentation.size();
+ int[] segments= new int[size * 2 + 1];
+
+ int j= 0;
+ for (int i= 0; i < size; i++) {
+ ITypedRegion segment= (ITypedRegion) segmentation.get(i);
+
+ if (i == 0)
+ segments[j++]= 0;
+
+ int offset= segment.getOffset() - lineOffset;
+ if (offset > segments[j - 1])
+ segments[j++]= offset;
+
+ if (offset + segment.getLength() >= line.getLength())
+ break;
+
+ segments[j++]= offset + segment.getLength();
+ }
+
+ if (j < segments.length) {
+ int[] result= new int[j];
+ System.arraycopy(segments, 0, result, 0, j);
+ segments= result;
+ }
+
+ return segments;
+ }
+ /**
+ * Returns a segmentation of the given line appropriate for bidi rendering. The default
+ * implementation returns only the string literals of a php code line as segments.
+ *
+ * @param lineOffset the offset of the line
+ * @param line the content of the line
+ * @return the line's bidi segmentation
+ */
+ protected int[] getBidiLineSegments(int lineOffset, String line) {
+ IDocumentProvider provider = getDocumentProvider();
+ if (provider != null && line != null && line.length() > 0) {
+ IDocument document = provider.getDocument(getEditorInput());
+ if (document != null)
+ try {
+ return getBidiLineSegments(document, lineOffset);
+ } catch (BadLocationException x) {
+ // ignore
+ }
+ }
+ return null;
+ }
+
+ /*
+ * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
+ */
+ protected final ISourceViewer createSourceViewer(
+ Composite parent,
+ IVerticalRuler ruler,
+ int styles) {
+ ISourceViewer viewer = createJavaSourceViewer(parent, ruler, styles);
+ StyledText text = viewer.getTextWidget();
+ text.addBidiSegmentListener(new BidiSegmentListener() {
+ public void lineGetSegments(BidiSegmentEvent event) {
+ event.segments = getBidiLineSegments(event.lineOffset, event.lineText);
+ }
+ });
+ // JavaUIHelp.setHelp(this, text, IJavaHelpContextIds.JAVA_EDITOR);
+ return viewer;
+ }
+
+ /*
+ * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
+ */
+ protected ISourceViewer createJavaSourceViewer(
+ Composite parent,
+ IVerticalRuler ruler,
+ int styles) {
+ return super.createSourceViewer(parent, ruler, styles);
+ }
}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorEnvironment.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorEnvironment.java
index 4c2ea9d..5243cfa 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorEnvironment.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorEnvironment.java
@@ -12,7 +12,9 @@ Contributors:
Klaus Hartlage - www.eclipseproject.de
**********************************************************************/
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCodeScanner;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.phpeditor.php.HTMLCodeScanner;
import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
@@ -20,8 +22,8 @@ import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
/** The PHPEditorEnvironment maintains singletons used by the php editor
*/
public class PHPEditorEnvironment {
-
- private static PHPColorProvider fgColorProvider;
+ // PHPColorProvider
+ private static JavaColorManager fgColorProvider;
private static PHPCodeScanner fgPHPCodeScanner;
private static HTMLCodeScanner fgHTMLCodeScanner;
private static PHPDocCodeScanner fgDocScanner;
@@ -33,10 +35,10 @@ public class PHPEditorEnvironment {
*/
public static void connect(Object client) {
if (++fgRefCount == 1) {
- fgColorProvider = new PHPColorProvider();
- fgPHPCodeScanner = new PHPCodeScanner(fgColorProvider);
- fgHTMLCodeScanner = new HTMLCodeScanner(fgColorProvider);
- fgDocScanner = new PHPDocCodeScanner(fgColorProvider);
+ fgColorProvider = new JavaColorManager(); // new PHPColorProvider();
+ fgPHPCodeScanner = new PHPCodeScanner(fgColorProvider, PHPeclipsePlugin.getDefault().getPreferenceStore() );
+ fgHTMLCodeScanner = new HTMLCodeScanner(fgColorProvider, PHPeclipsePlugin.getDefault().getPreferenceStore());
+ fgDocScanner = new PHPDocCodeScanner(fgColorProvider, PHPeclipsePlugin.getDefault().getPreferenceStore() );
}
}
@@ -77,7 +79,7 @@ public class PHPEditorEnvironment {
/**
* Returns the singleton color provider.
*/
- public static PHPColorProvider getPHPColorProvider() {
+ public static JavaColorManager getPHPColorProvider() {
return fgColorProvider;
}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSourceViewerConfiguration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSourceViewerConfiguration.java
index 87a0289..9fbe169 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSourceViewerConfiguration.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSourceViewerConfiguration.java
@@ -13,8 +13,10 @@ package net.sourceforge.phpeclipse.phpeditor;
import java.util.Vector;
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
import net.sourceforge.phpdt.internal.ui.text.java.JavaFormattingStrategy;
import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCompletionProcessor;
+import net.sourceforge.phpdt.ui.text.JavaTextTools;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.phpeditor.html.HTMLFormattingStrategy;
import net.sourceforge.phpeclipse.phpeditor.php.HTMLCompletionProcessor;
@@ -52,10 +54,12 @@ import org.eclipse.swt.graphics.RGB;
*/
public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
- public static final String HTML_DEFAULT = IPHPPartitionScannerConstants.HTML; //IDocument.DEFAULT_CONTENT_TYPE;
-
+ public static final String HTML_DEFAULT = IPHPPartitionScannerConstants.HTML;
+ //IDocument.DEFAULT_CONTENT_TYPE;
+
+ private JavaTextTools fJavaTextTools;
private PHPEditor fEditor;
-
+
private ContentFormatter fFormatter;
private HTMLFormattingStrategy fFormattingStrategy;
/**
@@ -70,7 +74,8 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
/**
* Default constructor.
*/
- public PHPSourceViewerConfiguration(PHPEditor editor) {
+ public PHPSourceViewerConfiguration(JavaTextTools textTools, PHPEditor editor) {
+ fJavaTextTools = textTools;
fEditor = editor;
}
@@ -78,27 +83,30 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
* @see SourceViewerConfiguration#getContentFormatter(ISourceViewer)
*/
public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
-// if (fFormatter == null) {
-// fFormatter = new ContentFormatter();
-// fFormattingStrategy = new HTMLFormattingStrategy(this, sourceViewer);
-// fFormatter.setFormattingStrategy(fFormattingStrategy, HTML_DEFAULT);
-// fFormatter.enablePartitionAwareFormatting(false);
-// fFormatter.setPartitionManagingPositionCategories(getConfiguredContentTypes(null));
-// }
-// return fFormatter;
-
+ // if (fFormatter == null) {
+ // fFormatter = new ContentFormatter();
+ // fFormattingStrategy = new HTMLFormattingStrategy(this, sourceViewer);
+ // fFormatter.setFormattingStrategy(fFormattingStrategy, HTML_DEFAULT);
+ // fFormatter.enablePartitionAwareFormatting(false);
+ // fFormatter.setPartitionManagingPositionCategories(getConfiguredContentTypes(null));
+ // }
+ // return fFormatter;
+
if (fFormatter == null) {
- //ContentFormatter
- fFormatter= new ContentFormatter();
- IFormattingStrategy strategy= new JavaFormattingStrategy(sourceViewer);
-
- fFormatter.setFormattingStrategy(strategy, IDocument.DEFAULT_CONTENT_TYPE);
- fFormatter.enablePartitionAwareFormatting(false);
- fFormatter.setPartitionManagingPositionCategories(getPartitionManagingPositionCategories());
+ //ContentFormatter
+ fFormatter = new ContentFormatter();
+ IFormattingStrategy strategy = new JavaFormattingStrategy(sourceViewer);
+
+ fFormatter.setFormattingStrategy(
+ strategy,
+ IDocument.DEFAULT_CONTENT_TYPE);
+ fFormatter.enablePartitionAwareFormatting(false);
+ fFormatter.setPartitionManagingPositionCategories(
+ getPartitionManagingPositionCategories());
}
return fFormatter;
}
-
+
/**
* Returns the names of the document position categories used by the document
* partitioners created by this object to manage their partition information.
@@ -111,23 +119,23 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
public String[] getPartitionManagingPositionCategories() {
return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
}
-// /**
-// * Returns the names of the document position categories used by the document
-// * partitioners created by this object to manage their partition information.
-// * If the partitioners don't use document position categories, the returned
-// * result is null
.
-// *
-// * @return the partition managing position categories or null
-// * if there is none
-// */
-// private String[] getPartitionManagingPositionCategories() {
-// return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
-// }
-
+ // /**
+ // * Returns the names of the document position categories used by the document
+ // * partitioners created by this object to manage their partition information.
+ // * If the partitioners don't use document position categories, the returned
+ // * result is null
.
+ // *
+ // * @return the partition managing position categories or null
+ // * if there is none
+ // */
+ // private String[] getPartitionManagingPositionCategories() {
+ // return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
+ // }
+
public PHPEditor getEditor() {
return fEditor;
}
-
+
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
@@ -138,26 +146,29 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
- public IAutoIndentStrategy getAutoIndentStrategy(ISourceViewer sourceViewer, String contentType) {
- return (IDocument.DEFAULT_CONTENT_TYPE.equals(contentType) ? new PHPAutoIndentStrategy() : new DefaultAutoIndentStrategy());
+ public IAutoIndentStrategy getAutoIndentStrategy(
+ ISourceViewer sourceViewer,
+ String contentType) {
+ return (
+ IDocument.DEFAULT_CONTENT_TYPE.equals(contentType)
+ ? new PHPAutoIndentStrategy()
+ : new DefaultAutoIndentStrategy());
}
-/* (non-Javadoc)
- * Method declared on SourceViewerConfiguration
- */
-public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
-{
+ /* (non-Javadoc)
+ * Method declared on SourceViewerConfiguration
+ */
+ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
return new String[] {
- IDocument.DEFAULT_CONTENT_TYPE,
- IPHPPartitionScannerConstants.PHP,
- IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT,
- IPHPPartitionScannerConstants.HTML,
- IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT,
- IPHPPartitionScannerConstants.CSS,
- IPHPPartitionScannerConstants.CSS_MULTILINE_COMMENT,
- IPHPPartitionScannerConstants.JAVASCRIPT,
- IPHPPartitionScannerConstants.JS_MULTILINE_COMMENT
- };
+ IDocument.DEFAULT_CONTENT_TYPE,
+ IPHPPartitionScannerConstants.PHP,
+ IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT,
+ IPHPPartitionScannerConstants.HTML,
+ IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT,
+ IPHPPartitionScannerConstants.CSS,
+ IPHPPartitionScannerConstants.CSS_MULTILINE_COMMENT,
+ IPHPPartitionScannerConstants.JAVASCRIPT,
+ IPHPPartitionScannerConstants.JS_MULTILINE_COMMENT };
}
/* (non-Javadoc)
@@ -166,15 +177,24 @@ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
ContentAssistant assistant = new ContentAssistant();
- assistant.setContentAssistProcessor(new HTMLCompletionProcessor(), IDocument.DEFAULT_CONTENT_TYPE);
- assistant.setContentAssistProcessor(new PHPCompletionProcessor(), IPHPPartitionScannerConstants.PHP);
- assistant.setContentAssistProcessor(new PHPDocCompletionProcessor(), IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
-
+ assistant.setContentAssistProcessor(
+ new HTMLCompletionProcessor(),
+ IDocument.DEFAULT_CONTENT_TYPE);
+ assistant.setContentAssistProcessor(
+ new PHPCompletionProcessor(),
+ IPHPPartitionScannerConstants.PHP);
+ assistant.setContentAssistProcessor(
+ new PHPDocCompletionProcessor(),
+ IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
+
assistant.enableAutoActivation(true);
assistant.setAutoActivationDelay(500);
assistant.setProposalPopupOrientation(ContentAssistant.PROPOSAL_OVERLAY);
- assistant.setContextInformationPopupOrientation(ContentAssistant.CONTEXT_INFO_ABOVE);
- assistant.setContextInformationPopupBackground(PHPEditorEnvironment.getPHPColorProvider().getColor(new RGB(150, 150, 0)));
+ assistant.setContextInformationPopupOrientation(
+ ContentAssistant.CONTEXT_INFO_ABOVE);
+ assistant.setContextInformationPopupBackground(
+ PHPEditorEnvironment.getPHPColorProvider().getColor(
+ new RGB(150, 150, 0)));
return assistant;
}
@@ -182,69 +202,76 @@ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
-// public String getDefaultPrefix(ISourceViewer sourceViewer, String contentType) {
-// return (PHPPartitionScanner.PHP.equals(contentType) ? "//" : null); //$NON-NLS-1$
-// // return (IDocument.DEFAULT_CONTENT_TYPE.equals(contentType) ? "//" : null); //$NON-NLS-1$
-// }
+ // public String getDefaultPrefix(ISourceViewer sourceViewer, String contentType) {
+ // return (PHPPartitionScanner.PHP.equals(contentType) ? "//" : null); //$NON-NLS-1$
+ // // return (IDocument.DEFAULT_CONTENT_TYPE.equals(contentType) ? "//" : null); //$NON-NLS-1$
+ // }
/*
* @see SourceViewerConfiguration#getDefaultPrefix(ISourceViewer, String)
* @since 2.0
*/
- public String[] getDefaultPrefixes(ISourceViewer sourceViewer, String contentType) {
+ public String[] getDefaultPrefixes(
+ ISourceViewer sourceViewer,
+ String contentType) {
return new String[] { "//", "" }; //$NON-NLS-1$ //$NON-NLS-2$
}
-
+
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
- public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
+ public ITextDoubleClickStrategy getDoubleClickStrategy(
+ ISourceViewer sourceViewer,
+ String contentType) {
return new PHPDoubleClickSelector();
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
-// public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
-// return new String[] { "\t", " " }; //$NON-NLS-1$ //$NON-NLS-2$
-// }
+ // public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
+ // return new String[] { "\t", " " }; //$NON-NLS-1$ //$NON-NLS-2$
+ // }
/*
* @see SourceViewerConfiguration#getIndentPrefixes(ISourceViewer, String)
*/
- public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
+ public String[] getIndentPrefixes(
+ ISourceViewer sourceViewer,
+ String contentType) {
- Vector vector= new Vector();
+ Vector vector = new Vector();
// prefix[0] is either '\t' or ' ' x tabWidth, depending on useSpaces
-
- final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
- int tabWidth= store.getInt(PHPeclipsePlugin.FORMATTER_TAB_SIZE);
- boolean useSpaces= store.getBoolean(PHPeclipsePlugin.SPACES_FOR_TABS);
-
- for (int i= 0; i <= tabWidth; i++) {
- StringBuffer prefix= new StringBuffer();
+ final IPreferenceStore store =
+ PHPeclipsePlugin.getDefault().getPreferenceStore();
+
+ int tabWidth = store.getInt(PHPeclipsePlugin.FORMATTER_TAB_SIZE);
+ boolean useSpaces = store.getBoolean(PHPeclipsePlugin.SPACES_FOR_TABS);
+
+ for (int i = 0; i <= tabWidth; i++) {
+ StringBuffer prefix = new StringBuffer();
if (useSpaces) {
- for (int j= 0; j + i < tabWidth; j++)
- prefix.append(' ');
-
+ for (int j = 0; j + i < tabWidth; j++)
+ prefix.append(' ');
+
if (i != 0)
- prefix.append('\t');
- } else {
- for (int j= 0; j < i; j++)
- prefix.append(' ');
-
+ prefix.append('\t');
+ } else {
+ for (int j = 0; j < i; j++)
+ prefix.append(' ');
+
if (i != tabWidth)
- prefix.append('\t');
+ prefix.append('\t');
}
-
+
vector.add(prefix.toString());
}
vector.add(""); //$NON-NLS-1$
-
+
return (String[]) vector.toArray(new String[vector.size()]);
}
/* (non-Javadoc)
@@ -252,32 +279,47 @@ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
*/
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
- PHPColorProvider provider = PHPEditorEnvironment.getPHPColorProvider();
+ // PHPColorProvider provider = PHPEditorEnvironment.getPHPColorProvider();
+ JavaColorManager provider = PHPEditorEnvironment.getPHPColorProvider();
PresentationReconciler reconciler = new PresentationReconciler();
-
- DefaultDamagerRepairer dr= new DefaultDamagerRepairer(PHPEditorEnvironment.getHTMLCodeScanner());
+
+ DefaultDamagerRepairer dr =
+ new DefaultDamagerRepairer(PHPEditorEnvironment.getHTMLCodeScanner());
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
-
-// dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(provider.HTML_DEFAULT))));
-// reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
-// reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
- dr = new DefaultDamagerRepairer(PHPEditorEnvironment.getPHPCodeScanner());
+ // dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(provider.HTML_DEFAULT))));
+ // reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ // reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+
+ dr = new DefaultDamagerRepairer(PHPEditorEnvironment.getPHPCodeScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.PHP);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.PHP);
- dr = new DefaultDamagerRepairer(PHPEditorEnvironment.getPHPDocCodeScanner());
- reconciler.setDamager(dr, IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
- reconciler.setRepairer(dr, IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
-
+ dr =
+ new DefaultDamagerRepairer(PHPEditorEnvironment.getPHPDocCodeScanner());
+ reconciler.setDamager(
+ dr,
+ IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
+ reconciler.setRepairer(
+ dr,
+ IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
+
dr = new DefaultDamagerRepairer(PHPEditorEnvironment.getHTMLCodeScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.HTML);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.HTML);
- dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT))));
- reconciler.setDamager(dr, IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
- reconciler.setRepairer(dr, IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
+ dr =
+ new DefaultDamagerRepairer(
+ new SingleTokenScanner(
+ new TextAttribute(
+ provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT))));
+ reconciler.setDamager(
+ dr,
+ IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
+ reconciler.setRepairer(
+ dr,
+ IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
return reconciler;
}
@@ -292,7 +334,9 @@ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
- public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
+ public ITextHover getTextHover(
+ ISourceViewer sourceViewer,
+ String contentType) {
return new PHPTextHover();
}
}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSyntaxParserThread.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSyntaxParserThread.java
new file mode 100644
index 0000000..79130b0
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPSyntaxParserThread.java
@@ -0,0 +1,421 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.editors.text.TextEditor;
+
+import test.PHPParserManager;
+import test.PHPParserSuperclass;
+
+
+public class PHPSyntaxParserThread extends Thread {
+ private static String[] EXTENSIONS = { ".php", ".php3", ".php4", ".inc", ".phtml" };
+
+ private String text = "";
+ private String previousText = "";
+
+ private boolean stopValidation = false;
+ private boolean validationTerminated = false;
+ private boolean isActive = false;
+
+ private TextEditor fTextEditor;
+ private ISourceViewer fSourceViewer;
+
+ private int previousHashCode = 0;
+ // Defaults
+ private int validationInterval = 2000; //millis
+ private int waitForTermination = 400; // millis
+ private int maxErrorsShown = 10;
+
+ public PHPSyntaxParserThread(
+ TextEditor textEditor,
+ ISourceViewer viewer) {
+ super();
+ fTextEditor = textEditor;
+ fSourceViewer = viewer;
+ }
+
+ public void setText(String text) {
+ if (!isActive)
+ this.text = text;
+ }
+
+ public void setText(String text, boolean forceUpdate) {
+ if (!isActive) {
+ this.text = text;
+ }
+
+ if (forceUpdate) {
+ this.previousText = "";
+ this.previousHashCode = 0;
+ }
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setInterval(int millis) {
+ this.validationInterval = millis;
+ }
+
+ public int getInterval() {
+ return validationInterval;
+ }
+
+ public void setErrorsShown(int number) {
+ this.maxErrorsShown = number;
+ }
+
+ public int getErrorsShown() {
+ return maxErrorsShown;
+ }
+
+ public void dispose() {
+ this.stopValidation = true;
+
+ if (validationTerminated == false) {
+
+ try {
+ Thread.sleep(waitForTermination);
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ public void run() {
+ while (stopValidation == false) {
+ try {
+
+ this.isActive = true;
+ boolean ret = this.validateSyntax();
+
+ this.previousText = this.text;
+ this.isActive = false;
+
+ Thread.sleep(validationInterval);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ this.validationTerminated = true;
+ }
+
+ public boolean validateSyntax() {
+
+ boolean phpFlag = false;
+ try {
+ IFile fileToParse = getPHPFile(fTextEditor.getEditorInput());
+ if (fileToParse == null) {
+ // should never happen
+ System.err.println("Error : no file in the editor");
+ // should throw an exception
+ return false;
+ }
+ String name = fileToParse.getName();
+ for (int i = 0; i 0) {
+// content.append(new String(buffer));
+// }
+// in.close();
+//
+// //jjjjjjj
+// // DEBUG start
+// System.out.println("-----------------------------------------");
+// System.out.println(" OUTPUT");
+// System.out.println("-----------------------------------------");
+// System.out.println(content);
+// System.out.println("-----------------------------------------");
+// // DEBUG END
+//
+// String line = null;
+// List lines = new ArrayList();
+// int index;
+//
+// // Compare checksums
+// int hashCode = content.toString().hashCode();
+//
+// if (previousHashCode == hashCode) {
+//
+// return true;
+// }
+//
+// previousHashCode = hashCode;
+//
+// StringTokenizer st = new StringTokenizer(content.toString(), "\n");
+//
+// int lineCount = 0;
+//
+// while (st.hasMoreTokens()) {
+// line = st.nextToken();
+// if (line.indexOf("\r") != -1) {
+// line = line.substring(0, line.indexOf("\r"));
+// }
+//
+// lines.add(line);
+// if (++lineCount >= maxErrorsShown) {
+// break;
+// }
+//
+// }
+//
+// //Delete markers
+// resource.deleteMarkers(IMarker.PROBLEM, true, 1);
+//
+// // Markers have to be added in reverse order
+// // Otherwise lower line number will appear at the end of the list
+// for (int i = lines.size() - 1; i >= 0; i--) {
+// line = (String) lines.get(i);
+//
+// // If error message is not from temporary file, skip
+// if (line.indexOf(tmpFileName) == -1) {
+// continue;
+// }
+//
+// // Delete filename from error message
+// StringBuffer lineSb = new StringBuffer(line);
+// replace(lineSb, tmpFileName + " ", "", true);
+// line = lineSb.toString();
+//
+// if ((index = line.indexOf(PERL_ERROR_INDICATOR)) != -1) {
+//
+// // truncatedLIne is the stripped error-line up to the next " " after the line number if present
+// // To avoid cluttering with other "." and "," which might occur in the error message
+// String truncatedLine = line;
+// if (truncatedLine
+// .indexOf(" ", index + PERL_ERROR_INDICATOR.length() + 1)
+// != -1) {
+// truncatedLine =
+// truncatedLine.substring(
+// 0,
+// truncatedLine.indexOf(
+// " ",
+// index + PERL_ERROR_INDICATOR.length() + 1));
+// }
+//
+// int endIndex;
+// if ((endIndex = truncatedLine.indexOf(".", index)) == -1) {
+// endIndex = truncatedLine.indexOf(",", index);
+// }
+//
+// if (endIndex == -1) {
+// continue;
+// }
+//
+// String lineNr =
+// truncatedLine.substring(
+// index + PERL_ERROR_INDICATOR.length(),
+// endIndex);
+//
+// // If there is an addition to the error message
+// if (i + 1 < lines.size()) {
+// if (((String) lines.get(i + 1)).startsWith(" ")) {
+// line += " " + (String) lines.get(i + 1);
+// }
+// }
+//
+// IMarker marker = resource.createMarker(IMarker.PROBLEM);
+//
+// // Check if it's a warning
+// boolean isWarning = false;
+//
+// for (int x = 0; x < WARNING_STRINGS.length; x++) {
+// if (truncatedLine.indexOf(WARNING_STRINGS[x]) != -1) {
+// isWarning = true;
+// }
+// }
+//
+// if (isWarning) {
+// marker.setAttribute(
+// IMarker.SEVERITY,
+// IMarker.SEVERITY_WARNING);
+// } else {
+// marker.setAttribute(
+// IMarker.SEVERITY,
+// IMarker.SEVERITY_ERROR);
+// }
+//
+// marker.setAttribute(IMarker.MESSAGE, line);
+//
+// marker.setAttribute(
+// IMarker.LINE_NUMBER,
+// Integer.parseInt(lineNr));
+//
+// Position pos =
+// new Position(
+// fSourceViewer.getDocument().getLineOffset(
+// Integer.parseInt(lineNr) - 1));
+// fSourceViewer.getAnnotationModel().addAnnotation(
+// new MarkerAnnotation(marker),
+// pos);
+//
+// }
+// }
+//
+// } catch (Exception e) {
+// e.printStackTrace();
+// if (proc != null) {
+// killProcess(proc);
+// }
+// return false;
+// } finally {
+// try {
+// // Delete tmp file
+// new File(tmpFileName).delete();
+// } catch (Exception ex) {
+// ex.printStackTrace();
+// }
+// }
+
+ return true;
+
+ }
+
+ /**
+ * Finds the file that's currently opened in the PHP Text Editor
+ */
+ protected IFile getPHPFile(IEditorInput editorInput) {
+ if (editorInput instanceof IFileEditorInput)
+ return ((IFileEditorInput) editorInput).getFile();
+
+ return null;
+ }
+
+ protected void parse(IFile fileToParse, InputStream iStream) {
+
+ StringBuffer buf = new StringBuffer();
+ int c0;
+ try {
+ while ((c0 = iStream.read()) != (-1)) {
+ buf.append((char) c0);
+ }
+ } catch (IOException e) {
+ return;
+ }
+ String input = buf.toString();
+
+ PHPParserSuperclass parser = PHPParserManager.getParser(fileToParse);
+ try {
+ parser.parse(input);
+ } catch (CoreException e) {
+ }
+ }
+
+ private void killProcess(Process proc) {
+ while (true) {
+ try {
+ proc.destroy();
+ proc.exitValue();
+ } catch (Exception ex) {
+
+ continue;
+ }
+ break;
+ }
+ }
+
+ // Replaces all instances of the String o with the String n in the
+ // StringBuffer orig if all is true, or only the first instance if all is false.
+ private static void replace(
+ StringBuffer orig,
+ String o,
+ String n,
+ boolean all) {
+ if (orig == null || o == null || o.length() == 0 || n == null)
+ throw new IllegalArgumentException("Null or zero-length String");
+
+ int i = 0;
+
+ while (i + o.length() <= orig.length()) {
+ if (orig.substring(i, i + o.length()).equals(o)) {
+ orig.replace(i, i + o.length(), n);
+ if (!all)
+ break;
+ else
+ i += n.length();
+ } else
+ i++;
+ }
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPUnitEditor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPUnitEditor.java
new file mode 100644
index 0000000..8eca420
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPUnitEditor.java
@@ -0,0 +1,1383 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher;
+import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionManager;
+import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI;
+import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI.ExitFlags;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
+import net.sourceforge.phpeclipse.PHPCore;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.text.AbstractHoverInformationControlManager;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentCommand;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ILineTracker;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewerExtension;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.IWidgetTokenKeeper;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.VerifyKeyListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+ Klaus Hartlage - www.eclipseproject.de
+**********************************************************************/
+/**
+ * PHP specific text editor.
+ */
+public class PHPUnitEditor extends PHPEditor {
+ interface ITextConverter {
+ void customizeDocumentCommand(IDocument document, DocumentCommand command);
+ };
+
+ class AdaptedRulerLayout extends Layout {
+
+ protected int fGap;
+ protected AdaptedSourceViewer fAdaptedSourceViewer;
+
+ protected AdaptedRulerLayout(int gap, AdaptedSourceViewer asv) {
+ fGap = gap;
+ fAdaptedSourceViewer = asv;
+ }
+
+ protected Point computeSize(
+ Composite composite,
+ int wHint,
+ int hHint,
+ boolean flushCache) {
+ Control[] children = composite.getChildren();
+ Point s =
+ children[children.length
+ - 1].computeSize(SWT.DEFAULT, SWT.DEFAULT, flushCache);
+ if (fAdaptedSourceViewer.isVerticalRulerVisible())
+ s.x += fAdaptedSourceViewer.getVerticalRuler().getWidth() + fGap;
+ return s;
+ }
+
+ protected void layout(Composite composite, boolean flushCache) {
+ Rectangle clArea = composite.getClientArea();
+ if (fAdaptedSourceViewer.isVerticalRulerVisible()) {
+
+ StyledText textWidget = fAdaptedSourceViewer.getTextWidget();
+ Rectangle trim = textWidget.computeTrim(0, 0, 0, 0);
+ int scrollbarHeight = trim.height;
+
+ IVerticalRuler vr = fAdaptedSourceViewer.getVerticalRuler();
+ int vrWidth = vr.getWidth();
+
+ int orWidth = 0;
+ if (fAdaptedSourceViewer.isOverviewRulerVisible()) {
+ OverviewRuler or = fAdaptedSourceViewer.getOverviewRuler();
+ orWidth = or.getWidth();
+ or.getControl().setBounds(
+ clArea.width - orWidth,
+ scrollbarHeight,
+ orWidth,
+ clArea.height - 3 * scrollbarHeight);
+ }
+
+ textWidget.setBounds(
+ vrWidth + fGap,
+ 0,
+ clArea.width - vrWidth - orWidth - 2 * fGap,
+ clArea.height);
+ vr.getControl().setBounds(
+ 0,
+ 0,
+ vrWidth,
+ clArea.height - scrollbarHeight);
+
+ } else {
+ StyledText textWidget = fAdaptedSourceViewer.getTextWidget();
+ textWidget.setBounds(0, 0, clArea.width, clArea.height);
+ }
+ }
+ };
+
+ class AdaptedSourceViewer
+ extends SourceViewer { // extends JavaCorrectionSourceViewer {
+
+ private List fTextConverters;
+
+ private OverviewRuler fOverviewRuler;
+ private boolean fIsOverviewRulerVisible;
+ /** The viewer's overview ruler hovering controller */
+ private AbstractHoverInformationControlManager fOverviewRulerHoveringController;
+
+ private boolean fIgnoreTextConverters = false;
+
+ private IVerticalRuler fCachedVerticalRuler;
+ private boolean fCachedIsVerticalRulerVisible;
+
+ public AdaptedSourceViewer(
+ Composite parent,
+ IVerticalRuler ruler,
+ int styles) {
+ super(parent, ruler, styles); //, CompilationUnitEditor.this);
+
+ fCachedVerticalRuler = ruler;
+ fCachedIsVerticalRulerVisible = (ruler != null);
+ fOverviewRuler = new OverviewRuler(VERTICAL_RULER_WIDTH);
+
+ delayedCreateControl(parent, styles);
+ }
+
+ /*
+ * @see ISourceViewer#showAnnotations(boolean)
+ */
+ public void showAnnotations(boolean show) {
+ fCachedIsVerticalRulerVisible = (show && fCachedVerticalRuler != null);
+ // super.showAnnotations(show);
+ }
+
+ public IContentAssistant getContentAssistant() {
+ return fContentAssistant;
+ }
+
+ /*
+ * @see ITextOperationTarget#doOperation(int)
+ */
+ public void doOperation(int operation) {
+
+ if (getTextWidget() == null)
+ return;
+
+ switch (operation) {
+ case CONTENTASSIST_PROPOSALS :
+ String msg = fContentAssistant.showPossibleCompletions();
+ setStatusLineErrorMessage(msg);
+ return;
+ case UNDO :
+ fIgnoreTextConverters = true;
+ break;
+ case REDO :
+ fIgnoreTextConverters = true;
+ break;
+ }
+
+ super.doOperation(operation);
+ }
+
+ public void insertTextConverter(ITextConverter textConverter, int index) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void addTextConverter(ITextConverter textConverter) {
+ if (fTextConverters == null) {
+ fTextConverters = new ArrayList(1);
+ fTextConverters.add(textConverter);
+ } else if (!fTextConverters.contains(textConverter))
+ fTextConverters.add(textConverter);
+ }
+
+ public void removeTextConverter(ITextConverter textConverter) {
+ if (fTextConverters != null) {
+ fTextConverters.remove(textConverter);
+ if (fTextConverters.size() == 0)
+ fTextConverters = null;
+ }
+ }
+
+ /*
+ * @see TextViewer#customizeDocumentCommand(DocumentCommand)
+ */
+ protected void customizeDocumentCommand(DocumentCommand command) {
+ super.customizeDocumentCommand(command);
+ if (!fIgnoreTextConverters && fTextConverters != null) {
+ for (Iterator e = fTextConverters.iterator(); e.hasNext();)
+ ((ITextConverter) e.next()).customizeDocumentCommand(
+ getDocument(),
+ command);
+ }
+ fIgnoreTextConverters = false;
+ }
+
+ public IVerticalRuler getVerticalRuler() {
+ return fCachedVerticalRuler;
+ }
+
+ public boolean isVerticalRulerVisible() {
+ return fCachedIsVerticalRulerVisible;
+ }
+
+ public OverviewRuler getOverviewRuler() {
+ return fOverviewRuler;
+ }
+
+ /*
+ * @see TextViewer#createControl(Composite, int)
+ */
+ protected void createControl(Composite parent, int styles) {
+ // do nothing here
+ }
+
+ protected void delayedCreateControl(Composite parent, int styles) {
+ //create the viewer
+ super.createControl(parent, styles);
+
+ Control control = getControl();
+ if (control instanceof Composite) {
+ Composite composite = (Composite) control;
+ composite.setLayout(new AdaptedRulerLayout(GAP_SIZE, this));
+ fOverviewRuler.createControl(composite, this);
+ }
+ }
+
+ private void ensureOverviewHoverManagerInstalled() {
+ if (fOverviewRulerHoveringController == null
+ && fAnnotationHover != null
+ && fHoverControlCreator != null) {
+ fOverviewRulerHoveringController =
+ new OverviewRulerHoverManager(
+ fOverviewRuler,
+ this,
+ fAnnotationHover,
+ fHoverControlCreator);
+ fOverviewRulerHoveringController.install(fOverviewRuler.getControl());
+ }
+ }
+
+ public void hideOverviewRuler() {
+ fIsOverviewRulerVisible = false;
+ Control control = getControl();
+ if (control instanceof Composite) {
+ Composite composite = (Composite) control;
+ composite.layout();
+ }
+ if (fOverviewRulerHoveringController != null) {
+ fOverviewRulerHoveringController.dispose();
+ fOverviewRulerHoveringController = null;
+ }
+ }
+
+ public void showOverviewRuler() {
+ fIsOverviewRulerVisible = true;
+ Control control = getControl();
+ if (control instanceof Composite) {
+ Composite composite = (Composite) control;
+ composite.layout();
+ }
+ ensureOverviewHoverManagerInstalled();
+ }
+
+ public boolean isOverviewRulerVisible() {
+ return fIsOverviewRulerVisible;
+ }
+
+ /*
+ * @see ISourceViewer#setDocument(IDocument, IAnnotationModel, int, int)
+ */
+ public void setDocument(
+ IDocument document,
+ IAnnotationModel annotationModel,
+ int visibleRegionOffset,
+ int visibleRegionLength) {
+ super.setDocument(
+ document,
+ annotationModel,
+ visibleRegionOffset,
+ visibleRegionLength);
+ fOverviewRuler.setModel(annotationModel);
+ }
+
+ // http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
+ public void updateIndentationPrefixes() {
+ SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+ String[] types = configuration.getConfiguredContentTypes(this);
+ for (int i = 0; i < types.length; i++) {
+ String[] prefixes = configuration.getIndentPrefixes(this, types[i]);
+ if (prefixes != null && prefixes.length > 0)
+ setIndentPrefixes(prefixes, types[i]);
+ }
+ }
+
+ /*
+ * @see IWidgetTokenOwner#requestWidgetToken(IWidgetTokenKeeper)
+ */
+ public boolean requestWidgetToken(IWidgetTokenKeeper requester) {
+ if (WorkbenchHelp.isContextHelpDisplayed())
+ return false;
+ return super.requestWidgetToken(requester);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.ISourceViewer#configure(org.eclipse.jface.text.source.SourceViewerConfiguration)
+ */
+ public void configure(SourceViewerConfiguration configuration) {
+ super.configure(configuration);
+ // prependAutoEditStrategy(new SmartBracesAutoEditStrategy(this), IDocument.DEFAULT_CONTENT_TYPE);
+ }
+
+ protected void handleDispose() {
+ fOverviewRuler = null;
+
+ if (fOverviewRulerHoveringController != null) {
+ fOverviewRulerHoveringController.dispose();
+ fOverviewRulerHoveringController = null;
+ }
+
+ super.handleDispose();
+ }
+
+ };
+
+ static class TabConverter implements ITextConverter {
+
+ private int fTabRatio;
+ private ILineTracker fLineTracker;
+
+ public TabConverter() {
+ }
+
+ public void setNumberOfSpacesPerTab(int ratio) {
+ fTabRatio = ratio;
+ }
+
+ public void setLineTracker(ILineTracker lineTracker) {
+ fLineTracker = lineTracker;
+ }
+
+ private int insertTabString(StringBuffer buffer, int offsetInLine) {
+
+ if (fTabRatio == 0)
+ return 0;
+
+ int remainder = offsetInLine % fTabRatio;
+ remainder = fTabRatio - remainder;
+ for (int i = 0; i < remainder; i++)
+ buffer.append(' ');
+ return remainder;
+ }
+
+ public void customizeDocumentCommand(
+ IDocument document,
+ DocumentCommand command) {
+ String text = command.text;
+ if (text == null)
+ return;
+
+ int index = text.indexOf('\t');
+ if (index > -1) {
+
+ StringBuffer buffer = new StringBuffer();
+
+ fLineTracker.set(command.text);
+ int lines = fLineTracker.getNumberOfLines();
+
+ try {
+
+ for (int i = 0; i < lines; i++) {
+
+ int offset = fLineTracker.getLineOffset(i);
+ int endOffset = offset + fLineTracker.getLineLength(i);
+ String line = text.substring(offset, endOffset);
+
+ int position = 0;
+ if (i == 0) {
+ IRegion firstLine =
+ document.getLineInformationOfOffset(command.offset);
+ position = command.offset - firstLine.getOffset();
+ }
+
+ int length = line.length();
+ for (int j = 0; j < length; j++) {
+ char c = line.charAt(j);
+ if (c == '\t') {
+ position += insertTabString(buffer, position);
+ } else {
+ buffer.append(c);
+ ++position;
+ }
+ }
+
+ }
+
+ command.text = buffer.toString();
+
+ } catch (BadLocationException x) {
+ }
+ }
+ }
+ };
+
+ private static class ExitPolicy implements LinkedPositionUI.ExitPolicy {
+
+ final char fExitCharacter;
+
+ public ExitPolicy(char exitCharacter) {
+ fExitCharacter= exitCharacter;
+ }
+
+ /*
+ * @see org.phpeclipse.phpdt.internal.ui.text.link.LinkedPositionUI.ExitPolicy#doExit(org.phpeclipse.phpdt.internal.ui.text.link.LinkedPositionManager, org.eclipse.swt.events.VerifyEvent, int, int)
+ */
+ public ExitFlags doExit(LinkedPositionManager manager, VerifyEvent event, int offset, int length) {
+
+ if (event.character == fExitCharacter) {
+ if (manager.anyPositionIncludes(offset, length))
+ return new ExitFlags(LinkedPositionUI.COMMIT| LinkedPositionUI.UPDATE_CARET, false);
+ else
+ return new ExitFlags(LinkedPositionUI.COMMIT, true);
+ }
+
+ switch (event.character) {
+ case '\b':
+ if (manager.getFirstPosition().length == 0)
+ return new ExitFlags(0, false);
+ else
+ return null;
+
+ case '\n':
+ case '\r':
+ return new ExitFlags(LinkedPositionUI.COMMIT, true);
+
+ default:
+ return null;
+ }
+ }
+
+ }
+ private class BracketInserter implements VerifyKeyListener, LinkedPositionUI.ExitListener {
+
+ private boolean fCloseBrackets= true;
+ private boolean fCloseStrings= true;
+
+ private int fOffset;
+ private int fLength;
+
+ public void setCloseBracketsEnabled(boolean enabled) {
+ fCloseBrackets= enabled;
+ }
+
+ public void setCloseStringsEnabled(boolean enabled) {
+ fCloseStrings= enabled;
+ }
+
+ private boolean hasIdentifierToTheRight(IDocument document, int offset) {
+ try {
+ int end= offset;
+ IRegion endLine= document.getLineInformationOfOffset(end);
+ int maxEnd= endLine.getOffset() + endLine.getLength();
+ while (end != maxEnd && Character.isWhitespace(document.getChar(end)))
+ ++end;
+
+ return end != maxEnd && Character.isJavaIdentifierPart(document.getChar(end));
+
+ } catch (BadLocationException e) {
+ // be conservative
+ return true;
+ }
+ }
+
+ private boolean hasIdentifierToTheLeft(IDocument document, int offset) {
+ try {
+ int start= offset;
+ IRegion startLine= document.getLineInformationOfOffset(start);
+ int minStart= startLine.getOffset();
+ while (start != minStart && Character.isWhitespace(document.getChar(start - 1)))
+ --start;
+
+ return start != minStart && Character.isJavaIdentifierPart(document.getChar(start - 1));
+
+ } catch (BadLocationException e) {
+ return true;
+ }
+ }
+
+ private boolean hasCharacterToTheRight(IDocument document, int offset, char character) {
+ try {
+ int end= offset;
+ IRegion endLine= document.getLineInformationOfOffset(end);
+ int maxEnd= endLine.getOffset() + endLine.getLength();
+ while (end != maxEnd && Character.isWhitespace(document.getChar(end)))
+ ++end;
+
+ return end != maxEnd && document.getChar(end) == character;
+
+
+ } catch (BadLocationException e) {
+ // be conservative
+ return true;
+ }
+ }
+
+ /*
+ * @see org.eclipse.swt.custom.VerifyKeyListener#verifyKey(org.eclipse.swt.events.VerifyEvent)
+ */
+ public void verifyKey(VerifyEvent event) {
+
+ if (!event.doit)
+ return;
+
+ final ISourceViewer sourceViewer= getSourceViewer();
+ IDocument document= sourceViewer.getDocument();
+
+ final Point selection= sourceViewer.getSelectedRange();
+ final int offset= selection.x;
+ final int length= selection.y;
+
+ switch (event.character) {
+ case '(':
+ if (hasCharacterToTheRight(document, offset + length, '('))
+ return;
+
+ // fall through
+
+ case '[':
+ if (!fCloseBrackets)
+ return;
+ if (hasIdentifierToTheRight(document, offset + length))
+ return;
+
+ // fall through
+
+ case '"':
+ if (event.character == '"') {
+ if (!fCloseStrings)
+ return;
+ if (hasIdentifierToTheLeft(document, offset) || hasIdentifierToTheRight(document, offset + length))
+ return;
+ }
+
+ try {
+ ITypedRegion partition= document.getPartition(offset);
+ if (! IDocument.DEFAULT_CONTENT_TYPE.equals(partition.getType()) && partition.getOffset() != offset)
+ return;
+
+ final char character= event.character;
+ final char closingCharacter= getPeerCharacter(character);
+ final StringBuffer buffer= new StringBuffer();
+ buffer.append(character);
+ buffer.append(closingCharacter);
+
+ document.replace(offset, length, buffer.toString());
+
+ LinkedPositionManager manager= new LinkedPositionManager(document);
+ manager.addPosition(offset + 1, 0);
+
+ fOffset= offset;
+ fLength= 2;
+
+ LinkedPositionUI editor= new LinkedPositionUI(sourceViewer, manager);
+ editor.setCancelListener(this);
+ editor.setExitPolicy(new ExitPolicy(closingCharacter));
+ editor.setFinalCaretOffset(offset + 2);
+ editor.enter();
+
+ IRegion newSelection= editor.getSelectedRegion();
+ sourceViewer.setSelectedRange(newSelection.getOffset(), newSelection.getLength());
+
+ event.doit= false;
+
+ } catch (BadLocationException e) {
+ }
+ break;
+ }
+ }
+
+ /*
+ * @see org.phpeclipse.phpdt.internal.ui.text.link.LinkedPositionUI.ExitListener#exit(boolean)
+ */
+ public void exit(boolean accept) {
+ if (accept)
+ return;
+
+ // remove brackets
+ try {
+ final ISourceViewer sourceViewer= getSourceViewer();
+ IDocument document= sourceViewer.getDocument();
+ document.replace(fOffset, fLength, null);
+ } catch (BadLocationException e) {
+ }
+ }
+
+ }
+ /** The editor's paint manager */
+ private PaintManager fPaintManager;
+ /** The editor's bracket painter */
+ private BracketPainter fBracketPainter;
+ /** The editor's bracket matcher */
+ private PHPPairMatcher fBracketMatcher;
+ /** The editor's line painter */
+ private LinePainter fLinePainter;
+ /** The editor's print margin ruler painter */
+ private PrintMarginPainter fPrintMarginPainter;
+ /** The editor's problem painter */
+ private ProblemPainter fProblemPainter;
+ /** The editor's tab converter */
+ private TabConverter fTabConverter;
+ /** History for structure select action */
+ //private SelectionHistory fSelectionHistory;
+
+ /** The preference property change listener for php core. */
+ private IPropertyChangeListener fPropertyChangeListener= new PropertyChangeListener();
+ /** The remembered selection */
+ private ITextSelection fRememberedSelection;
+ /** The remembered php element offset */
+ private int fRememberedElementOffset;
+ /** The bracket inserter. */
+ private BracketInserter fBracketInserter= new BracketInserter();
+
+ private class PropertyChangeListener implements IPropertyChangeListener {
+ /*
+ * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+ */
+ public void propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) {
+ handlePreferencePropertyChanged(event);
+ }
+ }
+ /* Preference key for code formatter tab size */
+ private final static String CODE_FORMATTER_TAB_SIZE =
+ PHPCore.FORMATTER_TAB_SIZE;
+ /** Preference key for matching brackets */
+ private final static String MATCHING_BRACKETS =
+ PreferenceConstants.EDITOR_MATCHING_BRACKETS;
+ /** Preference key for matching brackets color */
+ private final static String MATCHING_BRACKETS_COLOR =
+ PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR;
+ /** Preference key for highlighting current line */
+ private final static String CURRENT_LINE =
+ PreferenceConstants.EDITOR_CURRENT_LINE;
+ /** Preference key for highlight color of current line */
+ private final static String CURRENT_LINE_COLOR =
+ PreferenceConstants.EDITOR_CURRENT_LINE_COLOR;
+ /** Preference key for showing print marging ruler */
+ private final static String PRINT_MARGIN =
+ PreferenceConstants.EDITOR_PRINT_MARGIN;
+ /** Preference key for print margin ruler color */
+ private final static String PRINT_MARGIN_COLOR =
+ PreferenceConstants.EDITOR_PRINT_MARGIN_COLOR;
+ /** Preference key for print margin ruler column */
+ private final static String PRINT_MARGIN_COLUMN =
+ PreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN;
+ /** Preference key for inserting spaces rather than tabs */
+ private final static String SPACES_FOR_TABS =
+ PreferenceConstants.EDITOR_SPACES_FOR_TABS;
+ /** Preference key for error indication */
+ private final static String ERROR_INDICATION =
+ PreferenceConstants.EDITOR_PROBLEM_INDICATION;
+ /** Preference key for error color */
+ private final static String ERROR_INDICATION_COLOR =
+ PreferenceConstants.EDITOR_PROBLEM_INDICATION_COLOR;
+ /** Preference key for warning indication */
+ private final static String WARNING_INDICATION =
+ PreferenceConstants.EDITOR_WARNING_INDICATION;
+ /** Preference key for warning color */
+ private final static String WARNING_INDICATION_COLOR =
+ PreferenceConstants.EDITOR_WARNING_INDICATION_COLOR;
+ /** Preference key for task indication */
+ private final static String TASK_INDICATION =
+ PreferenceConstants.EDITOR_TASK_INDICATION;
+ /** Preference key for task color */
+ private final static String TASK_INDICATION_COLOR =
+ PreferenceConstants.EDITOR_TASK_INDICATION_COLOR;
+ /** Preference key for bookmark indication */
+ private final static String BOOKMARK_INDICATION =
+ PreferenceConstants.EDITOR_BOOKMARK_INDICATION;
+ /** Preference key for bookmark color */
+ private final static String BOOKMARK_INDICATION_COLOR =
+ PreferenceConstants.EDITOR_BOOKMARK_INDICATION_COLOR;
+ /** Preference key for search result indication */
+ private final static String SEARCH_RESULT_INDICATION =
+ PreferenceConstants.EDITOR_SEARCH_RESULT_INDICATION;
+ /** Preference key for search result color */
+ private final static String SEARCH_RESULT_INDICATION_COLOR =
+ PreferenceConstants.EDITOR_SEARCH_RESULT_INDICATION_COLOR;
+ /** Preference key for unknown annotation indication */
+ private final static String UNKNOWN_INDICATION =
+ PreferenceConstants.EDITOR_UNKNOWN_INDICATION;
+ /** Preference key for unknown annotation color */
+ private final static String UNKNOWN_INDICATION_COLOR =
+ PreferenceConstants.EDITOR_UNKNOWN_INDICATION_COLOR;
+ /** Preference key for linked position color */
+ private final static String LINKED_POSITION_COLOR =
+ PreferenceConstants.EDITOR_LINKED_POSITION_COLOR;
+ /** Preference key for shwoing the overview ruler */
+ private final static String OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_OVERVIEW_RULER;
+
+ /** Preference key for error indication in overview ruler */
+ private final static String ERROR_INDICATION_IN_OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_ERROR_INDICATION_IN_OVERVIEW_RULER;
+ /** Preference key for warning indication in overview ruler */
+ private final static String WARNING_INDICATION_IN_OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_WARNING_INDICATION_IN_OVERVIEW_RULER;
+ /** Preference key for task indication in overview ruler */
+ private final static String TASK_INDICATION_IN_OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_TASK_INDICATION_IN_OVERVIEW_RULER;
+ /** Preference key for bookmark indication in overview ruler */
+ private final static String BOOKMARK_INDICATION_IN_OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_BOOKMARK_INDICATION_IN_OVERVIEW_RULER;
+ /** Preference key for search result indication in overview ruler */
+ private final static String SEARCH_RESULT_INDICATION_IN_OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_SEARCH_RESULT_INDICATION_IN_OVERVIEW_RULER;
+ /** Preference key for unknown annotation indication in overview ruler */
+ private final static String UNKNOWN_INDICATION_IN_OVERVIEW_RULER =
+ PreferenceConstants.EDITOR_UNKNOWN_INDICATION_IN_OVERVIEW_RULER;
+ /** Preference key for automatically closing strings */
+ private final static String CLOSE_STRINGS= PreferenceConstants.EDITOR_CLOSE_STRINGS;
+ /** Preference key for automatically wrapping Java strings */
+ private final static String WRAP_STRINGS= PreferenceConstants.EDITOR_WRAP_STRINGS;
+ /** Preference key for automatically closing brackets and parenthesis */
+ private final static String CLOSE_BRACKETS= PreferenceConstants.EDITOR_CLOSE_BRACKETS;
+ /** Preference key for automatically closing phpdocs and comments */
+ private final static String CLOSE_JAVADOCS= PreferenceConstants.EDITOR_CLOSE_JAVADOCS;
+ /** Preference key for automatically adding phpdoc tags */
+ private final static String ADD_JAVADOC_TAGS= PreferenceConstants.EDITOR_ADD_JAVADOC_TAGS;
+ /** Preference key for automatically formatting phpdocs */
+ private final static String FORMAT_JAVADOCS= PreferenceConstants.EDITOR_FORMAT_JAVADOCS;
+ /** Preference key for smart paste */
+ private final static String SMART_PASTE= PreferenceConstants.EDITOR_SMART_PASTE;
+ private final static class AnnotationInfo {
+ public String fColorPreference;
+ public String fOverviewRulerPreference;
+ public String fEditorPreference;
+ };
+
+ private final static Map ANNOTATION_MAP;
+ static {
+
+ AnnotationInfo info;
+ ANNOTATION_MAP = new HashMap();
+
+ info = new AnnotationInfo();
+ info.fColorPreference = TASK_INDICATION_COLOR;
+ info.fOverviewRulerPreference = TASK_INDICATION_IN_OVERVIEW_RULER;
+ info.fEditorPreference = TASK_INDICATION;
+ ANNOTATION_MAP.put(AnnotationType.TASK, info);
+
+ info = new AnnotationInfo();
+ info.fColorPreference = ERROR_INDICATION_COLOR;
+ info.fOverviewRulerPreference = ERROR_INDICATION_IN_OVERVIEW_RULER;
+ info.fEditorPreference = ERROR_INDICATION;
+ ANNOTATION_MAP.put(AnnotationType.ERROR, info);
+
+ info = new AnnotationInfo();
+ info.fColorPreference = WARNING_INDICATION_COLOR;
+ info.fOverviewRulerPreference = WARNING_INDICATION_IN_OVERVIEW_RULER;
+ info.fEditorPreference = WARNING_INDICATION;
+ ANNOTATION_MAP.put(AnnotationType.WARNING, info);
+
+ info = new AnnotationInfo();
+ info.fColorPreference = BOOKMARK_INDICATION_COLOR;
+ info.fOverviewRulerPreference = BOOKMARK_INDICATION_IN_OVERVIEW_RULER;
+ info.fEditorPreference = BOOKMARK_INDICATION;
+ ANNOTATION_MAP.put(AnnotationType.BOOKMARK, info);
+
+ info = new AnnotationInfo();
+ info.fColorPreference = SEARCH_RESULT_INDICATION_COLOR;
+ info.fOverviewRulerPreference = SEARCH_RESULT_INDICATION_IN_OVERVIEW_RULER;
+ info.fEditorPreference = SEARCH_RESULT_INDICATION;
+ ANNOTATION_MAP.put(AnnotationType.SEARCH_RESULT, info);
+
+ info = new AnnotationInfo();
+ info.fColorPreference = UNKNOWN_INDICATION_COLOR;
+ info.fOverviewRulerPreference = UNKNOWN_INDICATION_IN_OVERVIEW_RULER;
+ info.fEditorPreference = UNKNOWN_INDICATION;
+ ANNOTATION_MAP.put(AnnotationType.UNKNOWN, info);
+ };
+
+ private final static AnnotationType[] ANNOTATION_LAYERS =
+ new AnnotationType[] {
+ AnnotationType.UNKNOWN,
+ AnnotationType.BOOKMARK,
+ AnnotationType.TASK,
+ AnnotationType.SEARCH_RESULT,
+ AnnotationType.WARNING,
+ AnnotationType.ERROR };
+
+ /**
+ * Creates a new php unit editor.
+ */
+ public PHPUnitEditor() {
+ super();
+ }
+
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ fPaintManager = new PaintManager(getSourceViewer());
+
+ LinePainter linePainter;
+ linePainter = new LinePainter(getSourceViewer());
+
+ linePainter.setHighlightColor(
+ new Color(Display.getCurrent(), 225, 235, 224));
+
+ fPaintManager.addPainter(linePainter);
+
+
+ if (isBracketHighlightingEnabled())
+ startBracketHighlighting();
+ if (isLineHighlightingEnabled())
+ startLineHighlighting();
+ if (isPrintMarginVisible())
+ showPrintMargin();
+
+
+ Iterator e= ANNOTATION_MAP.keySet().iterator();
+ while (e.hasNext()) {
+ AnnotationType type= (AnnotationType) e.next();
+ if (isAnnotationIndicationEnabled(type))
+ startAnnotationIndication(type);
+ }
+
+ if (isTabConversionEnabled())
+ startTabConversion();
+
+ if (isOverviewRulerVisible())
+ showOverviewRuler();
+
+
+ Preferences preferences= PHPeclipsePlugin.getDefault().getPluginPreferences();
+ preferences.addPropertyChangeListener(fPropertyChangeListener);
+
+ IPreferenceStore preferenceStore= getPreferenceStore();
+ boolean closeBrackets= preferenceStore.getBoolean(CLOSE_BRACKETS);
+ boolean closeStrings= preferenceStore.getBoolean(CLOSE_STRINGS);
+
+ fBracketInserter.setCloseBracketsEnabled(closeBrackets);
+ fBracketInserter.setCloseStringsEnabled(closeStrings);
+
+ ISourceViewer sourceViewer= getSourceViewer();
+ if (sourceViewer instanceof ITextViewerExtension)
+ ((ITextViewerExtension) sourceViewer).prependVerifyKeyListener(fBracketInserter);
+
+ }
+
+ private static char getPeerCharacter(char character) {
+ switch (character) {
+ case '(':
+ return ')';
+
+ case ')':
+ return '(';
+
+ case '[':
+ return ']';
+
+ case ']':
+ return '[';
+
+ case '"':
+ return character;
+
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ /*
+ * @see AbstractTextEditor#doSetInput(IEditorInput)
+ */
+ protected void doSetInput(IEditorInput input) throws CoreException {
+ super.doSetInput(input);
+ configureTabConverter();
+ }
+
+ private void startBracketHighlighting() {
+ if (fBracketPainter == null) {
+ ISourceViewer sourceViewer = getSourceViewer();
+ fBracketPainter = new BracketPainter(sourceViewer);
+ fBracketPainter.setHighlightColor(getColor(MATCHING_BRACKETS_COLOR));
+ fPaintManager.addPainter(fBracketPainter);
+ }
+ }
+
+ private void stopBracketHighlighting() {
+ if (fBracketPainter != null) {
+ fPaintManager.removePainter(fBracketPainter);
+ fBracketPainter.deactivate(true);
+ fBracketPainter.dispose();
+ fBracketPainter = null;
+ }
+ }
+
+ private boolean isBracketHighlightingEnabled() {
+ IPreferenceStore store = getPreferenceStore();
+ return store.getBoolean(MATCHING_BRACKETS);
+ }
+
+ private void startLineHighlighting() {
+ if (fLinePainter == null) {
+ ISourceViewer sourceViewer = getSourceViewer();
+ fLinePainter = new LinePainter(sourceViewer);
+ fLinePainter.setHighlightColor(getColor(CURRENT_LINE_COLOR));
+ fPaintManager.addPainter(fLinePainter);
+ }
+ }
+
+ private void stopLineHighlighting() {
+ if (fLinePainter != null) {
+ fPaintManager.removePainter(fLinePainter);
+ fLinePainter.deactivate(true);
+ fLinePainter.dispose();
+ fLinePainter = null;
+ }
+ }
+
+ private boolean isLineHighlightingEnabled() {
+ IPreferenceStore store = getPreferenceStore();
+ return store.getBoolean(CURRENT_LINE);
+ }
+
+ private void showPrintMargin() {
+ if (fPrintMarginPainter == null) {
+ fPrintMarginPainter = new PrintMarginPainter(getSourceViewer());
+ fPrintMarginPainter.setMarginRulerColor(getColor(PRINT_MARGIN_COLOR));
+ fPrintMarginPainter.setMarginRulerColumn(
+ getPreferenceStore().getInt(PRINT_MARGIN_COLUMN));
+ fPaintManager.addPainter(fPrintMarginPainter);
+ }
+ }
+
+ private void hidePrintMargin() {
+ if (fPrintMarginPainter != null) {
+ fPaintManager.removePainter(fPrintMarginPainter);
+ fPrintMarginPainter.deactivate(true);
+ fPrintMarginPainter.dispose();
+ fPrintMarginPainter = null;
+ }
+ }
+
+ private boolean isPrintMarginVisible() {
+ IPreferenceStore store = getPreferenceStore();
+ return store.getBoolean(PRINT_MARGIN);
+ }
+
+ private void startAnnotationIndication(AnnotationType annotationType) {
+ if (fProblemPainter == null) {
+ fProblemPainter = new ProblemPainter(this, getSourceViewer());
+ fPaintManager.addPainter(fProblemPainter);
+ }
+ fProblemPainter.setColor(annotationType, getColor(annotationType));
+ fProblemPainter.paintAnnotations(annotationType, true);
+ fProblemPainter.paint(IPainter.CONFIGURATION);
+ }
+
+ private void shutdownAnnotationIndication() {
+ if (fProblemPainter != null) {
+
+ if (!fProblemPainter.isPaintingAnnotations()) {
+ fPaintManager.removePainter(fProblemPainter);
+ fProblemPainter.deactivate(true);
+ fProblemPainter.dispose();
+ fProblemPainter = null;
+ } else {
+ fProblemPainter.paint(IPainter.CONFIGURATION);
+ }
+ }
+ }
+
+ private void stopAnnotationIndication(AnnotationType annotationType) {
+ if (fProblemPainter != null) {
+ fProblemPainter.paintAnnotations(annotationType, false);
+ shutdownAnnotationIndication();
+ }
+ }
+
+ private boolean isAnnotationIndicationEnabled(AnnotationType annotationType) {
+ IPreferenceStore store = getPreferenceStore();
+ AnnotationInfo info = (AnnotationInfo) ANNOTATION_MAP.get(annotationType);
+ if (info != null)
+ return store.getBoolean(info.fEditorPreference);
+ return false;
+ }
+
+ private boolean isAnnotationIndicationInOverviewRulerEnabled(AnnotationType annotationType) {
+ IPreferenceStore store = getPreferenceStore();
+ AnnotationInfo info = (AnnotationInfo) ANNOTATION_MAP.get(annotationType);
+ if (info != null)
+ return store.getBoolean(info.fOverviewRulerPreference);
+ return false;
+ }
+
+ private void showAnnotationIndicationInOverviewRuler(
+ AnnotationType annotationType,
+ boolean show) {
+ AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
+ OverviewRuler ruler = asv.getOverviewRuler();
+ if (ruler != null) {
+ ruler.setColor(annotationType, getColor(annotationType));
+ ruler.showAnnotation(annotationType, show);
+ ruler.update();
+ }
+ }
+
+ private void setColorInOverviewRuler(
+ AnnotationType annotationType,
+ Color color) {
+ AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
+ OverviewRuler ruler = asv.getOverviewRuler();
+ if (ruler != null) {
+ ruler.setColor(annotationType, color);
+ ruler.update();
+ }
+ }
+
+ private void configureTabConverter() {
+ if (fTabConverter != null) {
+ IDocumentProvider provider = getDocumentProvider();
+ if (provider instanceof PHPDocumentProvider) {
+ PHPDocumentProvider cup = (PHPDocumentProvider) provider;
+ fTabConverter.setLineTracker(cup.createLineTracker(getEditorInput()));
+ }
+ }
+ }
+
+ private int getTabSize() {
+ Preferences preferences =
+ PHPeclipsePlugin.getDefault().getPluginPreferences();
+ return preferences.getInt(CODE_FORMATTER_TAB_SIZE);
+ }
+
+ private void startTabConversion() {
+ if (fTabConverter == null) {
+ fTabConverter = new TabConverter();
+ configureTabConverter();
+ fTabConverter.setNumberOfSpacesPerTab(getTabSize());
+ AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
+ asv.addTextConverter(fTabConverter);
+ // http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
+ asv.updateIndentationPrefixes();
+ }
+ }
+
+ private void stopTabConversion() {
+ if (fTabConverter != null) {
+ AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
+ asv.removeTextConverter(fTabConverter);
+ // http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
+ asv.updateIndentationPrefixes();
+ fTabConverter = null;
+ }
+ }
+
+ private boolean isTabConversionEnabled() {
+ IPreferenceStore store = getPreferenceStore();
+ return store.getBoolean(SPACES_FOR_TABS);
+ }
+
+ private void showOverviewRuler() {
+ AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
+ asv.showOverviewRuler();
+
+ OverviewRuler overviewRuler = asv.getOverviewRuler();
+ if (overviewRuler != null) {
+ for (int i = 0; i < ANNOTATION_LAYERS.length; i++) {
+ AnnotationType type = ANNOTATION_LAYERS[i];
+ overviewRuler.setLayer(type, i);
+ if (isAnnotationIndicationInOverviewRulerEnabled(type))
+ showAnnotationIndicationInOverviewRuler(type, true);
+ }
+ }
+ }
+
+ private void hideOverviewRuler() {
+ AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
+ asv.hideOverviewRuler();
+ }
+
+ private boolean isOverviewRulerVisible() {
+ IPreferenceStore store = getPreferenceStore();
+ return store.getBoolean(OVERVIEW_RULER);
+ }
+
+ private Color getColor(String key) {
+ RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), key);
+ return getColor(rgb);
+ }
+
+ private Color getColor(RGB rgb) {
+ // JavaTextTools textTools = JavaPlugin.getDefault().getJavaTextTools();
+ // return textTools.getColorManager().getColor(rgb);
+ return PHPEditorEnvironment.getPHPColorProvider().getColor(rgb);
+ }
+
+ private Color getColor(AnnotationType annotationType) {
+ AnnotationInfo info = (AnnotationInfo) ANNOTATION_MAP.get(annotationType);
+ if (info != null)
+ return getColor(info.fColorPreference);
+ return null;
+ }
+
+ public void dispose() {
+ ISourceViewer sourceViewer= getSourceViewer();
+ if (sourceViewer instanceof ITextViewerExtension)
+ ((ITextViewerExtension) sourceViewer).removeVerifyKeyListener(fBracketInserter);
+
+ if (fPropertyChangeListener != null) {
+ Preferences preferences= PHPeclipsePlugin.getDefault().getPluginPreferences();
+ preferences.removePropertyChangeListener(fPropertyChangeListener);
+ fPropertyChangeListener= null;
+ }
+
+
+// if (fJavaEditorErrorTickUpdater != null) {
+// fJavaEditorErrorTickUpdater.dispose();
+// fJavaEditorErrorTickUpdater= null;
+// }
+//
+// if (fSelectionHistory != null)
+// fSelectionHistory.dispose();
+
+ if (fPaintManager != null) {
+ fPaintManager.dispose();
+ fPaintManager = null;
+ }
+
+ if (fActionGroups != null)
+ fActionGroups.dispose();
+
+ super.dispose();
+ }
+
+ protected AnnotationType getAnnotationType(String preferenceKey) {
+ Iterator e= ANNOTATION_MAP.keySet().iterator();
+ while (e.hasNext()) {
+ AnnotationType type= (AnnotationType) e.next();
+ AnnotationInfo info= (AnnotationInfo) ANNOTATION_MAP.get(type);
+ if (info != null) {
+ if (preferenceKey.equals(info.fColorPreference) || preferenceKey.equals(info.fEditorPreference) || preferenceKey.equals(info.fOverviewRulerPreference))
+ return type;
+ }
+ }
+ return null;
+ }
+
+ /*
+ * @see AbstractTextEditor#handlePreferenceStoreChanged(PropertyChangeEvent)
+ */
+ protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
+
+ try {
+
+ AdaptedSourceViewer asv= (AdaptedSourceViewer) getSourceViewer();
+ if (asv != null) {
+
+ String p= event.getProperty();
+
+ if (CLOSE_BRACKETS.equals(p)) {
+ fBracketInserter.setCloseBracketsEnabled(getPreferenceStore().getBoolean(p));
+ return;
+ }
+
+ if (CLOSE_STRINGS.equals(p)) {
+ fBracketInserter.setCloseStringsEnabled(getPreferenceStore().getBoolean(p));
+ return;
+ }
+
+ if (SPACES_FOR_TABS.equals(p)) {
+ if (isTabConversionEnabled())
+ startTabConversion();
+ else
+ stopTabConversion();
+ return;
+ }
+
+ if (MATCHING_BRACKETS.equals(p)) {
+ if (isBracketHighlightingEnabled())
+ startBracketHighlighting();
+ else
+ stopBracketHighlighting();
+ return;
+ }
+
+ if (MATCHING_BRACKETS_COLOR.equals(p)) {
+ if (fBracketPainter != null)
+ fBracketPainter.setHighlightColor(getColor(MATCHING_BRACKETS_COLOR));
+ return;
+ }
+
+ if (CURRENT_LINE.equals(p)) {
+ if (isLineHighlightingEnabled())
+ startLineHighlighting();
+ else
+ stopLineHighlighting();
+ return;
+ }
+
+ if (CURRENT_LINE_COLOR.equals(p)) {
+ if (fLinePainter != null) {
+ stopLineHighlighting();
+ startLineHighlighting();
+ }
+ return;
+ }
+
+ if (PRINT_MARGIN.equals(p)) {
+ if (isPrintMarginVisible())
+ showPrintMargin();
+ else
+ hidePrintMargin();
+ return;
+ }
+
+ if (PRINT_MARGIN_COLOR.equals(p)) {
+ if (fPrintMarginPainter != null)
+ fPrintMarginPainter.setMarginRulerColor(getColor(PRINT_MARGIN_COLOR));
+ return;
+ }
+
+ if (PRINT_MARGIN_COLUMN.equals(p)) {
+ if (fPrintMarginPainter != null)
+ fPrintMarginPainter.setMarginRulerColumn(getPreferenceStore().getInt(PRINT_MARGIN_COLUMN));
+ return;
+ }
+
+ if (OVERVIEW_RULER.equals(p)) {
+ if (isOverviewRulerVisible())
+ showOverviewRuler();
+ else
+ hideOverviewRuler();
+ return;
+ }
+
+ AnnotationType type= getAnnotationType(p);
+ if (type != null) {
+
+ AnnotationInfo info= (AnnotationInfo) ANNOTATION_MAP.get(type);
+ if (info.fColorPreference.equals(p)) {
+ Color color= getColor(type);
+ if (fProblemPainter != null) {
+ fProblemPainter.setColor(type, color);
+ fProblemPainter.paint(IPainter.CONFIGURATION);
+ }
+ setColorInOverviewRuler(type, color);
+ return;
+ }
+
+ if (info.fEditorPreference.equals(p)) {
+ if (isAnnotationIndicationEnabled(type))
+ startAnnotationIndication(type);
+ else
+ stopAnnotationIndication(type);
+ return;
+ }
+
+ if (info.fOverviewRulerPreference.equals(p)) {
+ if (isAnnotationIndicationInOverviewRulerEnabled(type))
+ showAnnotationIndicationInOverviewRuler(type, true);
+ else
+ showAnnotationIndicationInOverviewRuler(type, false);
+ return;
+ }
+ }
+
+// IContentAssistant c= asv.getContentAssistant();
+// if (c instanceof ContentAssistant)
+// ContentAssistPreference.changeConfiguration((ContentAssistant) c, getPreferenceStore(), event);
+ }
+
+ } finally {
+ super.handlePreferenceStoreChanged(event);
+ }
+ }
+
+ /**
+ * Handles a property change event describing a change
+ * of the php core's preferences and updates the preference
+ * related editor properties.
+ *
+ * @param event the property change event
+ */
+ protected void handlePreferencePropertyChanged(org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) {
+ AdaptedSourceViewer asv= (AdaptedSourceViewer) getSourceViewer();
+ if (asv != null) {
+ String p= event.getProperty();
+ if (CODE_FORMATTER_TAB_SIZE.equals(p)) {
+ asv.updateIndentationPrefixes();
+ if (fTabConverter != null)
+ fTabConverter.setNumberOfSpacesPerTab(getTabSize());
+ }
+ }
+ }
+
+ /*
+ * @see PHPEditor#createJavaSourceViewer(Composite, IVerticalRuler, int)
+ */
+ protected ISourceViewer createJavaSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
+ return new AdaptedSourceViewer(parent, ruler, styles);
+ }
+
+ private boolean isValidSelection(int offset, int length) {
+ IDocumentProvider provider= getDocumentProvider();
+ if (provider != null) {
+ IDocument document= provider.getDocument(getEditorInput());
+ if (document != null) {
+ int end= offset + length;
+ int documentLength= document.getLength();
+ return 0 <= offset && offset <= documentLength && 0 <= end && end <= documentLength;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * @see AbstractTextEditor#canHandleMove(IEditorInput, IEditorInput)
+ */
+ protected boolean canHandleMove(IEditorInput originalElement, IEditorInput movedElement) {
+
+ String oldExtension= ""; //$NON-NLS-1$
+ if (originalElement instanceof IFileEditorInput) {
+ IFile file= ((IFileEditorInput) originalElement).getFile();
+ if (file != null) {
+ String ext= file.getFileExtension();
+ if (ext != null)
+ oldExtension= ext;
+ }
+ }
+
+ String newExtension= ""; //$NON-NLS-1$
+ if (movedElement instanceof IFileEditorInput) {
+ IFile file= ((IFileEditorInput) movedElement).getFile();
+ if (file != null)
+ newExtension= file.getFileExtension();
+ }
+
+ return oldExtension.equals(newExtension);
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PaintManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PaintManager.java
new file mode 100644
index 0000000..7f06294
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PaintManager.java
@@ -0,0 +1,288 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DefaultPositionUpdater;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IPositionUpdater;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+
+public final class PaintManager implements KeyListener, MouseListener, ISelectionChangedListener, ITextListener, ITextInputListener {
+
+
+ static class PaintPositionUpdater extends DefaultPositionUpdater {
+
+ /**
+ * Creates the position updater.
+ */
+ protected PaintPositionUpdater(String category) {
+ super(category);
+ }
+
+ /**
+ * If an insertion happens at a position's offset, the
+ * position is extended rather than shifted. Also, if something is added
+ * right behind the end of the position, the position is extended rather
+ * than kept stable.
+ */
+ protected void adaptToInsert() {
+
+ int myStart= fPosition.offset;
+ int myEnd= fPosition.offset + fPosition.length;
+ myEnd= Math.max(myStart, myEnd);
+
+ int yoursStart= fOffset;
+ int yoursEnd= fOffset + fReplaceLength;// - 1;
+ yoursEnd= Math.max(yoursStart, yoursEnd);
+
+ if (myEnd < yoursStart)
+ return;
+
+ if (myStart <= yoursStart)
+ fPosition.length += fReplaceLength;
+ else
+ fPosition.offset += fReplaceLength;
+ }
+ };
+
+ static class PositionManager implements IPositionManager {
+
+ private IDocument fDocument;
+ private IPositionUpdater fPositionUpdater;
+ private String fCategory;
+
+ public PositionManager() {
+ fCategory= getClass().getName() + hashCode();
+ fPositionUpdater= new PaintPositionUpdater(fCategory);
+ }
+
+ public void install(IDocument document) {
+ fDocument= document;
+ fDocument.addPositionCategory(fCategory);
+ fDocument.addPositionUpdater(fPositionUpdater);
+ }
+
+ public void dispose() {
+ uninstall(fDocument);
+ }
+
+ public void uninstall(IDocument document) {
+ if (document == fDocument && document != null) {
+ try {
+ fDocument.removePositionUpdater(fPositionUpdater);
+ fDocument.removePositionCategory(fCategory);
+ } catch (BadPositionCategoryException x) {
+ // should not happen
+ }
+ fDocument= null;
+ }
+ }
+
+ /*
+ * @see IPositionManager#addManagedPosition(Position)
+ */
+ public void addManagedPosition(Position position) {
+ try {
+ fDocument.addPosition(fCategory, position);
+ } catch (BadPositionCategoryException x) {
+ // should not happen
+ } catch (BadLocationException x) {
+ // should not happen
+ }
+ }
+
+ /*
+ * @see IPositionManager#removeManagedPosition(Position)
+ */
+ public void removeManagedPosition(Position position) {
+ try {
+ fDocument.removePosition(fCategory, position);
+ } catch (BadPositionCategoryException x) {
+ // should not happen
+ }
+ }
+ };
+
+
+ private List fPainters= new ArrayList(2);
+ private PositionManager fManager;
+ private ISourceViewer fSourceViewer;
+ private boolean fTextChanged= false;
+ private boolean fAutoRepeat= false;
+
+
+ public PaintManager(ISourceViewer sourceViewer) {
+ fSourceViewer= sourceViewer;
+ }
+
+ public void addPainter(IPainter painter) {
+ if (!fPainters.contains(painter)) {
+ fPainters.add(painter);
+ if (fPainters.size() == 1)
+ install();
+ painter.setPositionManager(fManager);
+ painter.paint(IPainter.INTERNAL);
+ }
+ }
+
+ public void removePainter(IPainter painter) {
+ if (fPainters.remove(painter))
+ painter.setPositionManager(null);
+ if (fPainters.size() == 0)
+ dispose();
+ }
+
+ private void install() {
+
+ fManager= new PositionManager();
+ fManager.install(fSourceViewer.getDocument());
+
+ fSourceViewer.addTextInputListener(this);
+
+ ISelectionProvider provider= fSourceViewer.getSelectionProvider();
+ provider.addSelectionChangedListener(this);
+
+ fSourceViewer.addTextListener(this);
+
+ StyledText text= fSourceViewer.getTextWidget();
+ text.addKeyListener(this);
+ text.addMouseListener(this);
+ }
+
+ public void dispose() {
+
+ if (fManager != null) {
+ fManager.dispose();
+ fManager= null;
+ }
+
+ for (Iterator e = fPainters.iterator(); e.hasNext();)
+ ((IPainter) e.next()).dispose();
+ fPainters.clear();
+
+ fSourceViewer.removeTextInputListener(this);
+
+ ISelectionProvider provider= fSourceViewer.getSelectionProvider();
+ if (provider != null)
+ provider.removeSelectionChangedListener(this);
+
+ fSourceViewer.removeTextListener(this);
+
+ StyledText text= fSourceViewer.getTextWidget();
+ if (text != null && !text.isDisposed()) {
+ text.removeKeyListener(this);
+ text.removeMouseListener(this);
+ }
+ }
+
+ private void paint(int reason) {
+ for (Iterator e = fPainters.iterator(); e.hasNext();)
+ ((IPainter) e.next()).paint(reason);
+ }
+
+ /*
+ * @see KeyListener#keyPressed(KeyEvent)
+ */
+ public void keyPressed(KeyEvent e) {
+ paint(IPainter.KEY_STROKE);
+ }
+
+ /*
+ * @see KeyListener#keyReleased(KeyEvent)
+ */
+ public void keyReleased(KeyEvent e) {
+ }
+
+ /*
+ * @see MouseListener#mouseDoubleClick(MouseEvent)
+ */
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ /*
+ * @see MouseListener#mouseDown(MouseEvent)
+ */
+ public void mouseDown(MouseEvent e) {
+ paint(IPainter.MOUSE_BUTTON);
+ }
+
+ /*
+ * @see MouseListener#mouseUp(MouseEvent)
+ */
+ public void mouseUp(MouseEvent e) {
+ }
+
+ /*
+ * @see ISelectionChangedListener#selectionChanged(SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ paint(IPainter.SELECTION);
+ }
+
+ /*
+ * @see ITextListener#textChanged(TextEvent)
+ */
+ public void textChanged(TextEvent event) {
+
+ if (!event.getViewerRedrawState())
+ return;
+
+ fTextChanged= true;
+ Control control= fSourceViewer.getTextWidget();
+ if (control != null) {
+ control.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (fTextChanged && fSourceViewer != null)
+ paint(IPainter.TEXT_CHANGE);
+ }
+ });
+ }
+ }
+
+ /*
+ * @see ITextInputListener#inputDocumentAboutToBeChanged(IDocument, IDocument)
+ */
+ public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+ if (oldInput != null) {
+ for (Iterator e = fPainters.iterator(); e.hasNext();)
+ ((IPainter) e.next()).deactivate(false);
+ fManager.uninstall(oldInput);
+ }
+ }
+
+ /*
+ * @see ITextInputListener#inputDocumentChanged(IDocument, IDocument)
+ */
+ public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+ if (newInput != null) {
+ fManager.install(newInput);
+ paint(IPainter.TEXT_CHANGE);
+ }
+ }
+}
+
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PrintMarginPainter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PrintMarginPainter.java
new file mode 100644
index 0000000..ad9fd45
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PrintMarginPainter.java
@@ -0,0 +1,126 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Rectangle;
+
+import org.eclipse.jface.text.source.ISourceViewer;
+
+
+
+public class PrintMarginPainter implements IPainter, PaintListener {
+
+
+ private StyledText fTextWidget;
+
+ private int fMarginWidth= 80;
+ private Color fColor;
+ private int fLineStyle= SWT.LINE_SOLID;
+ private int fLineWidth= 1;
+
+ private int fCachedWidgetX= -1;
+ private boolean fIsActive= false;
+
+ public PrintMarginPainter(ISourceViewer sourceViewer) {
+ fTextWidget= sourceViewer.getTextWidget();
+ }
+
+ public void setMarginRulerColumn(int width) {
+ fMarginWidth= width;
+ intialize();
+ }
+
+ public void setMarginRulerStyle(int lineStyle) {
+ fLineStyle= lineStyle;
+ }
+
+ public void setMarginRulerWidth(int lineWidth) {
+ fLineWidth= lineWidth;
+ }
+
+ /**
+ * Must be called before paint
is called the first time.
+ */
+ public void setMarginRulerColor(Color color) {
+ fColor= color;
+ }
+
+ /**
+ * Must be called explicitly when font of text widget changes.
+ */
+ public void intialize() {
+ computeWidgetX();
+ fTextWidget.redraw();
+ }
+
+ private void computeWidgetX() {
+ GC gc= new GC(fTextWidget);
+ int pixels= gc.getFontMetrics().getAverageCharWidth();
+ gc.dispose();
+
+ fCachedWidgetX= pixels * fMarginWidth;
+ }
+
+ /*
+ * @see IPainter#deactivate(boolean)
+ */
+ public void deactivate(boolean redraw) {
+ if (fIsActive) {
+ fIsActive= false;
+ fTextWidget.removePaintListener(this);
+ if (redraw)
+ fTextWidget.redraw();
+ }
+ }
+
+ /*
+ * @see IPainter#dispose()
+ */
+ public void dispose() {
+ fTextWidget= null;
+ }
+
+ /*
+ * @see IPainter#paint(int)
+ */
+ public void paint(int reason) {
+ if (!fIsActive) {
+ fIsActive= true;
+ fTextWidget.addPaintListener(this);
+ if (fCachedWidgetX == -1)
+ computeWidgetX();
+ fTextWidget.redraw();
+ }
+ }
+
+ /*
+ * @see IPainter#setPositionManager(IPositionManager)
+ */
+ public void setPositionManager(IPositionManager manager) {
+ }
+
+ /*
+ * @see PaintListener#paintControl(PaintEvent)
+ */
+ public void paintControl(PaintEvent e) {
+ if (fTextWidget != null) {
+ int x= fCachedWidgetX - fTextWidget.getHorizontalPixel();
+ if (x >= 0) {
+ Rectangle area= fTextWidget.getClientArea();
+ e.gc.setForeground(fColor);
+ e.gc.setLineStyle(fLineStyle);
+ e.gc.setLineWidth(fLineWidth);
+ e.gc.drawLine(x, 0, x, area.height);
+ }
+ }
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/ProblemAnnotationIterator.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/ProblemAnnotationIterator.java
new file mode 100644
index 0000000..4aa6ad0
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/ProblemAnnotationIterator.java
@@ -0,0 +1,71 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+
+import java.util.Iterator;
+import org.eclipse.jface.text.source.IAnnotationModel;
+
+
+/**
+ * Filters problems based on their types.
+ */
+public class ProblemAnnotationIterator implements Iterator {
+
+ private Iterator fIterator;
+ private IProblemAnnotation fNext;
+ private boolean fSkipIrrelevants;
+
+ public ProblemAnnotationIterator(IAnnotationModel model, boolean skipIrrelevants) {
+ fIterator= model.getAnnotationIterator();
+ fSkipIrrelevants= skipIrrelevants;
+ skip();
+ }
+
+ private void skip() {
+ while (fIterator.hasNext()) {
+ Object next= fIterator.next();
+ if (next instanceof IProblemAnnotation) {
+ IProblemAnnotation a= (IProblemAnnotation) next;
+ if (fSkipIrrelevants) {
+ if (a.isRelevant()) {
+ fNext= a;
+ return;
+ }
+ } else {
+ fNext= a;
+ return;
+ }
+ }
+ }
+ fNext= null;
+ }
+
+ /*
+ * @see Iterator#hasNext()
+ */
+ public boolean hasNext() {
+ return fNext != null;
+ }
+
+ /*
+ * @see Iterator#next()
+ */
+ public Object next() {
+ try {
+ return fNext;
+ } finally {
+ skip();
+ }
+ }
+
+ /*
+ * @see Iterator#remove()
+ */
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/ProblemPainter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/ProblemPainter.java
new file mode 100644
index 0000000..d6d208b
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/ProblemPainter.java
@@ -0,0 +1,386 @@
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+ IBM Corporation - Initial implementation
+**********************************************************************/
+
+package net.sourceforge.phpeclipse.phpeditor;
+
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewerExtension3;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModelListener;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * Highlights the temporary problems.
+ */
+public class ProblemPainter implements IPainter, PaintListener, IAnnotationModelListener {
+
+ private static class ProblemPosition {
+ Position fPosition;
+ Color fColor;
+ boolean fMultiLine;
+ };
+
+ private boolean fIsActive= false;
+ private boolean fIsPainting= false;
+ private boolean fIsSettingModel= false;
+
+ private ITextEditor fTextEditor;
+ private ISourceViewer fSourceViewer;
+ private StyledText fTextWidget;
+ private IAnnotationModel fModel;
+ private List fProblemPositions= new ArrayList();
+
+ private Map fColorTable= new HashMap();
+ private Set fAnnotationSet= new HashSet();
+
+
+
+ public ProblemPainter(ITextEditor textEditor, ISourceViewer sourceViewer) {
+ fTextEditor= textEditor;
+ fSourceViewer= sourceViewer;
+ fTextWidget= sourceViewer.getTextWidget();
+ }
+
+ private boolean hasProblems() {
+ return !fProblemPositions.isEmpty();
+ }
+
+ private void enablePainting() {
+ if (!fIsPainting && hasProblems()) {
+ fIsPainting= true;
+ fTextWidget.addPaintListener(this);
+ handleDrawRequest(null);
+ }
+ }
+
+ private void disablePainting(boolean redraw) {
+ if (fIsPainting) {
+ fIsPainting= false;
+ fTextWidget.removePaintListener(this);
+ if (redraw && hasProblems())
+ handleDrawRequest(null);
+ }
+ }
+
+ private void setModel(IAnnotationModel model) {
+ if (fModel != model) {
+ if (fModel != null)
+ fModel.removeAnnotationModelListener(this);
+ fModel= model;
+ if (fModel != null) {
+ try {
+ fIsSettingModel= true;
+ fModel.addAnnotationModelListener(this);
+ } finally {
+ fIsSettingModel= false;
+ }
+ }
+ }
+ }
+
+ private void catchupWithModel() {
+ if (fProblemPositions != null) {
+ fProblemPositions.clear();
+ if (fModel != null) {
+
+ Iterator e= new ProblemAnnotationIterator(fModel, true);
+ while (e.hasNext()) {
+ IProblemAnnotation pa= (IProblemAnnotation) e.next();
+ Annotation a= (Annotation) pa;
+
+ Color color= null;
+ AnnotationType type= pa.getAnnotationType();
+ if (fAnnotationSet.contains(type))
+ color= (Color) fColorTable.get(type);
+
+ if (color != null) {
+ ProblemPosition pp= new ProblemPosition();
+ pp.fPosition= fModel.getPosition(a);
+ pp.fColor= color;
+ pp.fMultiLine= true;
+ fProblemPositions.add(pp);
+ }
+ }
+ }
+ }
+ }
+
+ private void updatePainting() {
+ disablePainting(true);
+ catchupWithModel();
+ enablePainting();
+ }
+
+ /*
+ * @see IAnnotationModelListener#modelChanged(IAnnotationModel)
+ */
+ public void modelChanged(final IAnnotationModel model) {
+ if (fTextWidget != null && !fTextWidget.isDisposed()) {
+ if (fIsSettingModel) {
+ // inside the ui thread -> no need for posting
+ updatePainting();
+ } else {
+ Display d= fTextWidget.getDisplay();
+ if (d != null) {
+ d.asyncExec(new Runnable() {
+ public void run() {
+ if (fTextWidget != null && !fTextWidget.isDisposed())
+ updatePainting();
+ }
+ });
+ }
+ }
+ }
+ }
+
+ public void setColor(AnnotationType annotationType, Color color) {
+ if (color != null)
+ fColorTable.put(annotationType, color);
+ else
+ fColorTable.remove(annotationType);
+ }
+
+ public void paintAnnotations(AnnotationType annotationType, boolean paint) {
+ if (paint)
+ fAnnotationSet.add(annotationType);
+ else
+ fAnnotationSet.remove(annotationType);
+ }
+
+ public boolean isPaintingAnnotations() {
+ return !fAnnotationSet.isEmpty();
+ }
+
+ /*
+ * @see IPainter#dispose()
+ */
+ public void dispose() {
+
+ if (fColorTable != null)
+ fColorTable.clear();
+ fColorTable= null;
+
+ if (fAnnotationSet != null)
+ fAnnotationSet.clear();
+ fAnnotationSet= null;
+
+ fTextWidget= null;
+ fModel= null;
+ fProblemPositions= null;
+ }
+
+ /*
+ * Returns the document offset of the upper left corner of the widgets viewport,
+ * possibly including partially visible lines.
+ */
+ private int getInclusiveTopIndexStartOffset() {
+
+ if (fTextWidget != null && !fTextWidget.isDisposed()) {
+ int top= fSourceViewer.getTopIndex();
+ if ((fTextWidget.getTopPixel() % fTextWidget.getLineHeight()) != 0)
+ top--;
+ try {
+ IDocument document= fSourceViewer.getDocument();
+ return document.getLineOffset(top);
+ } catch (BadLocationException ex) {
+ }
+ }
+
+ return -1;
+ }
+
+ /*
+ * @see PaintListener#paintControl(PaintEvent)
+ */
+ public void paintControl(PaintEvent event) {
+ if (fTextWidget != null)
+ handleDrawRequest(event.gc);
+ }
+
+ private void handleDrawRequest(GC gc) {
+
+ int vOffset= getInclusiveTopIndexStartOffset();
+ // http://bugs.eclipse.org/bugs/show_bug.cgi?id=17147
+ int vLength= fSourceViewer.getBottomIndexEndOffset() + 1;
+
+ for (Iterator e = fProblemPositions.iterator(); e.hasNext();) {
+ ProblemPosition pp = (ProblemPosition) e.next();
+ Position p= pp.fPosition;
+ if (p.overlapsWith(vOffset, vLength)) {
+
+ if (!pp.fMultiLine) {
+
+ IRegion widgetRange= getWidgetRange(p);
+ if (widgetRange != null)
+ draw(gc, widgetRange.getOffset(), widgetRange.getLength(), pp.fColor);
+
+ } else {
+
+ IDocument document= fSourceViewer.getDocument();
+ try {
+
+ int startLine= document.getLineOfOffset(p.getOffset());
+ int lastInclusive= Math.max(p.getOffset(), p.getOffset() + p.getLength() - 1);
+ int endLine= document.getLineOfOffset(lastInclusive);
+
+ for (int i= startLine; i <= endLine; i++) {
+ IRegion line= document.getLineInformation(i);
+ int paintStart= Math.max(line.getOffset(), p.getOffset());
+ int paintEnd= Math.min(line.getOffset() + line.getLength(), p.getOffset() + p.getLength());
+ if (paintEnd > paintStart) {
+ // otherwise inside a line delimiter
+ IRegion widgetRange= getWidgetRange(new Position(paintStart, paintEnd - paintStart));
+ if (widgetRange != null)
+ draw(gc, widgetRange.getOffset(), widgetRange.getLength(), pp.fColor);
+ }
+ }
+
+ } catch (BadLocationException x) {
+ }
+ }
+ }
+ }
+ }
+
+ private IRegion getWidgetRange(Position p) {
+ if (fSourceViewer instanceof ITextViewerExtension3) {
+
+ ITextViewerExtension3 extension= (ITextViewerExtension3) fSourceViewer;
+ return extension.modelRange2WidgetRange(new Region(p.getOffset(), p.getLength()));
+
+ } else {
+
+ IRegion region= fSourceViewer.getVisibleRegion();
+ int offset= region.getOffset();
+ int length= region.getLength();
+
+ if (p.overlapsWith(offset , length)) {
+ int p1= Math.max(offset, p.getOffset());
+ int p2= Math.min(offset + length, p.getOffset() + p.getLength());
+ return new Region(p1 - offset, p2 - p1);
+ }
+ }
+
+ return null;
+ }
+
+ private int[] computePolyline(Point left, Point right, int height) {
+
+ final int WIDTH= 4; // must be even
+ final int HEIGHT= 2; // can be any number
+// final int MINPEEKS= 2; // minimal number of peeks
+
+ int peeks= (right.x - left.x) / WIDTH;
+// if (peeks < MINPEEKS) {
+// int missing= (MINPEEKS - peeks) * WIDTH;
+// left.x= Math.max(0, left.x - missing/2);
+// peeks= MINPEEKS;
+// }
+
+ int leftX= left.x;
+
+ // compute (number of point) * 2
+ int length= ((2 * peeks) + 1) * 2;
+ if (length < 0)
+ return new int[0];
+
+ int[] coordinates= new int[length];
+
+ // cache peeks' y-coordinates
+ int bottom= left.y + height - 1;
+ int top= bottom - HEIGHT;
+
+ // populate array with peek coordinates
+ for (int i= 0; i < peeks; i++) {
+ int index= 4 * i;
+ coordinates[index]= leftX + (WIDTH * i);
+ coordinates[index+1]= bottom;
+ coordinates[index+2]= coordinates[index] + WIDTH/2;
+ coordinates[index+3]= top;
+ }
+
+ // the last down flank is missing
+ coordinates[length-2]= left.x + (WIDTH * peeks);
+ coordinates[length-1]= bottom;
+
+ return coordinates;
+ }
+
+ private void draw(GC gc, int offset, int length, Color color) {
+ if (gc != null) {
+
+ Point left= fTextWidget.getLocationAtOffset(offset);
+ Point right= fTextWidget.getLocationAtOffset(offset + length);
+
+ gc.setForeground(color);
+ int[] polyline= computePolyline(left, right, gc.getFontMetrics().getHeight());
+ gc.drawPolyline(polyline);
+
+ } else {
+ fTextWidget.redrawRange(offset, length, true);
+ }
+ }
+
+ /*
+ * @see IPainter#deactivate(boolean)
+ */
+ public void deactivate(boolean redraw) {
+ if (fIsActive) {
+ fIsActive= false;
+ disablePainting(redraw);
+ setModel(null);
+ catchupWithModel();
+ }
+ }
+
+ /*
+ * @see IPainter#paint(int)
+ */
+ public void paint(int reason) {
+ if (!fIsActive) {
+ fIsActive= true;
+ IDocumentProvider provider= PHPeclipsePlugin.getDefault().getCompilationUnitDocumentProvider();
+ setModel(provider.getAnnotationModel(fTextEditor.getEditorInput()));
+ } else if (CONFIGURATION == reason || INTERNAL == reason)
+ updatePainting();
+ }
+
+ /*
+ * @see IPainter#setPositionManager(IPositionManager)
+ */
+ public void setPositionManager(IPositionManager manager) {
+ }
+}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/html/HTMLFormattingStrategy.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/html/HTMLFormattingStrategy.java
index 3657c8e..a57fd08 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/html/HTMLFormattingStrategy.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/html/HTMLFormattingStrategy.java
@@ -1,5 +1,6 @@
package net.sourceforge.phpeclipse.phpeditor.html;
+import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
import net.sourceforge.phpeclipse.phpeditor.PHPSourceViewerConfiguration;
import org.eclipse.jface.text.BadLocationException;
@@ -7,7 +8,6 @@ import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.formatter.IFormattingStrategy;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.ui.editors.text.TextEditor;
/**
* @author chrisl
@@ -24,7 +24,7 @@ public class HTMLFormattingStrategy implements IFormattingStrategy, IHTMLConstan
private PHPSourceViewerConfiguration fConfig;
private ISourceViewer fViewer;
//
- private TextEditor fEditor;
+ private PHPEditor fEditor;
private int fTabWidth;
////////////////////////////////////////////////////////////////////////
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/HTMLCodeScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/HTMLCodeScanner.java
index 12b0c0f..450c3b4 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/HTMLCodeScanner.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/HTMLCodeScanner.java
@@ -14,10 +14,12 @@ package net.sourceforge.phpeclipse.phpeditor.php;
import java.util.ArrayList;
import java.util.List;
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
import net.sourceforge.phpeclipse.phpeditor.util.HTMLWordDetector;
import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.TextAttribute;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IRule;
@@ -107,7 +109,7 @@ public class HTMLCodeScanner extends RuleBasedScanner {
/**
* Creates a Java code scanner
*/
- public HTMLCodeScanner(PHPColorProvider provider) {
+ public HTMLCodeScanner(JavaColorManager provider, IPreferenceStore store) {
keyword = new Token(new TextAttribute(provider.getColor(PHPColorProvider.KEYWORD)));
IToken type = new Token(new TextAttribute(provider.getColor(PHPColorProvider.FUNCTION_NAME)));
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/IPHPPartitionScannerConstants.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/IPHPPartitionScannerConstants.java
index 8e24e5e..9d9c023 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/IPHPPartitionScannerConstants.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/IPHPPartitionScannerConstants.java
@@ -11,11 +11,12 @@ package net.sourceforge.phpeclipse.phpeditor.php;
public interface IPHPPartitionScannerConstants
{
public final static String PHP = "__php"; //$NON-NLS-1$
- public final static String PHP_MULTILINE_COMMENT = "__php_multiline_comment";
- public final static String JAVASCRIPT = "__javascript";
- public final static String JS_MULTILINE_COMMENT = "__js_multiline_comment";
- public final static String CSS = "__css";
- public final static String CSS_MULTILINE_COMMENT = "__css_multiline_comment";
- public final static String HTML = "__html";
+ public final static String PHP_MULTILINE_COMMENT = "__php_multiline_comment"; //$NON-NLS-1$
+ public final static String PHP_STRING = "__php_string"; //$NON-NLS-1$
+ public final static String JAVASCRIPT = "__javascript"; //$NON-NLS-1$
+ public final static String JS_MULTILINE_COMMENT = "__js_multiline_comment"; //$NON-NLS-1$
+ public final static String CSS = "__css"; //$NON-NLS-1$
+ public final static String CSS_MULTILINE_COMMENT = "__css_multiline_comment"; //$NON-NLS-1$
+ public final static String HTML = "__html"; //$NON-NLS-1$
public final static String HTML_MULTILINE_COMMENT = "__html_multiline_comment"; //$NON-NLS-1$
}
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java
index f8d3fa9..d7c77f6 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java
@@ -15,6 +15,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
+import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
import net.sourceforge.phpeclipse.IPreferenceConstants;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
@@ -105,8 +106,8 @@ public class PHPCodeScanner extends RuleBasedScanner implements IPreferenceConst
/**
* Creates a PHP code scanner
*/
- public PHPCodeScanner(PHPColorProvider provider) {
- final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
+ public PHPCodeScanner(JavaColorManager provider, IPreferenceStore store) {
+ // final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND));
variable =
new Token(
@@ -169,7 +170,7 @@ public class PHPCodeScanner extends RuleBasedScanner implements IPreferenceConst
updateWordRules();
}
- public void updateToken(PHPColorProvider provider) {
+ public void updateToken(JavaColorManager provider) {
final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND));
--
1.7.1