2 * Copyright 2002-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
8 * Axel Dörfler, axeld@pinc-software.de
12 #include "Constants.h"
13 #include "StyledEditView.h"
15 #include <CharacterSet.h>
16 #include <CharacterSetRoster.h>
20 #include <Messenger.h>
23 #include <TranslationUtils.h>
30 using namespace BPrivate
;
33 StyledEditView::StyledEditView(BRect viewFrame
, BRect textBounds
,
36 BTextView(viewFrame
, "textview", textBounds
, B_FOLLOW_ALL
,
37 B_FRAME_EVENTS
| B_WILL_DRAW
)
39 SetViewColor(ui_color(B_DOCUMENT_BACKGROUND_COLOR
));
40 SetLowColor(ViewColor());
42 fMessenger
= new BMessenger(handler
);
43 fSuppressChanges
= false;
47 StyledEditView::~StyledEditView()
55 StyledEditView::FrameResized(float width
, float height
)
57 BTextView::FrameResized(width
, height
);
62 textRect
.OffsetTo(B_ORIGIN
);
63 textRect
.InsetBy(TEXT_INSET
, TEXT_INSET
);
64 SetTextRect(textRect
);
70 StyledEditView::DeleteText(int32 start
, int32 finish
)
72 if (!fSuppressChanges
)
73 fMessenger
-> SendMessage(TEXT_CHANGED
);
75 BTextView::DeleteText(start
, finish
);
81 StyledEditView::InsertText(const char* text
, int32 length
, int32 offset
,
82 const text_run_array
* runs
)
84 if (!fSuppressChanges
)
85 fMessenger
->SendMessage(TEXT_CHANGED
);
87 BTextView::InsertText(text
, length
, offset
, runs
);
93 StyledEditView::Select(int32 start
, int32 finish
)
95 fMessenger
->SendMessage(start
== finish
? DISABLE_ITEMS
: ENABLE_ITEMS
);
96 BTextView::Select(start
, finish
);
102 StyledEditView::Reset()
104 fSuppressChanges
= true;
107 fSuppressChanges
= false;
112 StyledEditView::SetSuppressChanges(bool suppressChanges
)
114 fSuppressChanges
= suppressChanges
;
119 StyledEditView::GetStyledText(BPositionIO
* stream
, const char* forceEncoding
)
121 if (forceEncoding
!= NULL
)
122 fEncoding
= strcmp(forceEncoding
, "auto") != 0 ? forceEncoding
: "";
124 fSuppressChanges
= true;
125 status_t result
= BTranslationUtils::GetStyledText(stream
, this,
127 fSuppressChanges
= false;
132 BNode
* node
= dynamic_cast<BNode
*>(stream
);
134 if (forceEncoding
== NULL
) {
136 if (node
->ReadAttrString("be:encoding", &fEncoding
) != B_OK
) {
137 // try to read as "int32"
139 ssize_t bytesRead
= node
->ReadAttr("be:encoding", B_INT32_TYPE
, 0,
140 &encoding
, sizeof(encoding
));
141 if (bytesRead
== (ssize_t
)sizeof(encoding
)) {
142 if (encoding
== 65535) {
145 const BCharacterSet
* characterSet
146 = BCharacterSetRoster::GetCharacterSetByConversionID(encoding
);
147 if (characterSet
!= NULL
)
148 fEncoding
= characterSet
->GetName();
153 // TODO: move those into BTranslationUtils::GetStyledText() as well?
157 ssize_t bytesRead
= node
->ReadAttr("alignment", 0, 0, &align
, sizeof(align
));
158 if (bytesRead
== (ssize_t
)sizeof(align
))
159 SetAlignment((alignment
)align
);
163 bytesRead
= node
->ReadAttr("wrap", 0, 0, &wrap
, sizeof(wrap
));
164 if (bytesRead
== (ssize_t
)sizeof(wrap
)) {
169 textRect
.OffsetTo(B_ORIGIN
);
170 textRect
.InsetBy(TEXT_INSET
, TEXT_INSET
);
171 // the width comes from stylededit R5. TODO: find a better way
172 textRect
.SetRightBottom(BPoint(1500.0, textRect
.RightBottom().y
));
173 SetTextRect(textRect
);
183 StyledEditView::WriteStyledEditFile(BFile
* file
)
185 return BTranslationUtils::WriteStyledEditFile(this, file
,
191 StyledEditView::SetEncoding(uint32 encoding
)
197 const BCharacterSet
* set
198 = BCharacterSetRoster::GetCharacterSetByFontID(encoding
);
201 fEncoding
= set
->GetName();
206 StyledEditView::GetEncoding() const
211 const BCharacterSet
* set
=
212 BCharacterSetRoster::FindCharacterSetByName(fEncoding
.String());
214 return set
->GetFontID();
221 StyledEditView::_UpdateStatus()
223 int32 selStart
, selFinish
;
224 GetSelection(&selStart
, &selFinish
);
226 int32 line
= CurrentLine();
227 int32 lineStart
= OffsetAt(line
);
230 int32 tabSize
= (int32
)ceilf(TabWidth() / StringWidth("s"));
231 for (int i
= lineStart
; i
< selStart
; i
++) {
232 unsigned char ch
= ByteAt(i
);
233 if ((ch
& 0xC0) != 0x80) {
235 while (column
% tabSize
)
241 BMessage
* message
= new BMessage(UPDATE_STATUS
);
242 message
->AddInt32("line", line
+ 1);
243 message
->AddInt32("column", column
);
244 message
->AddString("encoding", fEncoding
.String());
245 fMessenger
->SendMessage(message
);