diff --git a/src/apps/stylededit/Constants.h b/src/apps/stylededit/Constants.h index 71cba9852d..58d7051e6b 100644 --- a/src/apps/stylededit/Constants.h +++ b/src/apps/stylededit/Constants.h @@ -59,6 +59,8 @@ const uint32 DISABLE_ITEMS ='DIit'; const uint32 CHANGE_WINDOW ='CHwi'; const uint32 TEXT_CHANGED ='TEch'; -const uint32 SAVE_AS_ENCODING ='SAen'; +// file panel constants +const uint32 OPEN_AS_ENCODING ='FPoe'; +const uint32 SAVE_AS_ENCODING ='FPse'; #endif // CONSTANTS_H diff --git a/src/apps/stylededit/StyledEditApp.cpp b/src/apps/stylededit/StyledEditApp.cpp index afe687ca5e..1e1d3c6129 100644 --- a/src/apps/stylededit/StyledEditApp.cpp +++ b/src/apps/stylededit/StyledEditApp.cpp @@ -1,6 +1,8 @@ #include #include +#include +#include "CharacterSet.h" #include "Constants.h" #include "StyledEditApp.h" #include "StyledEditWindow.h" @@ -16,10 +18,31 @@ StyledEditApp::StyledEditApp() BMenuBar * menuBar = dynamic_cast(fOpenPanel->Window()->FindView("MenuBar")); + fOpenAsEncoding = 0; fOpenPanelEncodingMenu= new BMenu("Encoding"); menuBar->AddItem(fOpenPanelEncodingMenu); + fOpenPanelEncodingMenu->SetRadioMode(true); - // TODO: add encodings + status_t status = B_OK; + CharacterSetRoster * roster = CharacterSetRoster::Roster(&status); + if (status == B_OK) { + for (int index = 0; (index < roster->GetCharacterSetCount()) ; index++) { + const CharacterSet * cs = roster->GetCharacterSet(index); + BString name(cs->GetPrintName()); + const char * mime = cs->GetMIMEName(); + if (mime) { + name.Append(" ("); + name.Append(mime); + name.Append(")"); + } + BMenuItem * item = new BMenuItem(name.String(),new BMessage(OPEN_AS_ENCODING)); + item->SetTarget(this); + fOpenPanelEncodingMenu->AddItem(item); + if (index == fOpenAsEncoding) { + item->SetMarked(true); + } + } + } fWindowCount= 0; fNext_Untitled_Window= 1; @@ -63,6 +86,14 @@ StyledEditApp::MessageReceived(BMessage *message) case B_SILENT_RELAUNCH: OpenDocument(); break; + case OPEN_AS_ENCODING: + void * ptr; + if (message->FindPointer("source",&ptr) == B_OK) { + if (fOpenPanelEncodingMenu != 0) { + fOpenAsEncoding = (uint32)fOpenPanelEncodingMenu->IndexOf((BMenuItem*)ptr); + } + } + break; default: BApplication::MessageReceived(message); break; @@ -72,7 +103,7 @@ StyledEditApp::MessageReceived(BMessage *message) void StyledEditApp::OpenDocument() { - new StyledEditWindow(windowRect,fNext_Untitled_Window++); + new StyledEditWindow(windowRect,fNext_Untitled_Window++,fOpenAsEncoding); windowRect.OffsetBy(15,15); // TODO: wrap around screen fWindowCount++; } @@ -80,7 +111,7 @@ StyledEditApp::OpenDocument() void StyledEditApp::OpenDocument(entry_ref * ref) { - new StyledEditWindow(windowRect,ref); + new StyledEditWindow(windowRect,ref,fOpenAsEncoding); windowRect.OffsetBy(15,15); // TODO: wrap around screen fWindowCount++; } diff --git a/src/apps/stylededit/StyledEditApp.h b/src/apps/stylededit/StyledEditApp.h index 08b4825746..a15096b6b5 100644 --- a/src/apps/stylededit/StyledEditApp.h +++ b/src/apps/stylededit/StyledEditApp.h @@ -28,6 +28,7 @@ public: private: BFilePanel *fOpenPanel; BMenu *fOpenPanelEncodingMenu; + uint32 fOpenAsEncoding; int32 fWindowCount; int32 fNext_Untitled_Window; diff --git a/src/apps/stylededit/StyledEditView.cpp b/src/apps/stylededit/StyledEditView.cpp index 4e6c7b3819..b075382144 100644 --- a/src/apps/stylededit/StyledEditView.cpp +++ b/src/apps/stylededit/StyledEditView.cpp @@ -18,6 +18,7 @@ StyledEditView::StyledEditView(BRect viewFrame, BRect textBounds, BHandler *hand fHandler= handler; fMessenger= new BMessenger(handler); fSuppressChanges = false; + fEncoding = 0; }/***StyledEditView()***/ StyledEditView::~StyledEditView(){ @@ -60,10 +61,28 @@ StyledEditView::GetStyledText(BPositionIO * stream) status_t result = B_OK; fSuppressChanges = true; result = BTranslationUtils::GetStyledText(stream, this, NULL); - + BNode * node = dynamic_cast(stream); if (node != 0) { ssize_t bytesRead; + // decode encoding + int32 encoding; + bytesRead = node->ReadAttr("be:encoding",0,0,&encoding,sizeof(encoding)); + if (bytesRead > 0) { + CharacterSetRoster * roster = CharacterSetRoster::Roster(&result); + if (result != B_OK) { + return result; + } + if (encoding == 65535) { + fEncoding = 0; + } else { + const CharacterSet * cs = roster->FindCharacterSetByConversionID(encoding); + if (cs != 0) { + fEncoding = cs->GetFontID(); + } + } + } + // restore alignment alignment align; bytesRead = node->ReadAttr("alignment",0,0,&align,sizeof(align)); @@ -91,14 +110,14 @@ StyledEditView::GetStyledText(BPositionIO * stream) } status_t -StyledEditView::WriteStyledEditFile(BFile * file, uint32 charSet) +StyledEditView::WriteStyledEditFile(BFile * file) { status_t result = B_OK; result = BTranslationUtils::WriteStyledEditFile(this,file); if (result != B_OK) { return result; } - if (charSet == 0) { + if (fEncoding == 0) { int32 encoding = 65535; file->WriteAttr("be:encoding",B_INT32_TYPE,0,&encoding,sizeof(encoding)); } else { @@ -114,7 +133,7 @@ StyledEditView::WriteStyledEditFile(BFile * file, uint32 charSet) if (result != B_OK) { return result; } - uint32 id = roster->GetCharacterSet(charSet)->GetConversionID(); + uint32 id = roster->FindCharacterSetByFontID(fEncoding)->GetConversionID(); const char * outText = Text(); int32 sourceLength = TextLength(); int32 state = 0; @@ -161,7 +180,20 @@ StyledEditView::Select(int32 start, int32 finish) BTextView::Select(start, finish); } -void StyledEditView::InsertText(const char *text, int32 length, int32 offset, const text_run_array *runs) +void +StyledEditView::SetEncoding(uint32 encoding) +{ + fEncoding = encoding; +} + +uint32 +StyledEditView::GetEncoding() const +{ + return fEncoding; +} + +void +StyledEditView::InsertText(const char *text, int32 length, int32 offset, const text_run_array *runs) { if (!fSuppressChanges) fMessenger-> SendMessage(new BMessage(TEXT_CHANGED)); @@ -170,7 +202,8 @@ void StyledEditView::InsertText(const char *text, int32 length, int32 offset, co }/****StyledEditView::InsertText()***/ -void StyledEditView::DeleteText(int32 start, int32 finish) +void +StyledEditView::DeleteText(int32 start, int32 finish) { if (!fSuppressChanges) fMessenger-> SendMessage(new BMessage(TEXT_CHANGED)); diff --git a/src/apps/stylededit/StyledEditView.h b/src/apps/stylededit/StyledEditView.h index 06b2c783ab..b9efb73ab1 100644 --- a/src/apps/stylededit/StyledEditView.h +++ b/src/apps/stylededit/StyledEditView.h @@ -15,7 +15,10 @@ public: virtual void Reset(); virtual status_t GetStyledText(BPositionIO * stream); - virtual status_t WriteStyledEditFile(BFile * file, uint32 charSet = 0); + virtual status_t WriteStyledEditFile(BFile * file); + + virtual void SetEncoding(uint32 encoding); + virtual uint32 GetEncoding() const; protected: virtual void InsertText(const char *text, int32 length, int32 offset, const text_run_array *runs); virtual void DeleteText(int32 start, int32 finish); @@ -25,6 +28,7 @@ private: BMessage *fChangeMessage; BMessenger *fMessenger; bool fSuppressChanges; + uint32 fEncoding; }; #endif // STYLED_EDIT_VIEW_H diff --git a/src/apps/stylededit/StyledEditWindow.cpp b/src/apps/stylededit/StyledEditWindow.cpp index a582cd3cdb..0678148ebc 100644 --- a/src/apps/stylededit/StyledEditWindow.cpp +++ b/src/apps/stylededit/StyledEditWindow.cpp @@ -26,10 +26,10 @@ #include "StyledEditView.h" #include "StyledEditWindow.h" -StyledEditWindow::StyledEditWindow(BRect frame, int32 id) +StyledEditWindow::StyledEditWindow(BRect frame, int32 id, uint32 encoding) : BWindow(frame,"untitled",B_DOCUMENT_WINDOW,0) { - InitWindow(); + InitWindow(encoding); BString unTitled; unTitled.SetTo("Untitled "); unTitled << id; @@ -38,10 +38,10 @@ StyledEditWindow::StyledEditWindow(BRect frame, int32 id) Show(); } /***StyledEditWindow()***/ -StyledEditWindow::StyledEditWindow(BRect frame, entry_ref *ref) +StyledEditWindow::StyledEditWindow(BRect frame, entry_ref *ref, uint32 encoding) : BWindow(frame,"untitled",B_DOCUMENT_WINDOW,0) { - InitWindow(); + InitWindow(encoding); OpenFile(ref); Show(); } /***StyledEditWindow()***/ @@ -57,7 +57,7 @@ StyledEditWindow::~StyledEditWindow() } /***~StyledEditWindow()***/ void -StyledEditWindow::InitWindow() +StyledEditWindow::InitWindow(uint32 encoding) { fPrintSettings= NULL; fSaveMessage= NULL; @@ -105,7 +105,7 @@ StyledEditWindow::InitWindow() fTextView= new StyledEditView(viewFrame, textBounds, this); fTextView->SetDoesUndo(true); fTextView->SetStylable(true); - + fTextView->SetEncoding(encoding); fScrollView= new BScrollView("scrollview", fTextView, B_FOLLOW_ALL, 0, true, true, B_PLAIN_BORDER); AddChild(fScrollView); @@ -279,7 +279,6 @@ StyledEditWindow::InitWindow() fSavePanel = 0; // build lazily fSavePanelEncodingMenu = 0; // build lazily - fSaveAsEncoding = 0; // default UTF-8 } /***StyledEditWindow::Initwindow()***/ void @@ -612,7 +611,7 @@ StyledEditWindow::MessageReceived(BMessage *message) void * ptr; if (message->FindPointer("source",&ptr) == B_OK) { if (fSavePanelEncodingMenu != 0) { - fSaveAsEncoding = (uint32)fSavePanelEncodingMenu->IndexOf((BMenuItem*)ptr); + fTextView->SetEncoding((uint32)fSavePanelEncodingMenu->IndexOf((BMenuItem*)ptr)); } } break; @@ -819,7 +818,7 @@ StyledEditWindow::Save(BMessage *message) if(err!= B_OK) return err; - err= fTextView->WriteStyledEditFile(&file,fSaveAsEncoding); + err= fTextView->WriteStyledEditFile(&file); if(err != B_OK) return err; @@ -872,13 +871,16 @@ StyledEditWindow::SaveAs() for (int index = 0; (index < roster->GetCharacterSetCount()) ; index++) { const CharacterSet * cs = roster->GetCharacterSet(index); BString name(cs->GetPrintName()); - name.Append(" ("); - name.Append(cs->GetMIMEName()); - name.Append(")"); + const char * mime = cs->GetMIMEName(); + if (mime) { + name.Append(" ("); + name.Append(mime); + name.Append(")"); + } BMenuItem * item = new BMenuItem(name.String(),new BMessage(SAVE_AS_ENCODING)); item->SetTarget(this); fSavePanelEncodingMenu->AddItem(item); - if (index == fSaveAsEncoding) { + if (index == fTextView->GetEncoding()) { item->SetMarked(true); } } @@ -887,7 +889,6 @@ StyledEditWindow::SaveAs() // its own scope allows the lock to be released before Show() { - // TODO: add encodings BAutolock lock(fSavePanel->Window()); if (lock.IsLocked()) { fSavePanelTextView->SetText(Title()); diff --git a/src/apps/stylededit/StyledEditWindow.h b/src/apps/stylededit/StyledEditWindow.h index 47d0d0902e..813e4487a2 100644 --- a/src/apps/stylededit/StyledEditWindow.h +++ b/src/apps/stylededit/StyledEditWindow.h @@ -15,8 +15,8 @@ class StyledEditWindow : public BWindow { public: - StyledEditWindow(BRect frame, int32 id); - StyledEditWindow(BRect frame, entry_ref *ref); + StyledEditWindow(BRect frame, int32 id, uint32 encoding = 0); + StyledEditWindow(BRect frame, entry_ref *ref, uint32 encoding = 0); ~StyledEditWindow(); virtual void Quit(); @@ -32,7 +32,7 @@ public: void SearchAllWindows(BString find, BString replace, bool casesens); private: - void InitWindow(); + void InitWindow(uint32 encoding = 0); bool Search(BString searchfor, bool casesens, bool wrap, bool backsearch); void FindSelection(); bool Replace(BString findthis, BString replacewith, bool casesens, bool wrap, bool backsearch); @@ -97,8 +97,6 @@ private: BFilePanel *fSavePanel; BTextControl *fSavePanelTextView; BMenu *fSavePanelEncodingMenu; - - uint32 fSaveAsEncoding; };