diff --git a/src/apps/terminal/Encoding.cpp b/src/apps/terminal/Encoding.cpp index 0c3794e797..ac54b1429f 100644 --- a/src/apps/terminal/Encoding.cpp +++ b/src/apps/terminal/Encoding.cpp @@ -11,7 +11,6 @@ struct etable { const char *name; // long name for menu item. const char *shortname; // short name (use for command-line etc.) - const char shortcut; // short cut key code const int32 id; // encoding id }; @@ -19,38 +18,38 @@ struct etable { * encoding_table ... use encoding menu, message, and preference keys. */ const static etable kEncodingTable[] = { - {"UTF-8", "UTF8", 'U', M_UTF8}, - {"ISO-8859-1", "8859-1", '1', B_ISO1_CONVERSION}, - {"ISO-8859-2", "8859-2", '2', B_ISO2_CONVERSION}, - {"ISO-8859-3", "8859-3", '3', B_ISO3_CONVERSION}, - {"ISO-8859-4", "8859-4", '4', B_ISO4_CONVERSION}, - {"ISO-8859-5", "8859-5", '5', B_ISO5_CONVERSION}, - {"ISO-8859-6", "8859-6", '6', B_ISO6_CONVERSION}, - {"ISO-8859-7", "8859-7", '7', B_ISO7_CONVERSION}, - {"ISO-8859-8", "8859-8", '8', B_ISO8_CONVERSION}, - {"ISO-8859-9", "8859-9", '9', B_ISO9_CONVERSION}, - {"ISO-8859-10", "8859-10", '0', B_ISO10_CONVERSION}, - {"MacRoman", "MacRoman", 'M', B_MAC_ROMAN_CONVERSION}, - {"JIS", "JIS", 'J', B_JIS_CONVERSION}, - {"Shift-JIS", "SJIS", 'S', B_SJIS_CONVERSION}, - {"EUC-jp", "EUCJ", 'E', B_EUC_CONVERSION}, - {"EUC-kr", "EUCK", 'K', B_EUC_KR_CONVERSION}, - {"GB18030", "GB18030", 0, B_GBK_CONVERSION}, - {"Big5", "Big5", 'B', B_BIG5_CONVERSION}, + {"UTF-8", "UTF8", M_UTF8}, + {"ISO-8859-1", "8859-1", B_ISO1_CONVERSION}, + {"ISO-8859-2", "8859-2", B_ISO2_CONVERSION}, + {"ISO-8859-3", "8859-3", B_ISO3_CONVERSION}, + {"ISO-8859-4", "8859-4", B_ISO4_CONVERSION}, + {"ISO-8859-5", "8859-5", B_ISO5_CONVERSION}, + {"ISO-8859-6", "8859-6", B_ISO6_CONVERSION}, + {"ISO-8859-7", "8859-7", B_ISO7_CONVERSION}, + {"ISO-8859-8", "8859-8", B_ISO8_CONVERSION}, + {"ISO-8859-9", "8859-9", B_ISO9_CONVERSION}, + {"ISO-8859-10", "8859-10", B_ISO10_CONVERSION}, + {"MacRoman", "MacRoman", B_MAC_ROMAN_CONVERSION}, + {"JIS", "JIS", B_JIS_CONVERSION}, + {"Shift-JIS", "SJIS", B_SJIS_CONVERSION}, + {"EUC-jp", "EUCJ", B_EUC_CONVERSION}, + {"EUC-kr", "EUCK", B_EUC_KR_CONVERSION}, + {"GB18030", "GB18030", B_GBK_CONVERSION}, + {"Big5", "Big5", B_BIG5_CONVERSION}, /* Not Implemented. - {"EUC-tw", "EUCT", "T", M_EUC_TW}, - {"ISO-2022-cn", "ISOC", 'C', M_ISO_2022_CN}, - {"ISO-2022-kr", "ISOK", 'R', M_ISO_2022_KR}, + {"EUC-tw", "EUCT", M_EUC_TW}, + {"ISO-2022-cn", "ISOC", M_ISO_2022_CN}, + {"ISO-2022-kr", "ISOK", M_ISO_2022_KR}, */ - {NULL, NULL, 0, 0}, + {NULL, NULL, 0}, }; status_t -get_nth_encoding(int i, int *id) +get_next_encoding(int i, int *id) { if (id == NULL) return B_BAD_VALUE; @@ -106,17 +105,3 @@ EncodingAsString(int id) return kEncodingTable[0].name; } - - -const char -id2shortcut(int id) -{ - const etable *p = kEncodingTable; - while (p->name) { - if (id == p->id) - return p->shortcut; - p++; - } - return kEncodingTable[0].shortcut; -} - diff --git a/src/apps/terminal/Encoding.h b/src/apps/terminal/Encoding.h index 84c0d1fc7e..d4641df63d 100644 --- a/src/apps/terminal/Encoding.h +++ b/src/apps/terminal/Encoding.h @@ -37,12 +37,11 @@ #define M_UTF8 (-1) -status_t get_nth_encoding(int i, int *id); +status_t get_next_encoding(int i, int *id); int EncodingID(const char *longname); const char * EncodingAsShortString(int id); const char * EncodingAsString(int id); -const char id2shortcut(int id); #endif /* _CODING_H_ */ diff --git a/src/apps/terminal/FindWindow.cpp b/src/apps/terminal/FindWindow.cpp index 5bf1508aa4..e77f545b1b 100644 --- a/src/apps/terminal/FindWindow.cpp +++ b/src/apps/terminal/FindWindow.cpp @@ -20,12 +20,13 @@ const uint32 MSG_FIND_HIDE = 'Fhid'; +const BRect kWindowFrame(0, 0, 240, 170); -FindWindow::FindWindow(BRect frame, BMessenger messenger, BString &str, +FindWindow::FindWindow(BMessenger messenger, BString &str, bool findSelection, bool matchWord, bool matchCase, bool forwardSearch) : - BWindow(frame, "Find", B_FLOATING_WINDOW, + BWindow(kWindowFrame, "Find", B_FLOATING_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_CLOSE_ON_ESCAPE | B_AUTO_UPDATE_SIZE_LIMITS), fFindDlgMessenger(messenger) @@ -82,7 +83,7 @@ FindWindow::FindWindow(BRect frame, BMessenger messenger, BString &str, AddShortcut((ulong)'W', (ulong)B_COMMAND_KEY, new BMessage(MSG_FIND_HIDE)); - + Show(); } diff --git a/src/apps/terminal/FindWindow.h b/src/apps/terminal/FindWindow.h index dd78ed7efe..d2d508ce0e 100644 --- a/src/apps/terminal/FindWindow.h +++ b/src/apps/terminal/FindWindow.h @@ -22,7 +22,7 @@ class BCheckBox; class FindWindow : public BWindow { public: - FindWindow (BRect frame, BMessenger messenger, BString &str, + FindWindow (BMessenger messenger, BString &str, bool findSelection, bool matchWord, bool matchCase, bool forwardSearch); virtual ~FindWindow(); diff --git a/src/apps/terminal/InlineInput.cpp b/src/apps/terminal/InlineInput.cpp new file mode 100644 index 0000000000..28d0f992ab --- /dev/null +++ b/src/apps/terminal/InlineInput.cpp @@ -0,0 +1,146 @@ +/* + * Copyright 2003-2009, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Stefano Ceccherini (stefano.ceccherini@gmail.com) + */ + +#include "InlineInput.h" + +#include + +struct clause +{ + int32 start; + int32 end; +}; + + +InlineInput::InlineInput(BMessenger messenger) + : + fMessenger(messenger), + fActive(false), + fSelectionOffset(0), + fSelectionLength(0), + fNumClauses(0), + fClauses(NULL) +{ +} + + +InlineInput::~InlineInput() +{ + ResetClauses(); +} + + +const BMessenger * +InlineInput::Method() const +{ + return &fMessenger; +} + + +const char * +InlineInput::String() const +{ + return fString.String(); +} + + +void +InlineInput::SetString(const char *string) +{ + fString = string; +} + + +bool +InlineInput::IsActive() const +{ + return fActive; +} + + +void +InlineInput::SetActive(bool active) +{ + fActive = active; +} + + +int32 +InlineInput::SelectionLength() const +{ + return fSelectionLength; +} + + +void +InlineInput::SetSelectionLength(int32 length) +{ + fSelectionLength = length; +} + + +int32 +InlineInput::SelectionOffset() const +{ + return fSelectionOffset; +} + + +void +InlineInput::SetSelectionOffset(int32 offset) +{ + fSelectionOffset = offset; +} + + +bool +InlineInput::AddClause(int32 start, int32 end) +{ + void *newData = realloc(fClauses, (fNumClauses + 1) * sizeof(clause)); + if (newData == NULL) + return false; + + fClauses = (clause *)newData; + fClauses[fNumClauses].start = start; + fClauses[fNumClauses].end = end; + fNumClauses++; + return true; +} + + +bool +InlineInput::GetClause(int32 index, int32 *start, int32 *end) const +{ + bool result = false; + if (index >= 0 && index < fNumClauses) { + result = true; + clause *clause = &fClauses[index]; + if (start) + *start = clause->start; + if (end) + *end = clause->end; + } + + return result; +} + + +int32 +InlineInput::CountClauses() const +{ + return fNumClauses; +} + + +void +InlineInput::ResetClauses() +{ + fNumClauses = 0; + free(fClauses); + fClauses = NULL; +} diff --git a/src/apps/terminal/InlineInput.h b/src/apps/terminal/InlineInput.h new file mode 100644 index 0000000000..a62d3d5198 --- /dev/null +++ b/src/apps/terminal/InlineInput.h @@ -0,0 +1,55 @@ +/* + * Copyright 2003-2009, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Stefano Ceccherini (stefano.ceccherini@gmail.com) + */ + +#ifndef __INLINEINPUT_H +#define __INLINEINPUT_H + +#include +#include + +struct clause; + +class InlineInput { +public: + InlineInput(BMessenger); + ~InlineInput(); + + const BMessenger *Method() const; + + const char *String() const; + void SetString(const char *string); + + bool IsActive() const; + void SetActive(bool active); + + int32 SelectionLength() const; + void SetSelectionLength(int32); + + int32 SelectionOffset() const; + void SetSelectionOffset(int32 offset); + + bool AddClause(int32, int32); + bool GetClause(int32 index, int32 *start, int32 *end) const; + int32 CountClauses() const; + + void ResetClauses(); + +private: + const BMessenger fMessenger; + BString fString; + + bool fActive; + + int32 fSelectionOffset; + int32 fSelectionLength; + + int32 fNumClauses; + clause *fClauses; +}; + +#endif //__INLINEINPUT_H diff --git a/src/apps/terminal/Jamfile b/src/apps/terminal/Jamfile index 25748509bf..5f8d59454d 100644 --- a/src/apps/terminal/Jamfile +++ b/src/apps/terminal/Jamfile @@ -13,6 +13,7 @@ Application Terminal : FindWindow.cpp Globals.cpp HistoryBuffer.cpp + InlineInput.cpp PrefHandler.cpp PrefWindow.cpp Shell.cpp diff --git a/src/apps/terminal/Shell.cpp b/src/apps/terminal/Shell.cpp index e4786207c9..229fce9e1c 100644 --- a/src/apps/terminal/Shell.cpp +++ b/src/apps/terminal/Shell.cpp @@ -226,19 +226,13 @@ Shell::FD() const } -void +status_t Shell::AttachBuffer(TerminalBuffer *buffer) { if (fAttached) - return; + return B_ERROR; - status_t status = fTermParse->StartThreads(buffer); - if (status < B_OK) { - // TODO: What can we do here ? - fprintf(stderr, "Shell:AttachBuffer():" - " cannot start parser threads: %s", - strerror(status)); - } + return fTermParse->StartThreads(buffer); } diff --git a/src/apps/terminal/Shell.h b/src/apps/terminal/Shell.h index 95ce18634f..bb40da10b8 100644 --- a/src/apps/terminal/Shell.h +++ b/src/apps/terminal/Shell.h @@ -40,7 +40,7 @@ public: int FD() const; pid_t ProcessID() const { return fProcessID; } - virtual void AttachBuffer(TerminalBuffer *buffer); + virtual status_t AttachBuffer(TerminalBuffer *buffer); virtual void DetachBuffer(); private: diff --git a/src/apps/terminal/SmartTabView.h b/src/apps/terminal/SmartTabView.h index a4356fe1e3..4174a82eef 100644 --- a/src/apps/terminal/SmartTabView.h +++ b/src/apps/terminal/SmartTabView.h @@ -24,6 +24,12 @@ public: uint32 flags = B_FULL_UPDATE_ON_RESIZE | B_WILL_DRAW | B_NAVIGABLE_JUMP | B_FRAME_EVENTS | B_NAVIGABLE); + SmartTabView(const char* name, + button_width width = B_WIDTH_AS_USUAL, + uint32 flags = B_FULL_UPDATE_ON_RESIZE + | B_WILL_DRAW | B_NAVIGABLE_JUMP + | B_FRAME_EVENTS | B_NAVIGABLE + | B_SUPPORTS_LAYOUT); virtual ~SmartTabView(); void SetInsets(float left, float top, float right, diff --git a/src/apps/terminal/TermConst.h b/src/apps/terminal/TermConst.h index cb5bee120c..70ab2bac27 100644 --- a/src/apps/terminal/TermConst.h +++ b/src/apps/terminal/TermConst.h @@ -31,7 +31,7 @@ #ifndef TERMCONST_H_INCLUDED #define TERMCONST_H_INCLUDED -// Application signature (Must same in Muterminal.rsrc) +// Application signature (Must same in Terminal.rdef) #define TERM_SIGNATURE "application/x-vnd.Haiku-Terminal" #define PREFFILE_MIMETYPE "text/x-terminal-pref" diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index 1987e7efc0..99b219a2e6 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include #include "CodeConv.h" +#include "InlineInput.h" #include "Shell.h" #include "TermConst.h" #include "TerminalBuffer.h" @@ -229,9 +231,6 @@ TermView::TermView(BMessage* archive) fReportButtonMouseEvent(false), fReportAnyMouseEvent(false) { - SetFlags(Flags() | B_WILL_DRAW | B_FRAME_EVENTS - | B_FULL_UPDATE_ON_RESIZE); - BRect frame = Bounds(); if (archive->FindInt32("encoding", (int32*)&fEncoding) < B_OK) @@ -270,6 +269,9 @@ TermView::TermView(BMessage* archive) status_t TermView::_InitObject(int32 argc, const char** argv) { + SetFlags(Flags() | B_WILL_DRAW | B_FRAME_EVENTS + | B_FULL_UPDATE_ON_RESIZE/* | B_INPUT_METHOD_AWARE*/); + fShell = NULL; fWinchRunner = NULL; fCursorBlinkRunner = NULL; @@ -793,9 +795,8 @@ TermView::_AttachShell(Shell *shell) return B_BAD_VALUE; fShell = shell; - fShell->AttachBuffer(TextBuffer()); - - return B_OK; + + return fShell->AttachBuffer(TextBuffer()); } @@ -823,7 +824,6 @@ TermView::_Activate() void TermView::_Deactivate() { - // DoIMConfirm(); // make sure the cursor becomes visible fCursorState = 0; _InvalidateTextRect(fCursor.x, fCursor.y, fCursor.x, fCursor.y); @@ -955,6 +955,9 @@ void TermView::_BlinkCursor() { bool wasVisible = _IsCursorVisible(); + + if (!wasVisible && fInline && fInline->IsActive()) + return; bigtime_t now = system_time(); if (Window()->IsActive() && now - fLastActivityTime >= kCursorBlinkInterval) @@ -1138,6 +1141,9 @@ TermView::Draw(BRect updateRect) } } + if (fInline && fInline->IsActive()) + _DrawInlineMethodString(); + if (fCursor >= TermPos(x1, y1) && fCursor <= TermPos(x2, y2)) _DrawCursor(); } @@ -1565,35 +1571,49 @@ TermView::MessageReceived(BMessage *msg) } break; } + + case B_INPUT_METHOD_EVENT: + { + int32 opcode; + if (msg->FindInt32("be:opcode", &opcode) == B_OK) { + switch (opcode) { + case B_INPUT_METHOD_STARTED: + { + BMessenger messenger; + if (msg->FindMessenger("be:reply_to", + &messenger) == B_OK) { + fInline = new (std::nothrow) + InlineInput(messenger); + } + break; + } + + case B_INPUT_METHOD_STOPPED: + delete fInline; + fInline = NULL; + break; + + case B_INPUT_METHOD_CHANGED: + if (fInline != NULL) + _HandleInputMethodChanged(msg); + break; + + case B_INPUT_METHOD_LOCATION_REQUEST: + if (fInline != NULL) + _HandleInputMethodLocationRequest(); + break; + + default: + break; + } + } + break; + } case MENU_CLEAR_ALL: Clear(); fShell->Write(ctrl_l, 1); break; - - -// case B_INPUT_METHOD_EVENT: -// { - // int32 op; - // msg->FindInt32("be:opcode", &op); - // switch (op){ - // case B_INPUT_METHOD_STARTED: - //DoIMStart(msg); -// break; - -// case B_INPUT_METHOD_STOPPED: -// DoIMStop(msg); -// break; - -// case B_INPUT_METHOD_CHANGED: -// DoIMChange(msg); -// break; - -// case B_INPUT_METHOD_LOCATION_REQUEST: -// DoIMLocation(msg); -// break; - // } - // } case kBlinkCursor: _BlinkCursor(); break; @@ -1726,7 +1746,7 @@ TermView::TargetedByScrollView(BScrollView *scrollView) { BView::TargetedByScrollView(scrollView); - SetScrollBar(scrollView->ScrollBar(B_VERTICAL)); + SetScrollBar(scrollView ? scrollView->ScrollBar(B_VERTICAL) : NULL); } @@ -2779,9 +2799,176 @@ TermView::_ScrollToRange(TermPos start, TermPos end) } } + void TermView::DisableResizeView(int32 disableCount) { fResizeViewDisableCount += disableCount; } + +void +TermView::_DrawInlineMethodString() +{ + if (!fInline->String()) + return; + + const int32 numChars = BString(fInline->String()).CountChars(); + + BPoint startPoint = _ConvertFromTerminal(fCursor); + BPoint endPoint = startPoint; + endPoint.x += fFontWidth * numChars; + endPoint.y += fFontHeight + 1; + + BRect eraseRect(startPoint, endPoint); + + PushState(); + SetHighColor(kTermColorTable[7]); + FillRect(eraseRect); + PopState(); + + BPoint loc = _ConvertFromTerminal(fCursor); + loc.y += fFontHeight; + SetFont(&fHalfFont); + SetHighColor(kTermColorTable[0]); + SetLowColor(kTermColorTable[7]); + DrawString(fInline->String(), loc); +} + + +void +TermView::_HandleInputMethodChanged(BMessage *message) +{ + const char *string = NULL; + if (message->FindString("be:string", &string) < B_OK || string == NULL) + return; + + _ActivateCursor(false); + + if (IsFocus()) + be_app->ObscureCursor(); + + // If we find the "be:confirmed" boolean (and the boolean is true), + // it means it's over for now, so the current InlineInput object + // should become inactive. We will probably receive a + // B_INPUT_METHOD_STOPPED message after this one. + bool confirmed; + if (message->FindBool("be:confirmed", &confirmed) != B_OK) + confirmed = false; + + fInline->SetString(""); + + Invalidate(); + // TODO: Debug only + snooze(100000); + + fInline->SetString(string); + fInline->ResetClauses(); + + if (!confirmed && !fInline->IsActive()) + fInline->SetActive(true); + + // Get the clauses, and pass them to the InlineInput object + // TODO: Find out if what we did it's ok, currently we don't consider + // clauses at all, while the bebook says we should; though the visual + // effect we obtained seems correct. Weird. + int32 clauseCount = 0; + int32 clauseStart; + int32 clauseEnd; + while (message->FindInt32("be:clause_start", clauseCount, &clauseStart) + == B_OK + && message->FindInt32("be:clause_end", clauseCount, &clauseEnd) + == B_OK) { + if (!fInline->AddClause(clauseStart, clauseEnd)) + break; + clauseCount++; + } + + if (confirmed) { + fInline->SetString(""); + _ActivateCursor(true); + + // now we need to feed ourselves the individual characters as if the + // user would have pressed them now - this lets KeyDown() pick out all + // the special characters like B_BACKSPACE, cursor keys and the like: + const char* currPos = string; + const char* prevPos = currPos; + while (*currPos != '\0') { + if ((*currPos & 0xC0) == 0xC0) { + // found the start of an UTF-8 char, we collect while it lasts + ++currPos; + while ((*currPos & 0xC0) == 0x80) + ++currPos; + } else if ((*currPos & 0xC0) == 0x80) { + // illegal: character starts with utf-8 intermediate byte, skip it + prevPos = ++currPos; + } else { + // single byte character/code, just feed that + ++currPos; + } + KeyDown(prevPos, currPos - prevPos); + prevPos = currPos; + } + + Invalidate(); + } else { + // temporarily show transient state of inline input + int32 selectionStart = 0; + int32 selectionEnd = 0; + message->FindInt32("be:selection", 0, &selectionStart); + message->FindInt32("be:selection", 1, &selectionEnd); + + fInline->SetSelectionOffset(selectionStart); + fInline->SetSelectionLength(selectionEnd - selectionStart); + Invalidate(); + } +} + + +void +TermView::_HandleInputMethodLocationRequest() +{ + BMessage message(B_INPUT_METHOD_EVENT); + message.AddInt32("be:opcode", B_INPUT_METHOD_LOCATION_REQUEST); + + BString string(fInline->String()); + + const int32 &limit = string.CountChars(); + BPoint where = _ConvertFromTerminal(fCursor); + where.y += fFontHeight; + + for (int32 i = 0; i < limit; i++) { + // Add the location of the UTF8 characters + + where.x += fFontWidth; + ConvertToScreen(&where); + + message.AddPoint("be:location_reply", where); + message.AddFloat("be:height_reply", fFontHeight); + } + + fInline->Method()->SendMessage(&message); +} + + + +void +TermView::_CancelInputMethod() +{ + if (!fInline) + return; + + InlineInput *inlineInput = fInline; + fInline = NULL; + + if (inlineInput->IsActive() && Window()) { + Invalidate(); + + BMessage message(B_INPUT_METHOD_EVENT); + message.AddInt32("be:opcode", B_INPUT_METHOD_STOPPED); + inlineInput->Method()->SendMessage(&message); + } + + delete inlineInput; +} + diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index 54974145da..07f231ef30 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -26,6 +26,7 @@ class BScrollView; class BString; class BStringView; class BasicTerminalBuffer; +class InlineInput; class ResizeWindow; class TermBuffer; class TerminalBuffer; @@ -183,6 +184,11 @@ private: void _SendMouseEvent(int32 button, int32 mode, int32 x, int32 y, bool motion); + + void _DrawInlineMethodString(); + void _HandleInputMethodChanged(BMessage* message); + void _HandleInputMethodLocationRequest(); + void _CancelInputMethod(); private: class CharClassifier; @@ -222,10 +228,12 @@ private: int fEncoding; bool fActive; + // Object pointer. TerminalBuffer* fTextBuffer; BasicTerminalBuffer* fVisibleTextBuffer; BScrollBar* fScrollBar; + InlineInput* fInline; // Color and Attribute. rgb_color fTextForeColor; diff --git a/src/apps/terminal/TermWindow.cpp b/src/apps/terminal/TermWindow.cpp index 6454fad903..7feb2e73d8 100644 --- a/src/apps/terminal/TermWindow.cpp +++ b/src/apps/terminal/TermWindow.cpp @@ -9,6 +9,7 @@ #include "TermWindow.h" +#include #include #include #include @@ -228,13 +229,14 @@ TermWindow::_InitWindow() void TermWindow::MenusBeginning() { + TermView *view = _ActiveTermView(); + // Syncronize Encode Menu Pop-up menu and Preference. - BMenuItem *item = fEncodingmenu->FindItem(EncodingAsString(_ActiveTermView()->Encoding())); + BMenuItem *item = fEncodingmenu->FindItem( + EncodingAsString(view->Encoding())); if (item != NULL) item->SetMarked(true); - TermView *view = _ActiveTermView(); - BFont font; view->GetTermFont(&font); @@ -248,23 +250,28 @@ TermWindow::MenusBeginning() /* static */ -void -TermWindow::_MakeEncodingMenu(BMenu *eMenu, bool withShortcuts) +BMenu * +TermWindow::_MakeEncodingMenu() { + BMenu *menu = new (std::nothrow) BMenu("Text Encoding"); + if (menu == NULL) + return NULL; + int encoding; int i = 0; - while (get_nth_encoding(i, &encoding) == B_OK) { - BMessage *msg = new BMessage(MENU_ENCODING); - msg->AddInt32("op", (int32)encoding); - if (withShortcuts) { - eMenu->AddItem(new BMenuItem(EncodingAsString(encoding), - msg, id2shortcut(encoding))); - } else - eMenu->AddItem(new BMenuItem(EncodingAsString(encoding), - msg)); - + while (get_next_encoding(i, &encoding) == B_OK) { + BMessage *message = new BMessage(MENU_ENCODING); + if (message != NULL) { + message->AddInt32("op", (int32)encoding); + menu->AddItem(new BMenuItem(EncodingAsString(encoding), + message)); + } i++; } + + menu->SetRadioMode(true); + + return menu; } @@ -321,12 +328,9 @@ TermWindow::_SetupMenu() // Make Help Menu. fHelpmenu = new BMenu("Settings"); - fWindowSizeMenu = new BMenu("Window Size"); - _BuildWindowSizeMenu(fWindowSizeMenu); + fWindowSizeMenu = _MakeWindowSizeMenu(); - fEncodingmenu = new BMenu("Text Encoding"); - fEncodingmenu->SetRadioMode(true); - _MakeEncodingMenu(fEncodingmenu, false); + fEncodingmenu = _MakeEncodingMenu(); fSizeMenu = new BMenu("Text Size"); @@ -415,8 +419,10 @@ TermWindow::MessageReceived(BMessage *message) } case MENU_PREF_OPEN: - if (!fPrefWindow) + if (!fPrefWindow) { fPrefWindow = new PrefWindow(this); + //fPrefWindow-> + } else fPrefWindow->Activate(); break; @@ -427,12 +433,8 @@ TermWindow::MessageReceived(BMessage *message) case MENU_FIND_STRING: if (!fFindPanel) { - BRect r = Frame(); - r.left += 20; - r.top += 20; - r.right = r.left + 260; - r.bottom = r.top + 190; - fFindPanel = new FindWindow(r, this, fFindString, fFindSelection, fMatchWord, fMatchCase, fForwardSearch); + fFindPanel = new FindWindow(this, fFindString, fFindSelection, + fMatchWord, fMatchCase, fForwardSearch); } else fFindPanel->Activate(); @@ -970,16 +972,21 @@ TermWindow::_ResizeView(TermView *view) } -void -TermWindow::_BuildWindowSizeMenu(BMenu *menu) +/* static */ +BMenu* +TermWindow::_MakeWindowSizeMenu() { + BMenu *menu = new (std::nothrow) BMenu("Window Size"); + if (menu == NULL) + return NULL; + const int32 windowSizes[4][2] = { { 80, 25 }, { 80, 40 }, { 132, 25 }, { 132, 40 } - }; - + }; + const int32 sizeNum = sizeof(windowSizes) / sizeof(windowSizes[0]); for (int32 i = 0; i < sizeNum; i++) { char label[32]; @@ -995,6 +1002,8 @@ TermWindow::_BuildWindowSizeMenu(BMenu *menu) menu->AddSeparatorItem(); menu->AddItem(new BMenuItem("Fullscreen", new BMessage(FULLSCREEN), B_ENTER)); + + return menu; } diff --git a/src/apps/terminal/TermWindow.h b/src/apps/terminal/TermWindow.h index a9fc6439ab..6c45983f93 100644 --- a/src/apps/terminal/TermWindow.h +++ b/src/apps/terminal/TermWindow.h @@ -70,7 +70,9 @@ private: void _SetTermColors(TermViewContainerView *termView); void _InitWindow(); void _SetupMenu(); - static void _MakeEncodingMenu(BMenu *eMenu, bool withShortcuts); + static BMenu* _MakeEncodingMenu(); + static BMenu* _MakeWindowSizeMenu(); + void _GetPreferredFont(BFont &font); status_t _DoPageSetup(); void _DoPrint(); @@ -83,7 +85,7 @@ private: int32 _IndexOfTermView(TermView* termView) const; void _CheckChildren(); void _ResizeView(TermView *view); - void _BuildWindowSizeMenu(BMenu *menu); + int32 _NewSessionID(); BString fInitialTitle;