From d0fc29af1fce2ab5ad25cb9bca43700f00b80a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 17 Jan 2007 11:39:56 +0000 Subject: [PATCH] StyledEdit now makes use of the new BTranslationUtils functions which simplify the code quite a lot. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19845 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/stylededit/StyledEditApp.cpp | 9 +- src/apps/stylededit/StyledEditView.cpp | 179 +++++++------------------ src/apps/stylededit/StyledEditView.h | 10 +- 3 files changed, 58 insertions(+), 140 deletions(-) diff --git a/src/apps/stylededit/StyledEditApp.cpp b/src/apps/stylededit/StyledEditApp.cpp index b29d1e306a..564a2e0520 100644 --- a/src/apps/stylededit/StyledEditApp.cpp +++ b/src/apps/stylededit/StyledEditApp.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006, Haiku, Inc. All Rights Reserved. + * Copyright 2002-2007, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -84,7 +84,12 @@ StyledEditApp::StyledEditApp() BCharacterSetRoster roster; BCharacterSet charset; while (roster.GetNextCharacterSet(&charset) == B_NO_ERROR) { - BString name(charset.GetPrintName()); + BString name; + if (charset.GetFontID() == B_UNICODE_UTF8) + name = "Default"; + else + name = charset.GetPrintName(); + const char* mime = charset.GetMIMEName(); if (mime) { name.Append(" ("); diff --git a/src/apps/stylededit/StyledEditView.cpp b/src/apps/stylededit/StyledEditView.cpp index 6d5ceaecc6..075edb0f81 100644 --- a/src/apps/stylededit/StyledEditView.cpp +++ b/src/apps/stylededit/StyledEditView.cpp @@ -1,10 +1,11 @@ /* - * Copyright 2002-2006, Haiku, Inc. All Rights Reserved. + * Copyright 2002-2007, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Mattias Sundblad * Andrew Bachmann + * Axel Dörfler, axeld@pinc-software.de */ @@ -23,17 +24,17 @@ #include #include + using namespace BPrivate; StyledEditView::StyledEditView(BRect viewFrame, BRect textBounds, BHandler *handler) : BTextView(viewFrame, "textview", textBounds, - B_FOLLOW_ALL, B_FRAME_EVENTS|B_WILL_DRAW) + B_FOLLOW_ALL, B_FRAME_EVENTS | B_WILL_DRAW) { fHandler = handler; fMessenger = new BMessenger(handler); fSuppressChanges = false; - fEncoding = 0; } @@ -79,7 +80,8 @@ status_t StyledEditView::GetStyledText(BPositionIO* stream) { fSuppressChanges = true; - status_t result = BTranslationUtils::GetStyledText(stream, this, NULL); + status_t result = BTranslationUtils::GetStyledText(stream, this, + fEncoding.String()); fSuppressChanges = false; if (result != B_OK) @@ -87,25 +89,29 @@ StyledEditView::GetStyledText(BPositionIO* stream) BNode* node = dynamic_cast(stream); if (node != NULL) { - ssize_t bytesRead; - // decode encoding - int32 encoding; - bytesRead = node->ReadAttr("be:encoding", 0, 0, &encoding, sizeof(encoding)); - if (bytesRead == (ssize_t)sizeof(encoding)) { - if (encoding == 65535) { - // UTF-8 - fEncoding = 0; - } else { - const BCharacterSet* characterSet - = BCharacterSetRoster::GetCharacterSetByConversionID(encoding); - if (characterSet != 0) - fEncoding = characterSet->GetFontID(); + // get encoding + if (node->ReadAttrString("be:encoding", &fEncoding) != B_OK) { + // try to read as "int32" + int32 encoding; + ssize_t bytesRead = node->ReadAttr("be:encoding", B_INT32_TYPE, 0, + &encoding, sizeof(encoding)); + if (bytesRead == (ssize_t)sizeof(encoding)) { + if (encoding == 65535) { + fEncoding = "UTF-8"; + } else { + const BCharacterSet* characterSet + = BCharacterSetRoster::GetCharacterSetByConversionID(encoding); + if (characterSet != NULL) + fEncoding = characterSet->GetName(); + } } } + // TODO: move those into BTranslationUtils::GetStyledText() as well? + // restore alignment int32 align; - bytesRead = node->ReadAttr("alignment", 0, 0, &align, sizeof(align)); + ssize_t bytesRead = node->ReadAttr("alignment", 0, 0, &align, sizeof(align)); if (bytesRead == (ssize_t)sizeof(align)) SetAlignment((alignment)align); @@ -126,63 +132,6 @@ StyledEditView::GetStyledText(BPositionIO* stream) } } - if (fEncoding != 0) { - int32 length = stream->Seek(0, SEEK_END); - - // Here we save the run_array before it gets overwritten... - text_run_array* runArray = RunArray(0, length); - uint32 id = BCharacterSetRoster::GetCharacterSetByFontID(fEncoding)->GetConversionID(); - - fSuppressChanges = true; - SetText(""); - fSuppressChanges = false; - - char inBuffer[32768]; - off_t location = 0; - int32 textOffset = 0; - int32 state = 0; - int32 bytesRead; - while ((bytesRead = stream->ReadAt(location, inBuffer, sizeof(inBuffer))) > 0) { - char* inPtr = inBuffer; - char textBuffer[32768]; - int32 textLength = sizeof(textBuffer); - int32 bytes = bytesRead; - while (textLength > 0 && bytes > 0) { - result = convert_to_utf8(id, inPtr, &bytes, textBuffer, &textLength, &state); - if (result != B_OK) - return result; - - fSuppressChanges = true; - InsertText(textBuffer, textLength, textOffset); - fSuppressChanges = false; - textOffset += textLength; - inPtr += bytes; - location += bytes; - bytesRead -= bytes; - bytes = bytesRead; - if (textLength > 0) - textLength = sizeof(textBuffer); - } - } - - // ... and here we restore it - SetRunArray(0, length, runArray); - - #ifdef HAIKU_TARGET_PLATFORM_BEOS - // FreeRunArray does not exist on R5 - - // Call destructors explicitly - for (int32 i = 0; i < runArray->count; i++) - runArray->runs[i].font.~BFont(); - - free(runArray); - - #else - FreeRunArray(runArray); - #endif - - } - return result; } @@ -190,63 +139,8 @@ StyledEditView::GetStyledText(BPositionIO* stream) status_t StyledEditView::WriteStyledEditFile(BFile* file) { - status_t result = B_OK; - ssize_t bytes = 0; - result = BTranslationUtils::WriteStyledEditFile(this, file); - if (result != B_OK) - return result; - - if (fEncoding == 0) { - int32 encoding = 65535; - bytes = file->WriteAttr("be:encoding", B_INT32_TYPE, 0, &encoding, sizeof(encoding)); - if (bytes < 0) - return bytes; - } else { - result = file->SetSize(0); - if (result != B_OK) - return result; - - bytes = file->Seek(0, SEEK_SET); - if (bytes != 0) - return bytes; - - const BCharacterSet* cs = BCharacterSetRoster::GetCharacterSetByFontID(fEncoding); - if (cs != 0) { - uint32 id = cs->GetConversionID(); - const char * outText = Text(); - int32 sourceLength = TextLength(); - int32 state = 0; - char buffer[32768]; - while (sourceLength > 0) { - int32 length = sourceLength; - int32 written = 32768; - result = convert_from_utf8(id,outText,&length,buffer,&written,&state); - if (result != B_OK) { - return result; - } - bytes = file->Write(buffer,written); - if (bytes < 0) - return bytes; - sourceLength -= length; - outText += length; - } - bytes = file->WriteAttr("be:encoding", B_INT32_TYPE, 0, &id, sizeof(id)); - if (bytes < 0) - return bytes; - } - } - - int32 align = Alignment(); - bytes = file->WriteAttr("alignment", B_INT32_TYPE, 0, &align, sizeof(align)); - if (bytes < 0) - return bytes; - - bool wrap = DoesWordWrap(); - bytes = file->WriteAttr("wrap", B_BOOL_TYPE, 0, &wrap, sizeof(wrap)); - if (bytes < 0) - return bytes; - - return result; + return BTranslationUtils::WriteStyledEditFile(this, file, + fEncoding.String()); } @@ -255,6 +149,7 @@ StyledEditView::Reset() { fSuppressChanges = true; SetText(""); + fEncoding = ""; fSuppressChanges = false; } @@ -272,14 +167,30 @@ StyledEditView::Select(int32 start, int32 finish) void StyledEditView::SetEncoding(uint32 encoding) { - fEncoding = encoding; + if (encoding == 0) { + fEncoding = ""; + return; + } + + const BCharacterSet* set = BCharacterSetRoster::GetCharacterSetByFontID(encoding); + if (set != NULL) + fEncoding = set->GetName(); + else + fEncoding = ""; } uint32 StyledEditView::GetEncoding() const { - return fEncoding; + if (fEncoding == "") + return 0; + + const BCharacterSet* set = BCharacterSetRoster::FindCharacterSetByName(fEncoding.String()); + if (set != NULL) + return set->GetFontID(); + + return 0; } diff --git a/src/apps/stylededit/StyledEditView.h b/src/apps/stylededit/StyledEditView.h index 0a2fac9646..63073fad57 100644 --- a/src/apps/stylededit/StyledEditView.h +++ b/src/apps/stylededit/StyledEditView.h @@ -1,18 +1,20 @@ /* - * Copyright 2002-2006, Haiku, Inc. All Rights Reserved. + * Copyright 2002-2007, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Mattias Sundblad * Andrew Bachmann + * Axel Dörfler, axeld@pinc-software.de */ #ifndef STYLED_EDIT_VIEW_H #define STYLED_EDIT_VIEW_H #include -#include #include +#include +#include class StyledEditView : public BTextView { @@ -26,7 +28,7 @@ class StyledEditView : public BTextView { virtual void Reset(); virtual status_t GetStyledText(BPositionIO * stream); virtual status_t WriteStyledEditFile(BFile * file); - + virtual void SetEncoding(uint32 encoding); virtual uint32 GetEncoding() const; @@ -39,7 +41,7 @@ class StyledEditView : public BTextView { BMessage *fChangeMessage; BMessenger *fMessenger; bool fSuppressChanges; - uint32 fEncoding; + BString fEncoding; }; #endif // STYLED_EDIT_VIEW_H