xref: /trunk/main/svtools/source/edit/editsyntaxhighlighter.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svtools.hxx"
30 
31 #include <svtools/svmedit.hxx>
32 #include <svtools/xtextedt.hxx>
33 #include <svtools/editsyntaxhighlighter.hxx>
34 #include <svtools/txtattr.hxx>
35 
36 
37 MultiLineEditSyntaxHighlight::MultiLineEditSyntaxHighlight( Window* pParent, WinBits nWinStyle,
38     HighlighterLanguage aLanguage): MultiLineEdit(pParent,nWinStyle), mbDoBracketHilight(true)
39 {
40     EnableUpdateData(300);
41     aHighlighter.initialize( aLanguage );
42 }
43 
44 MultiLineEditSyntaxHighlight::MultiLineEditSyntaxHighlight( Window* pParent, const ResId& rResId ,
45     HighlighterLanguage aLanguage): MultiLineEdit(pParent,rResId), mbDoBracketHilight(true)
46 {
47     EnableUpdateData(300);
48     aHighlighter.initialize( aLanguage );
49 }
50 
51 MultiLineEditSyntaxHighlight::~MultiLineEditSyntaxHighlight()
52 {
53 }
54 
55 void MultiLineEditSyntaxHighlight::EnableBracketHilight(bool aHilight)
56 {
57     mbDoBracketHilight = aHilight;
58 }
59 
60 bool MultiLineEditSyntaxHighlight::IsBracketHilight()
61 {
62     return mbDoBracketHilight;
63 }
64 
65 void MultiLineEditSyntaxHighlight::SetText(const String& rNewText)
66 {
67     MultiLineEdit::SetText(rNewText);
68     UpdateData();
69 }
70 
71 void MultiLineEditSyntaxHighlight::DoBracketHilight(sal_uInt16 aKey)
72 {
73     TextSelection aCurrentPos = GetTextView()->GetSelection();
74     xub_StrLen aStartPos  = aCurrentPos.GetStart().GetIndex();
75     sal_uLong nStartPara = aCurrentPos.GetStart().GetPara();
76     sal_uInt16 aCount = 0;
77     int aChar = -1;
78 
79     switch (aKey)
80     {
81         case '\'':  // no break
82         case '"':
83         {
84             aChar = aKey;
85             break;
86         }
87         case '}' :
88         {
89             aChar = '{';
90             break;
91         }
92         case ')':
93         {
94             aChar = '(';
95             break;
96         }
97         case ']':
98         {
99             aChar = '[';
100             break;
101         }
102     }
103 
104     if (aChar != -1)
105     {
106         for (long aPara =nStartPara; aPara>=0;--aPara)
107         {
108             if ( aStartPos == 0 )
109                 continue;
110 
111             String aLine( GetTextEngine()->GetText( aPara ) );
112             for (sal_uInt16 i = ((unsigned long)aPara==nStartPara) ? aStartPos-1 : (sal_uInt16)(aLine.Len()-1); i>0; --i)
113             {
114                 if (aLine.GetChar(i)==aChar)
115                 {
116                     if (!aCount)
117                     {
118                         GetTextEngine()->SetAttrib( TextAttribFontWeight( WEIGHT_ULTRABOLD ), aPara, i, i+1, sal_True );
119                         GetTextEngine()->SetAttrib( TextAttribFontColor( Color(0,0,0) ), aPara, i, i+1, sal_True );
120                         GetTextEngine()->SetAttrib( TextAttribFontWeight( WEIGHT_ULTRABOLD ), nStartPara, aStartPos, aStartPos, sal_True );
121                         GetTextEngine()->SetAttrib( TextAttribFontColor( Color(0,0,0) ), nStartPara, aStartPos, aStartPos, sal_True );
122                         return;
123                     }
124                     else
125                         aCount--;
126                 }
127                 if (aLine.GetChar(i)==aKey)
128                     aCount++;
129             }
130         }
131     }
132 }
133 
134 long MultiLineEditSyntaxHighlight::PreNotify( NotifyEvent& rNEvt )
135 {
136     if ( mbDoBracketHilight && (rNEvt.GetType() == EVENT_KEYINPUT) )
137         DoBracketHilight(rNEvt.GetKeyEvent()->GetCharCode());
138 
139     return MultiLineEdit::PreNotify(rNEvt);
140 }
141 
142 Color MultiLineEditSyntaxHighlight::GetColorValue(TokenTypes aToken)
143 {
144     Color aColor;
145     switch (aHighlighter.GetLanguage())
146     {
147         case HIGHLIGHT_SQL:
148         {
149             switch (aToken)
150             {
151                 case TT_IDENTIFIER: aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLIDENTIFIER).nColor; break;
152                 case TT_NUMBER:     aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLNUMBER).nColor; break;
153                 case TT_STRING:     aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLSTRING).nColor; break;
154                 case TT_OPERATOR:   aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLOPERATOR).nColor; break;
155                 case TT_KEYWORDS:   aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLKEYWORD).nColor; break;
156                 case TT_PARAMETER:  aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLPARAMETER).nColor; break;
157                 case TT_COMMENT:    aColor = (ColorData)m_aColorConfig.GetColorValue(svtools::SQLCOMMENT).nColor; break;
158                 default:            aColor = Color(0,0,0);
159             }
160             break;
161         }
162         case HIGHLIGHT_BASIC:
163         {
164             switch (aToken)
165             {
166                 case TT_IDENTIFIER: aColor = Color(255,0,0); break;
167                 case TT_COMMENT:    aColor = Color(0,0,45); break;
168                 case TT_NUMBER:     aColor = Color(204,102,204); break;
169                 case TT_STRING:     aColor = Color(0,255,45); break;
170                 case TT_OPERATOR:   aColor = Color(0,0,100); break;
171                 case TT_KEYWORDS:   aColor = Color(0,0,255); break;
172                 case TT_ERROR :     aColor = Color(0,255,255); break;
173                 default:            aColor = Color(0,0,0);
174             }
175             break;
176         }
177         default: aColor = Color(0,0,0);
178 
179     }
180     return aColor;
181 }
182 
183 void MultiLineEditSyntaxHighlight::UpdateData()
184 {
185     // syntax highlighting
186     // this must be possible improved by using notifychange correctly
187     sal_Bool bTempModified = GetTextEngine()->IsModified();
188     for (unsigned int nLine=0; nLine < GetTextEngine()->GetParagraphCount(); nLine++)
189     {
190         String aLine( GetTextEngine()->GetText( nLine ) );
191         Range aChanges = aHighlighter.notifyChange( nLine, 0, &aLine, 1 );
192 
193         GetTextEngine()->RemoveAttribs( nLine, sal_True );
194         HighlightPortions aPortions;
195         aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
196         for ( size_t i = 0; i < aPortions.size(); i++ )
197         {
198             HighlightPortion& r = aPortions[i];
199             GetTextEngine()->SetAttrib( TextAttribFontColor( GetColorValue(r.tokenType) ), nLine, r.nBegin, r.nEnd, sal_True );
200         }
201     }
202     GetTextView()->ShowCursor( false, true );
203     GetTextEngine()->SetModified(bTempModified);
204 }
205