From 0b46ec9848d666ead1fbdf4bdff9cb50182d5213 Mon Sep 17 00:00:00 2001 From: shatty Date: Fri, 22 Nov 2002 05:53:58 +0000 Subject: [PATCH] improved soft wrapping, now saves alignment and wrapping states git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2061 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/stylededit/StyledEditView.cpp | 46 +++++- src/apps/stylededit/StyledEditView.h | 2 + src/apps/stylededit/StyledEditWindow.cpp | 199 ++++++++++++++--------- src/apps/stylededit/StyledEditWindow.h | 3 + 4 files changed, 171 insertions(+), 79 deletions(-) diff --git a/src/apps/stylededit/StyledEditView.cpp b/src/apps/stylededit/StyledEditView.cpp index 7d64c0f5c8..90d4b8823e 100644 --- a/src/apps/stylededit/StyledEditView.cpp +++ b/src/apps/stylededit/StyledEditView.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "StyledEditView.h" #include "Constants.h" @@ -24,12 +25,12 @@ StyledEditView::FrameResized(float width, float height) { BTextView::FrameResized(width, height); - if(DoesWordWrap()){ - BRect textRect; - textRect= Bounds(); - textRect.OffsetTo(B_ORIGIN); - textRect.InsetBy(TEXT_INSET,TEXT_INSET); - SetTextRect(textRect); + BRect textRect; + textRect = Bounds(); + textRect.OffsetTo(B_ORIGIN); + textRect.InsetBy(TEXT_INSET,TEXT_INSET); + if (DoesWordWrap() || (textRect.Width() > TextRect().Width())) { + SetTextRect(textRect); } } @@ -39,10 +40,43 @@ 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; + // restore alignment + alignment align; + bytesRead = node->ReadAttr("alignment",0,0,&align,sizeof(align)); + if (bytesRead > 0) { + SetAlignment(align); + } + // restore wrapping + bool wrap; + bytesRead = node->ReadAttr("wrap",0,0,&wrap,sizeof(wrap)); + if (bytesRead > 0) { + SetWordWrap(wrap); + } + } + fSuppressChanges = false; return result; } +status_t +StyledEditView::WriteStyledEditFile(BFile * file) +{ + status_t result = B_OK; + result = BTranslationUtils::WriteStyledEditFile(this,file); + if (result != B_OK) { + return result; + } + alignment align = Alignment(); + file->WriteAttr("alignment",B_INT32_TYPE,0,&align,sizeof(align)); + bool wrap = DoesWordWrap(); + file->WriteAttr("wrap",B_BOOL_TYPE,0,&wrap,sizeof(wrap)); + return result; +} + void StyledEditView::Reset() { diff --git a/src/apps/stylededit/StyledEditView.h b/src/apps/stylededit/StyledEditView.h index 5706baaf69..653a135473 100644 --- a/src/apps/stylededit/StyledEditView.h +++ b/src/apps/stylededit/StyledEditView.h @@ -1,6 +1,7 @@ #ifndef STYLED_EDIT_VIEW_H #define STYLED_EDIT_VIEW_H +#include #include #include @@ -14,6 +15,7 @@ public: virtual void Reset(); virtual status_t GetStyledText(BPositionIO * stream); + virtual status_t WriteStyledEditFile(BFile * file); protected: virtual void InsertText(const char *text, int32 length, int32 offset, const text_run_array *runs); virtual void DeleteText(int32 start, int32 finish); diff --git a/src/apps/stylededit/StyledEditWindow.cpp b/src/apps/stylededit/StyledEditWindow.cpp index b8ecf940ef..dd5284fe10 100644 --- a/src/apps/stylededit/StyledEditWindow.cpp +++ b/src/apps/stylededit/StyledEditWindow.cpp @@ -264,13 +264,14 @@ StyledEditWindow::InitWindow() //"Align"-subMenu: subMenu= new BMenu("Align"); subMenu->SetRadioMode(true); - subMenu->AddItem(menuItem= new BMenuItem("Left", new BMessage(ALIGN_LEFT))); + + subMenu->AddItem(fAlignLeft = new BMenuItem("Left", new BMessage(ALIGN_LEFT))); menuItem->SetMarked(true); - subMenu->AddItem(menuItem= new BMenuItem("Center", new BMessage(ALIGN_CENTER))); - subMenu->AddItem(menuItem= new BMenuItem("Right", new BMessage(ALIGN_RIGHT))); + subMenu->AddItem(fAlignCenter = new BMenuItem("Center", new BMessage(ALIGN_CENTER))); + subMenu->AddItem(fAlignRight = new BMenuItem("Right", new BMessage(ALIGN_RIGHT))); menu->AddItem(subMenu); - menu->AddItem(fWrapItem= new BMenuItem("Wrap Lines", new BMessage(WRAP_LINES))); + menu->AddItem(fWrapItem = new BMenuItem("Wrap Lines", new BMessage(WRAP_LINES))); fWrapItem->SetMarked(true); /***************************MENUS ADDED***********************/ @@ -433,97 +434,110 @@ StyledEditWindow::MessageReceived(BMessage *message) break; case FONT_COLOR: { - void *v; - rgb_color *color; - - message->FindPointer("colour",&v); - color= (rgb_color *) v; - SetFontColor(color); + void *v; + rgb_color *color; + + message->FindPointer("colour",&v); + color= (rgb_color *) v; + SetFontColor(color); } break; /*********"Document"-menu*************/ case ALIGN_LEFT: - fTextView->SetAlignment(B_ALIGN_LEFT); + fTextView->SetAlignment(B_ALIGN_LEFT); + fClean = false; + fRevertItem->SetEnabled(fSaveMessage != NULL); + fSaveItem->SetEnabled(true); break; case ALIGN_CENTER: - fTextView->SetAlignment(B_ALIGN_CENTER); + fTextView->SetAlignment(B_ALIGN_CENTER); + fClean = false; + fRevertItem->SetEnabled(fSaveMessage != NULL); + fSaveItem->SetEnabled(true); break; case ALIGN_RIGHT: - fTextView->SetAlignment(B_ALIGN_RIGHT); + fTextView->SetAlignment(B_ALIGN_RIGHT); + fClean = false; + fRevertItem->SetEnabled(fSaveMessage != NULL); + fSaveItem->SetEnabled(true); break; case WRAP_LINES: - if(fTextView->DoesWordWrap()){ + if (fTextView->DoesWordWrap()) { fTextView->SetWordWrap(false); fWrapItem->SetMarked(false); - } - else{ + } else { fTextView->SetWordWrap(true); fWrapItem->SetMarked(true); + BRect textRect; + textRect = fTextView->Bounds(); + textRect.OffsetTo(B_ORIGIN); + textRect.InsetBy(TEXT_INSET,TEXT_INSET); + fTextView->SetTextRect(textRect); } + fClean = false; + fRevertItem->SetEnabled(fSaveMessage != NULL); + fSaveItem->SetEnabled(true); break; - case ENABLE_ITEMS: - { + case ENABLE_ITEMS: { fCutItem->SetEnabled(true); fCopyItem->SetEnabled(true); fClearItem->SetEnabled(true); - } + } break; - case DISABLE_ITEMS: - { + case DISABLE_ITEMS: { fCutItem->SetEnabled(false); fCopyItem->SetEnabled(false); fClearItem->SetEnabled(false); - } + } break; - case TEXT_CHANGED: - { - if (fUndoFlag) { - if (fUndoCleans) { - // we cleaned! - fClean = true; - fUndoCleans = false; - } else if (fClean) { - // if we were clean - // then a redo will make us clean again - fRedoCleans = true; - fClean = false; - } - // set mode - fCanUndo = false; - fCanRedo = true; - fUndoItem->SetLabel("Redo Typing"); - fUndoItem->SetEnabled(true); - fUndoFlag = false; - } else { - if (fRedoFlag && fRedoCleans) { - // we cleaned! - fClean = true; - fRedoCleans = false; - } else if (fClean) { - // if we were clean - // then an undo will make us clean again - fUndoCleans = true; - fClean = false; - } else { - // no more cleaning from undo now... - fUndoCleans = false; - } - // set mode - fCanUndo = true; - fCanRedo = false; - fUndoItem->SetLabel("Undo Typing"); - fUndoItem->SetEnabled(true); - fRedoFlag = false; - } - if (fClean) { - fRevertItem->SetEnabled(false); - fSaveItem->SetEnabled(fSaveMessage == NULL); - } else { - fRevertItem->SetEnabled(fSaveMessage != NULL); - fSaveItem->SetEnabled(true); + case TEXT_CHANGED: { + if (fUndoFlag) { + if (fUndoCleans) { + // we cleaned! + fClean = true; + fUndoCleans = false; + } else if (fClean) { + // if we were clean + // then a redo will make us clean again + fRedoCleans = true; + fClean = false; } - // clear flags + // set mode + fCanUndo = false; + fCanRedo = true; + fUndoItem->SetLabel("Redo Typing"); + fUndoItem->SetEnabled(true); + fUndoFlag = false; + } else { + if (fRedoFlag && fRedoCleans) { + // we cleaned! + fClean = true; + fRedoCleans = false; + } else if (fClean) { + // if we were clean + // then an undo will make us clean again + fUndoCleans = true; + fClean = false; + } else { + // no more cleaning from undo now... + fUndoCleans = false; + } + // set mode + fCanUndo = true; + fCanRedo = false; + fUndoItem->SetLabel("Undo Typing"); + fUndoItem->SetEnabled(true); + fRedoFlag = false; } + if (fClean) { + fRevertItem->SetEnabled(false); + fSaveItem->SetEnabled(fSaveMessage == NULL); + } else { + fRevertItem->SetEnabled(fSaveMessage != NULL); + fSaveItem->SetEnabled(true); + } + // clear flags + } break; default: BWindow::MessageReceived(message); @@ -631,7 +645,7 @@ StyledEditWindow::Save(BMessage *message) if(err!= B_OK) return err; - err= BTranslationUtils::WriteStyledEditFile(fTextView, &file); + err= fTextView->WriteStyledEditFile(&file); if(err != B_OK) return err; @@ -700,9 +714,29 @@ StyledEditWindow::OpenFile(entry_ref *ref) if (fileinit == B_OK){ status_t result; result = fTextView->GetStyledText(&file); //he he he :) - if (result == B_OK) { + + if (result != B_OK) { // TODO: notify user? } + + // update alignment + switch (fTextView->Alignment()) { + case B_ALIGN_LEFT: + fAlignLeft->SetMarked(true); + break; + case B_ALIGN_CENTER: + fAlignCenter->SetMarked(true); + break; + case B_ALIGN_RIGHT: + fAlignRight->SetMarked(true); + break; + default: + // weird + break; + } + + // update word wrapping + fWrapItem->SetMarked(fTextView->DoesWordWrap()); } else { fSaveItem->SetEnabled(true); // allow saving new files } @@ -749,11 +783,30 @@ StyledEditWindow::RevertToSaved() fSaveMessage->FindString("name", &name); BDirectory dir(&ref); - + BFile file(&dir, name, B_READ_ONLY | B_CREATE_FILE); fTextView->Reset(); //clear the textview... fTextView->GetStyledText(&file); //and fill it from the file - + + // update alignment + switch (fTextView->Alignment()) { + case B_ALIGN_LEFT: + fAlignLeft->SetMarked(true); + break; + case B_ALIGN_CENTER: + fAlignCenter->SetMarked(true); + break; + case B_ALIGN_RIGHT: + fAlignRight->SetMarked(true); + break; + default: + // weird + break; + } + + // update word wrapping + fWrapItem->SetMarked(fTextView->DoesWordWrap()); + // clear undo modes fUndoItem->SetLabel("Can't Undo"); fUndoItem->SetEnabled(false); diff --git a/src/apps/stylededit/StyledEditWindow.h b/src/apps/stylededit/StyledEditWindow.h index 38173993fa..9d7f18d07c 100644 --- a/src/apps/stylededit/StyledEditWindow.h +++ b/src/apps/stylededit/StyledEditWindow.h @@ -53,6 +53,9 @@ private: BMenuItem *fCopyItem; BMenuItem *fClearItem; BMenuItem *fWrapItem; + BMenuItem *fAlignLeft; + BMenuItem *fAlignCenter; + BMenuItem *fAlignRight; BString fStringToFind; BString fReplaceString;