int EBuffer::BlockSelectLine() { int Y = VToR(CP.Row); if (BlockUnmark() == 0) return 0; BlockMode = bmStream; if (SetBB(EPoint(Y, 0)) == 0) return 0; if (Y == RCount - 1) { if (SetBE(EPoint(Y, LineLen(Y))) == 0) return 0; } else { if (SetBE(EPoint(Y + 1, 0)) == 0) return 0; } return 1; }
// Icart's hash function EPoint Icart::hash(ZZ_p u) { // 0 maps to the point at infinity if (IsZero(u)) { return EPoint(ZZ_p(0), ZZ_p(0), true); } // v = (3a - u^4) / 6u ZZ_p v = ((ZZ_p(3) * a) - power(u, 4)) * inv(ZZ_p(6) * u); // x = (v^2 - b - u^6/27)^(1/3) + u^2/3 ZZ_p x = power( sqr(v) - b - (power(u, ZZ(6)) * ts), exp) + (sqr(u) * th); // y = ux + v ZZ_p y = (u * x) + v; return EPoint(x, y, false); }
int EBuffer::BlockSelectWord() { int Y = VToR(CP.Row); PELine L = RLine(Y); int P; int C; if (BlockUnmark() == 0) return 0; BlockMode = bmStream; P = CharOffset(L, CP.Col); if (P >= L->Count) return 0; C = ChClassK(L->Chars[P]); while ((P > 0) && (C == ChClassK(L->Chars[P - 1]))) P--; if (SetBB(EPoint(Y, ScreenPos(L, P))) == 0) return 0; while ((P < L->Count) && (C == ChClassK(L->Chars[P]))) P++; if (SetBE(EPoint(Y, ScreenPos(L, P))) == 0) return 0; return 1; }
// Selects the current function. int EBuffer::BlockMarkFunction() { int by, ey; if (BlockUnmark() == 0) return 0; if ((by = FindFunction( 0, -1)) == -1) return 0; if ((ey = FindFunction(+1, +1)) == -1) return 0; //** Start and end are known. Set the block; BlockMode = bmStream; if (SetBB(EPoint(by, 0)) == 0) return 0; if (SetBE(EPoint(ey, 0)) == 0) return 0; return 1; }
void EBePrivateWin::FrameMoved(BPoint new_position) { BWindow::FrameMoved(new_position); if(fContactor.IsValid()) { EMessage message(E_WINDOW_MOVED); message.AddBool("etk:msg_from_gui", true); message.AddInt64("when", e_real_time_clock_usecs()); message.AddPoint("where", EPoint(new_position.x, new_position.y)); fContactor.SendMessage(&message); } }
TView::TView(ERect frame, const char *name, euint32 resizingMode, euint32 flags) : EView(frame, name, resizingMode, flags) { SetViewColor(216, 216, 216); #if TEST_SCROLLBAR ERect cR = Bounds(); ERect hR = Bounds(); ERect vR = Bounds(); cR.right -= 11; cR.bottom -= 11; hR.top = hR.bottom - 10; hR.right -= 10; vR.left = vR.right - 10; vR.bottom -= 10; EBox *box = new EBox(cR, NULL, E_FOLLOW_ALL); box->SetLabelAlignment(E_ALIGN_CENTER); box->SetLabel("装饰框框"); AddChild(box); #else EBox *box = new EBox(Bounds().InsetByCopy(-150, -150).OffsetToCopy(0, 0), NULL, E_FOLLOW_NONE); box->SetLabelAlignment(E_ALIGN_CENTER); box->SetLabel("装饰框框"); #endif ETextControl *edt = new ETextControl(ERect(10, 100, 250, 130), NULL, "主题:", "这个世界日新月异", NULL, E_FOLLOW_NONE, E_WILL_DRAW | E_FRAME_EVENTS | E_NAVIGABLE); edt->SetDivider(100); edt->SetAlignment(E_ALIGN_RIGHT, E_ALIGN_CENTER); // edt->HideTyping(true); // edt->HideTyping('*'); edt->ResizeToPreferred(); box->AddChild(edt); EButton *btn = new EButton(ERect(10, 280, 50, 300), NULL, "按钮", NULL); btn->SetFontSize(20); box->AddChild(btn); btn->ResizeToPreferred(); #if TEST_CHECKBOX ECheckBox *cbox = new ECheckBox(ERect(280, 60, 380, 90), NULL, "检查按钮", NULL); box->AddChild(cbox); #endif #if TEST_RADIOBUTTON EView *rbtns_group = new EView(ERect(430, 60, 530, 150), NULL, E_FOLLOW_NONE, 0); rbtns_group->AddChild(new ERadioButton(ERect(0, 0, 100, 30), NULL, "组合按钮1", NULL)); rbtns_group->AddChild(new ERadioButton(ERect(0, 30, 100, 60), NULL, "组合按钮2", NULL)); rbtns_group->AddChild(new ERadioButton(ERect(0, 60, 100, 90), NULL, "组合按钮3", NULL)); box->AddChild(rbtns_group); #endif #if TEST_LISTVIEW EListView *listView = new EListView(ERect(0, 0, 200, 300), NULL, E_MULTIPLE_SELECTION_LIST, E_FOLLOW_NONE); listView->AddItem(new EStringItem("Item1")); listView->AddItem(new EStringItem("Item2", 1)); listView->AddItem(new EStringItem("Item3")); listView->AddItem(new EStringItem("Item4", 2)); listView->AddItem(new EStringItem("Item5")); listView->AddItem(new EStringItem("Item6")); listView->AddItem(new EStringItem("Item7")); listView->AddItem(new EStringItem("Item8")); listView->AddItem(new EStringItem("Item9")); listView->AddItem(new EStringItem("Item10")); listView->AddItem(new EStringItem("Item11")); listView->AddItem(new EStringItem("Item12")); listView->AddItem(new EStringItem("Item13")); box->AddChild(new EScrollView(ERect(100, 180, 250, 280), NULL, listView, E_FOLLOW_NONE)); EOutlineListView *outline = new EOutlineListView(ERect(0, 0, 400, 300), NULL, E_SINGLE_SELECTION_LIST, E_FOLLOW_NONE); EListItem *region, *state, *locality; outline->AddItem(region = new EStringItem("United States of America")); outline->AddUnder(state = new EStringItem("California"), region); outline->AddUnder(new EStringItem("Menlo Park"), state); outline->AddUnder(new EStringItem("Los Angeles"), state); outline->AddUnder(locality = new EStringItem("New York"), region); outline->AddUnder(new EStringItem("Albany"), locality); outline->AddUnder(new EStringItem("Buffalo"), locality); outline->AddUnder(new EStringItem("New York City"), locality); outline->AddItem(region = new EStringItem("Europe")); outline->AddUnder(locality = new EStringItem("France"), region); outline->AddUnder(new EStringItem("Paris"), locality); outline->AddUnder(locality = new EStringItem("Germany"), region); outline->AddUnder(new EStringItem("Berlin"), locality); outline->AddUnder(new EStringItem("Hamburg"), locality); outline->AddUnder(locality = new EStringItem("Italy"), region); outline->AddUnder(new EStringItem("Milan"), locality); outline->AddUnder(new EStringItem("Rome"), locality); box->AddChild(new EScrollView(ERect(100, 300, 350, 450), NULL, outline, E_FOLLOW_NONE)); #endif #if TEST_TEXTVIEW e_text_run_array array; array.count = 1; array.runs[0].font = *etk_plain_font; ETextView *textView = new ETextView(ERect(0, 0, 450, 200), NULL, ERect(0, 0, 450, 200)); // textView->HideTyping(true); // textView->HideTyping('*'); textView->SetAutoindent(true); array.runs[0].offset = 16; array.runs[0].font.SetSize(16); array.runs[0].color.set_to(0, 0, 200, 255); array.runs[0].background.set_to(255, 255, 0, 255); array.runs[0].underline = false; textView->Insert("This is a test, Be", &array); array.runs[0].offset = 0; array.runs[0].color.set_to(200, 0, 0, 255); textView->Insert(-1, "OS", -1, &array); array.runs[0].offset = 0; array.runs[0].font.SetSize(12); array.runs[0].color.set_to(200, 0, 200, 255); array.runs[0].background.alpha = 0; textView->Insert(-1, " style TextView, just enjoy it. :)\n", -1, &array); array.runs[0].offset = 0; array.runs[0].font = *etk_bold_font; array.runs[0].font.SetSize(20); array.runs[0].color.set_to(200, 0, 0, 255); array.runs[0].underline = true; textView->Insert(-1, "多行", -1, &array); array.runs[0].offset = 0; array.runs[0].font.SetSize(16); array.runs[0].color.set_to(0, 50, 0, 255); array.runs[0].underline = true; textView->Insert(-1, "文本", -1, &array); array.runs[0].offset = 0; array.runs[0].font.SetSize(30); array.runs[0].color.set_to(0, 0, 200, 255); array.runs[0].underline = false; textView->Insert(-1, "编辑", -1, &array); array.runs[0].offset = 0; array.runs[0].font = *etk_plain_font; array.runs[0].font.SetSize(10); array.runs[0].color.set_to(0, 0, 0, 255); textView->Insert(-1, "测试...", -1, &array); textView->Select(5, 20, true); box->AddChild(new EScrollView(ERect(100, 500, 350, 650), NULL, textView, E_FOLLOW_NONE)); #endif #if TEST_TABVIEW ETabView *tabView = new ETabView(ERect(360, 300, 700, 500), NULL, E_WIDTH_FROM_LABEL, E_FOLLOW_NONE); ERect tabVR = tabView->ContainerView()->Bounds(); ETab *tab = new ETab(new EStringView(tabVR, NULL, "Hello, This is the TAB 1.\nShow it...", E_FOLLOW_ALL)); tab->SetLabel("Tab 1"); tabView->AddTab(NULL, tab); tab = new ETab(new EColorControl(EPoint(5, 5), NULL, NULL, true)); tab->SetLabel(">> ColorControl <<"); tabView->AddTab(NULL, tab); tab = new ETab(new EStringView(tabVR, NULL, "Hello, This is the ** TAB 3 **.\nShow it...", E_FOLLOW_ALL)); tab->SetLabel(" Tab 3 "); tabView->AddTab(NULL, tab); box->AddChild(tabView); #endif #if TEST_SCROLLBAR EScrollBar *hScrollBar = new EScrollBar(hR, NULL, 0, -100, 100, E_HORIZONTAL); EScrollBar *vScrollBar = new EScrollBar(vR, NULL, 0, -100, 100, E_VERTICAL); AddChild(hScrollBar); AddChild(vScrollBar); hScrollBar->SetTarget(box); vScrollBar->SetTarget(box); #else EScrollView *scv = new EScrollView(Bounds(), NULL, box, E_FOLLOW_ALL); AddChild(scv); #endif #if TEST_STATUSBAR fStatusBar = new EStatusBar(ERect(280, 250, 500, 290), NULL, "进度条示例:", "/100"); box->AddChild(fStatusBar); SetFlags(Flags() | E_PULSE_NEEDED); #endif #if TEST_MENUFIELD EMenu *menu = new EMenu("Options", E_ITEMS_IN_COLUMN); menu->SetLabelFromMarked(true); menu->AddItem(new EMenuItem("First Item", NULL)); menu->AddSeparatorItem(); menu->AddItem(new EMenuItem("Item", NULL)); menu->AddItem(new EMenuItem("Item Item", NULL)); menu->AddItem(new EMenuItem("Item Item Item", NULL)); menu->AddItem(new EMenuItem("Item Item Item Item", NULL)); menu->AddSeparatorItem(); menu->AddItem(new EMenuItem("Last Item", NULL)); menu->ItemAt(0)->SetMarked(true); EMenuField *menuField = new EMenuField(ERect(280, 150, 500, 200), NULL, "候选框:", menu, true); box->AddChild(menuField); #endif }
int main(int argc, char **argv) { ETK_OUTPUT("message-test in ETK(%u.%u.%u)...\n", etk_major_version, etk_minor_version, etk_micro_version); EMessage *msg = new EMessage('TMSG'); ETK_OUTPUT("=============== SET DATA 0 ===================\n"); msg->AddString("String", "I am a test"); if(msg->HasString("String")) ETK_OUTPUT("String <= \"I am a test\"\n"); msg->AddInt8("Int8", (eint8)-0x3A); if(msg->HasInt8("Int8")) ETK_OUTPUT("Int8 <= %hhx -- %hhi\n", (eint8)-0x3A, (eint8)-0x3A); msg->AddInt16("Int16", (eint16)-0x3AFA); if(msg->HasInt16("Int16")) ETK_OUTPUT("Int16 <= %hx -- %hi\n", (eint16)-0x3AFA, (eint16)-0x3AFA); msg->AddInt32("Int32", (eint32)-0x3AFAFAFA); if(msg->HasInt32("Int32")) ETK_OUTPUT("Int32 <= %x --- %i\n", (eint32)-0x3AFAFAFA, (eint32)-0x3AFAFAFA); msg->AddInt64("Int64", E_INT64_CONSTANT(-0x3AFAFAFAFAFAFAFA)); if(msg->HasInt64("Int64")) ETK_OUTPUT("Int64 <= %llx -- %lli\n", E_INT64_CONSTANT(-0x3AFAFAFAFAFAFAFA), E_INT64_CONSTANT(-0x3AFAFAFAFAFAFAFA)); msg->AddBool("Bool", true); if(msg->HasBool("Bool")) ETK_OUTPUT("Bool <= %d\n", true); msg->AddFloat("Float", 0.5); if(msg->HasFloat("Float")) ETK_OUTPUT("Float <= %g\n", 0.5); // msg->AddDouble("Double", M_PI); // if(msg->HasDouble("Double")) ETK_OUTPUT("Double <= %lg\n", M_PI); msg->AddPoint("Point", EPoint(12, 15)); if(msg->HasPoint("Point")) ETK_OUTPUT("Point <= X: %g\tY: %g\n", 12., 15.); msg->AddRect("Rect", ERect(0, 0, 800, 600)); if(msg->HasRect("Rect")) ETK_OUTPUT("Rect <= LEFT: %g\tTOP: %g\tRIGHT: %g\tBOTTOM: %g\n", 0., 0., 800., 600.); ETK_OUTPUT("==============================================\n"); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== SET DATA 1 ===================\n"); msg->AddString("String", "Test again"); if(msg->HasString("String")) ETK_OUTPUT("String <= \"Test again\"\n"); msg->AddInt8("Int8", (eint8)0xFA); if(msg->HasInt8("Int8")) ETK_OUTPUT("Int8 <= %hhx -- %hhi\n", (eint8)0xFA, (eint8)0xFA); msg->AddInt16("Int16", (eint16)0xFAFA); if(msg->HasInt16("Int16")) ETK_OUTPUT("Int16 <= %hx -- %hi\n", (eint16)0xFAFA, (eint16)0xFAFA); msg->AddInt32("Int32", (eint32)0xFAFAFAFA); if(msg->HasInt32("Int32")) ETK_OUTPUT("Int32 <= %x --- %i\n", (eint32)0xFAFAFAFA, (eint32)0xFAFAFAFA); msg->AddInt64("Int64", E_INT64_CONSTANT(0xFAFAFAFAFAFAFAFA)); if(msg->HasInt64("Int64")) ETK_OUTPUT("Int64 <= %llx -- %lli\n", E_INT64_CONSTANT(0xFAFAFAFAFAFAFAFA), E_INT64_CONSTANT(0xFAFAFAFAFAFAFAFA)); msg->AddBool("Bool", false); if(msg->HasBool("Bool")) ETK_OUTPUT("Bool <= %d\n", false); msg->AddFloat("Float", 0.125); if(msg->HasFloat("Float")) ETK_OUTPUT("Float <= %g\n", 0.125); // msg->AddDouble("Double", M_PI_4); // if(msg->HasDouble("Double")) ETK_OUTPUT("Double <= %lg\n", M_PI_4); msg->AddPoint("Point", EPoint(34, 176)); if(msg->HasPoint("Point")) ETK_OUTPUT("Point <= X: %g\tY: %g\n", 34., 176.); msg->AddRect("Rect", ERect(231, 121, 355, 595)); if(msg->HasRect("Rect")) ETK_OUTPUT("Rect <= LEFT: %g\tTOP: %g\tRIGHT: %g\tBOTTOM: %g\n", 231., 121., 355., 595.); ETK_OUTPUT("==============================================\n"); const char *gstr = NULL; eint8 gi8; eint16 gi16; eint32 gi32; eint64 gi64; bool gbool; float gfl; double gdl; EPoint gpt; ERect grt; ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== GET DATA 0 ===================\n"); if(msg->FindString("String", &gstr)) ETK_OUTPUT("String => \"%s\"\n", gstr); if(msg->FindInt8("Int8", &gi8)) ETK_OUTPUT("Int8 => %hhx --- %hhi\n", gi8, gi8); if(msg->FindInt16("Int16", &gi16)) ETK_OUTPUT("Int16 => %hx --- %hi\n", gi16, gi16); if(msg->FindInt32("Int32", &gi32)) ETK_OUTPUT("Int32 => %x --- %i\n", gi32, gi32); if(msg->FindInt64("Int64", &gi64)) ETK_OUTPUT("Int64 => %llx --- %lli\n", gi64, gi64); if(msg->FindBool("Bool", &gbool)) ETK_OUTPUT("Bool => %d\n", gbool); if(msg->FindFloat("Float", &gfl)) ETK_OUTPUT("Float => %g\n", gfl); if(msg->FindDouble("Double", &gdl)) ETK_OUTPUT("Double => %lg\n", gdl); if(msg->FindPoint("Point", &gpt)) ETK_OUTPUT("Point => X: %g\tY: %g\n", gpt.x, gpt.y); if(msg->FindRect("Rect", &grt)) ETK_OUTPUT("Rect => LEFT: %g\tTOP: %g\tRIGHT: %g\tBOTTOM: %g\n", grt.left, grt.top, grt.right, grt.bottom); ETK_OUTPUT("==============================================\n"); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== GET DATA 1 ===================\n"); if(msg->FindString("String", 1, &gstr)) ETK_OUTPUT("String => \"%s\"\n", gstr); if(msg->FindInt8("Int8", 1, &gi8)) ETK_OUTPUT("Int8 => %hhx --- %hhi\n", gi8, gi8); if(msg->FindInt16("Int16", 1, &gi16)) ETK_OUTPUT("Int16 => %hx --- %hi\n", gi16, gi16); if(msg->FindInt32("Int32", 1, &gi32)) ETK_OUTPUT("Int32 => %x --- %i\n", gi32, gi32); if(msg->FindInt64("Int64", 1, &gi64)) ETK_OUTPUT("Int64 => %llx --- %lli\n", gi64, gi64); if(msg->FindBool("Bool", 1, &gbool)) ETK_OUTPUT("Bool => %d\n", gbool); if(msg->FindFloat("Float", 1, &gfl)) ETK_OUTPUT("Float => %g\n", gfl); if(msg->FindDouble("Double", 1, &gdl)) ETK_OUTPUT("Double => %lg\n", gdl); if(msg->FindPoint("Point", 1, &gpt)) ETK_OUTPUT("Point => X: %g\tY: %g\n", gpt.x, gpt.y); if(msg->FindRect("Rect", 1, &grt)) ETK_OUTPUT("Rect => LEFT: %g\tTOP: %g\tRIGHT: %g\tBOTTOM: %g\n", grt.left, grt.top, grt.right, grt.bottom); ETK_OUTPUT("==============================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== PRINT TO STREAM ===================\n"); msg->PrintToStream(); ETK_OUTPUT("===================================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== FLATTEN ===================\n"); size_t flattened_size = msg->FlattenedSize(); ETK_OUTPUT("FlattenedSize = %lu\n", (unsigned long)flattened_size); char *flatten = (char*)malloc(flattened_size); if(flatten) { if(msg->Flatten(flatten, flattened_size)) { msg->MakeEmpty(); ETK_OUTPUT("Message have been flattened to the buffer and empty\n"); if(msg->Unflatten(flatten, flattened_size)) { ETK_OUTPUT("Message have been unflattened to the buffer\n"); msg->PrintToStream(); } } free(flatten); } ETK_OUTPUT("===========================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== REPLACE DATA ===================\n"); msg->ReplaceString("String", 1, "Test again, Test again, do you right?"); msg->ReplaceInt8("Int8", 1, (eint8)0xEE); msg->ReplaceInt16("Int16", 1, (eint16)0xEEEE); msg->ReplaceInt32("Int32", 1, (eint32)0xEEEEEEEE); msg->ReplaceInt64("Int64", 1, E_INT64_CONSTANT(0xEEEEEEEEEEEEEEEE)); msg->ReplaceBool("Bool", 1, false); msg->ReplaceFloat("Float", 1, 0.00005); // msg->ReplaceDouble("Double", 1, M_PI_2); msg->PrintToStream(); ETK_OUTPUT("================================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== REMOVE DATA ===================\n"); msg->RemoveString("String"); msg->RemoveInt8("Int8"); msg->RemoveInt16("Int16", 1); msg->RemoveInt32("Int32", 1); msg->RemoveInt64("Int64"); msg->RemoveBool("Bool", 1); msg->RemoveFloat("Float", 1); msg->RemoveDouble("Double", 1); msg->PrintToStream(); ETK_OUTPUT("===============================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== aMsg = *msg ===================\n"); EMessage aMsg = *msg; aMsg.PrintToStream(); ETK_OUTPUT("===============================================\n"); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== aMsg.MakeEmpty ===============\n"); aMsg.MakeEmpty(); aMsg.PrintToStream(); ETK_OUTPUT("===============================================\n"); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== aMsg.AddPointer ===============\n"); aMsg.AddPointer("Pointer", msg); aMsg.PrintToStream(); ETK_OUTPUT("===============================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== aMsg.FindPointer ===============\n"); EMessage *kMsg = NULL; if(aMsg.FindPointer("Pointer", (void**)&kMsg) && kMsg) { ETK_OUTPUT("msg:address %p\n", kMsg); kMsg->PrintToStream(); } ETK_OUTPUT("===============================================\n"); getchar(); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== aMsg.Flatten ===============\n"); flattened_size = aMsg.FlattenedSize(); ETK_OUTPUT("FlattenedSize = %lu\n", (unsigned long)flattened_size); flatten = (char*)malloc(flattened_size); if(flatten) { if(aMsg.Flatten(flatten, flattened_size)) { aMsg.what = 0; aMsg.MakeEmpty(); ETK_OUTPUT("Message have been flattened to the buffer and empty\n"); if(aMsg.Unflatten(flatten, flattened_size)) { ETK_OUTPUT("Message have been unflattened to the buffer\n"); aMsg.PrintToStream(); EMessage *pMsg = NULL; if(aMsg.FindPointer("Pointer", (void**)&pMsg) && pMsg) { pMsg->PrintToStream(); } else { ETK_OUTPUT("********FAILED**********\n"); } } } free(flatten); } ETK_OUTPUT("===========================================\n"); ETK_OUTPUT("\n\n\n"); ETK_OUTPUT("=============== msg->BGetInfo ===============\n"); char *name; euint32 type; eint32 count; for(eint32 i = 0; msg->BGetInfo(E_ANY_TYPE, i, &name, &type, &count) == E_OK; i++) { ETK_OUTPUT("[%I32i]: Name: \"%s\", type: \'%c%c%c%c\', count: %I32i\n", i, name, #ifdef ETK_LITTLE_ENDIAN (euint8)(type >> 24), (euint8)((type >> 16) & 0xff), (euint8)((type >> 8) & 0xff), (euint8)(type & 0xff), #else (euint8)(type & 0xff), (euint8)((type >> 8) & 0xff), (euint8)((type >> 16) & 0xff), (euint8)(type >> 24), #endif count); } ETK_OUTPUT("===========================================\n"); delete msg; return 0; }
void EBePrivateWin::DispatchMessage(BMessage *bMsg, BHandler *handler) { bool handled = true; if(bMsg->what == 'etk_') { int32 what = 0; bMsg->FindInt32("etk:what", &what); switch(what) { case ETK_BEOS_QUIT: doQuit = true; PostMessage(B_QUIT_REQUESTED); break; case ETK_BEOS_CONTACT_TO: { fContactor = EMessenger(); const char *buffer = NULL; ssize_t size = -1; if(bMsg->FindData("etk:messenger", B_ANY_TYPE, (const void**)&buffer, &size) != B_OK) break; if(buffer == NULL || size <= 0) break; fContactor.Unflatten(buffer, (size_t)size); } break; case ETK_BEOS_SET_BACKGROUND: { rgb_color bkColor; if(bMsg->FindInt32("background", (int32*)&bkColor) != B_OK) break; fTopView->SetViewColor(bkColor); fTopView->Invalidate(); } break; case ETK_BEOS_SET_LOOK: { int8 look; if(bMsg->FindInt8("look", &look) != B_OK) break; switch((e_window_look)look) { case E_BORDERED_WINDOW_LOOK: SetLook(B_BORDERED_WINDOW_LOOK); break; case E_NO_BORDER_WINDOW_LOOK: SetLook(B_NO_BORDER_WINDOW_LOOK); break; case E_TITLED_WINDOW_LOOK: SetLook(B_TITLED_WINDOW_LOOK); break; case E_DOCUMENT_WINDOW_LOOK: SetLook(B_DOCUMENT_WINDOW_LOOK); break; case E_MODAL_WINDOW_LOOK: SetLook(B_MODAL_WINDOW_LOOK); break; case E_FLOATING_WINDOW_LOOK: SetLook(B_FLOATING_WINDOW_LOOK); break; default: break; } } break; case ETK_BEOS_SET_TITLE: { const char *title = NULL; if(bMsg->FindString("title", &title) != B_OK) break; SetTitle(title); } break; case ETK_BEOS_SET_WORKSPACES: { uint32 workspaces = 0; if(bMsg->FindInt32("workspaces", (int32*)&workspaces) != B_OK) break; if(workspaces == 0) workspaces = current_workspace() + 1; SetWorkspaces(workspaces); } break; case ETK_BEOS_GET_WORKSPACES: { uint32 workspaces = Workspaces(); bMsg->AddInt32("workspaces", *((int32*)&workspaces)); } break; case ETK_BEOS_ICONIFY: if(!IsMinimized()) Minimize(true); break; case ETK_BEOS_SHOW: if(IsHidden()) { uint32 oldFlags = Flags(); SetFlags(oldFlags | B_AVOID_FOCUS); Show(); if(Look() != B_NO_BORDER_WINDOW_LOOK) SetFlags(oldFlags); } break; case ETK_BEOS_HIDE: if(!IsHidden()) Hide(); break; case ETK_BEOS_RAISE: if(!IsFront()) { uint32 oldFlags = Flags(); SetFlags(oldFlags | B_AVOID_FOCUS); Activate(true); if(Look() != B_NO_BORDER_WINDOW_LOOK) SetFlags(oldFlags); } break; case ETK_BEOS_LOWER: { BHandler *_frontWin = NULL; if(bMsg->FindPointer("front", (void**)&_frontWin) != B_OK) break; BWindow *frontWin = e_cast_as(_frontWin, BWindow); if(frontWin == NULL) break; SendBehind(frontWin); bMsg->AddBool("done", true); } break; case ETK_BEOS_ACTIVATE: { bool state; if(bMsg->FindBool("state", &state) != B_OK || state == IsActive()) break; Activate(state); } break; case ETK_BEOS_GET_ACTIVATED_STATE: bMsg->AddBool("state", IsActive()); break; case ETK_BEOS_MOVE_RESIZE: { if(bMsg->HasPoint("where")) { BPoint pt; if(bMsg->FindPoint("where", &pt) == B_OK) MoveTo(pt); } if(bMsg->HasFloat("width") && bMsg->HasFloat("height")) { float w = -1, h = -1; bMsg->FindFloat("width", &w); bMsg->FindFloat("height", &h); if(w < 0 || h < 0) break; ResizeTo(w, h); } } break; case ETK_BEOS_DRAW_BITMAP: { BBitmap *bitmap = NULL; BRect srcRect, destRect; const ERegion *clipping = NULL; if(bMsg->FindPointer("bitmap", (void**)&bitmap) != B_OK || bitmap == NULL) break; bMsg->FindRect("src", &srcRect); bMsg->FindRect("dest", &destRect); if(srcRect.IsValid() == false || destRect.IsValid() == false) break; bMsg->FindPointer("clipping", (void**)&clipping); BRegion beRegion; __etk_convert_region(clipping, &beRegion, fTopView->Bounds()); fTopView->ConstrainClippingRegion(&beRegion); fTopView->DrawBitmap(bitmap, srcRect, destRect); } break; case ETK_BEOS_GRAB_MOUSE: case ETK_BEOS_UNGRAB_MOUSE: { uint32 options = (what == ETK_BEOS_GRAB_MOUSE ? B_LOCK_WINDOW_FOCUS : 0); if(fTopView->SetEventMask(B_POINTER_EVENTS, options) != B_OK) break; bMsg->AddBool("state", what == ETK_BEOS_GRAB_MOUSE); } break; case ETK_BEOS_GRAB_KEYBOARD: case ETK_BEOS_UNGRAB_KEYBOARD: { uint32 options = (what == ETK_BEOS_GRAB_KEYBOARD ? B_LOCK_WINDOW_FOCUS : 0); if(fTopView->SetEventMask(B_KEYBOARD_EVENTS, options) != B_OK) break; bMsg->AddBool("state", what == ETK_BEOS_GRAB_KEYBOARD); } break; case ETK_BEOS_QUERY_MOUSE: { BPoint pt; uint32 btns = 0; fTopView->GetMouse(&pt, &btns, false); bMsg->AddInt32("x", (int32)pt.x); bMsg->AddInt32("y", (int32)pt.y); bMsg->AddInt32("buttons", (int32)btns); } break; case ETK_BEOS_SET_SIZE_LIMITS: { BRect r; if(bMsg->FindRect("limits", &r) != B_OK) break; SetSizeLimits(r.left, r.right, r.top, r.bottom); bMsg->AddBool("done", true); } break; case ETK_BEOS_GET_SIZE_LIMITS: { BRect r(-1, -1, -1, -1); GetSizeLimits(&(r.left), &(r.right), &(r.top), &(r.bottom)); bMsg->AddRect("limits", r); } break; default: handled = false; break; } if(handled) { BMessage aMsg(*bMsg); bMsg->SendReply(&aMsg); return; } } switch(bMsg->what) { case B_WINDOW_ACTIVATED: { handled = false; if(fContactor.IsValid() == false) break; EMessage message(E_WINDOW_ACTIVATED); message.AddBool("etk:msg_from_gui", true); message.AddInt64("when", e_real_time_clock_usecs()); fContactor.SendMessage(&message); } break; case B_MOUSE_DOWN: case B_MOUSE_UP: case B_MOUSE_MOVED: { if(fContactor.IsValid() == false) break; BPoint where; int32 buttons = 0; bMsg->FindPoint("where", &where); if(bMsg->what != B_MOUSE_UP) bMsg->FindInt32("buttons", &buttons); int32 clicks = 1; if(bMsg->what == B_MOUSE_DOWN) { #if 0 bMsg->FindInt32("clicks", &clicks); #else bigtime_t eventTime; if(bMsg->FindInt64("when", &eventTime) == B_OK) { if(eventTime - fPrevMouseDownTime <= CLICK_TIMEOUT) clicks = (fPrevMouseDownCount += 1); else clicks = fPrevMouseDownCount = 1; fPrevMouseDownTime = eventTime; } #endif } EMessage message; if(bMsg->what == B_MOUSE_DOWN) message.what = E_MOUSE_DOWN; else if(bMsg->what == B_MOUSE_UP) message.what = E_MOUSE_UP; else message.what = E_MOUSE_MOVED; message.AddBool("etk:msg_from_gui", true); message.AddInt64("when", e_real_time_clock_usecs()); if(bMsg->what != B_MOUSE_UP) message.AddInt32("buttons", buttons); if(bMsg->what == B_MOUSE_DOWN) message.AddInt32("clicks", clicks); message.AddPoint("where", EPoint(where.x, where.y)); ConvertToScreen(&where); message.AddPoint("screen_where", EPoint(where.x, where.y)); // TODO: modifiers message.AddMessenger("etk:msg_for_target", fContactor); etk_app->PostMessage(&message); } break; case B_KEY_DOWN: case B_KEY_UP: case B_UNMAPPED_KEY_DOWN: case B_UNMAPPED_KEY_UP: { if(fContactor.IsValid() == false) break; int8 byte[4]; const char *bytes = NULL; int32 numBytes = 0; int32 key = 0; int32 key_repeat = 0; int32 beModifiers = 0; eint32 modifiers = 0; bMsg->FindInt32("key", &key); bMsg->FindInt32("modifiers", &beModifiers); bzero(byte, sizeof(int8) * 4); if(bMsg->what == B_KEY_DOWN || bMsg->what == B_KEY_UP) { for(int32 i = 0; i < 3; i++) bMsg->FindInt8("byte", i, &byte[i]); if(bMsg->FindString("bytes", &bytes) == B_OK) numBytes = strlen(bytes); // if(bMsg->what == B_KEY_DOWN) bMsg->FindInt32("be:key_repeat", &key_repeat); } else { etk_beos_get_byte(beModifiers, key, (char*)byte); } if(beModifiers & B_SHIFT_KEY) modifiers |= E_SHIFT_KEY; if(beModifiers & B_CONTROL_KEY) modifiers |= E_CONTROL_KEY; if(beModifiers & B_COMMAND_KEY) modifiers |= E_COMMAND_KEY; EMessage message; if(bMsg->what == B_KEY_DOWN) message.what = E_KEY_DOWN; else if(bMsg->what == B_KEY_UP) message.what = E_KEY_UP; else if(bMsg->what == B_UNMAPPED_KEY_DOWN) message.what = E_UNMAPPED_KEY_DOWN; else message.what = E_UNMAPPED_KEY_UP; message.AddBool("etk:msg_from_gui", true); message.AddInt64("when", e_real_time_clock_usecs()); message.AddInt32("key", key); message.AddInt32("modifiers", modifiers); if(bMsg->what == B_KEY_DOWN || bMsg->what == B_KEY_UP) { if(bMsg->what == B_KEY_DOWN) message.AddInt32("etk:key_repeat", key_repeat); for(int32 i = 0; i < 3; i++) message.AddInt8("byte", byte[i]); if(!(numBytes != 1 || *bytes != byte[0])) { etk_beos_get_byte(beModifiers, key, (char*)byte); message.AddString("bytes", (char*)byte); } else if(numBytes > 0) { message.AddString("bytes", bytes); } } else if(byte[0] != 0) { message.AddInt8("byte", byte[0]); message.AddString("bytes", (char*)byte); } message.AddMessenger("etk:msg_for_target", fContactor); etk_app->PostMessage(&message); } break; case B_MODIFIERS_CHANGED: { if(fContactor.IsValid() == false) break; eint32 modifiers = 0; eint32 old_modifiers = 0; int32 beModifiers = 0; int32 old_beModifiers = 0; bMsg->FindInt32("modifiers", &beModifiers); bMsg->FindInt32("be:old_modifiers", &old_beModifiers); if(beModifiers & B_SHIFT_KEY) modifiers |= E_SHIFT_KEY; if(beModifiers & B_CONTROL_KEY) modifiers |= E_CONTROL_KEY; if(beModifiers & B_COMMAND_KEY) modifiers |= E_COMMAND_KEY; if(old_beModifiers & B_SHIFT_KEY) old_modifiers |= E_SHIFT_KEY; if(old_beModifiers & B_CONTROL_KEY) old_modifiers |= E_CONTROL_KEY; if(old_beModifiers & B_COMMAND_KEY) old_modifiers |= E_COMMAND_KEY; EMessage message(E_MODIFIERS_CHANGED); message.AddBool("etk:msg_from_gui", true); message.AddInt64("when", e_real_time_clock_usecs()); message.AddInt32("modifiers", modifiers); message.AddInt32("etk:old_modifiers", old_modifiers); message.AddMessenger("etk:msg_for_target", fContactor); etk_app->PostMessage(&message); } break; default: handled = false; break; } if(!handled) BWindow::DispatchMessage(bMsg, handler); }
void ETextEditable::Draw(ERect updateRect) { if(!IsVisible()) return; ERect rect = Frame().OffsetToSelf(E_ORIGIN); rect.left += fMargins.left; rect.top += fMargins.top; rect.right -= fMargins.right; rect.bottom -= fMargins.bottom; if(!rect.IsValid()) return; ERegion clipping; GetClippingRegion(&clipping); if(clipping.CountRects() > 0) clipping &= (rect & updateRect); else clipping = (rect & updateRect); if(clipping.CountRects() <= 0) return; e_rgb_color bkColor = e_ui_color(E_DOCUMENT_BACKGROUND_COLOR); e_rgb_color fgColor = e_ui_color(E_DOCUMENT_TEXT_COLOR); if(!IsEnabled()) { bkColor.disable(ViewColor()); fgColor.disable(ViewColor()); } if(!IsFocusChanging()) { PushState(); ConstrainClippingRegion(&clipping); SetDrawingMode(E_OP_COPY); SetPenSize(0); SetHighColor(bkColor); FillRect(rect & updateRect, E_SOLID_HIGH); PopState(); } EFont font; e_font_height fontHeight; GetFont(&font); font.GetHeight(&fontHeight); if(fCount > 0 && !IsFocusChanging()) { PushState(); ConstrainClippingRegion(&clipping); float x = 0, y = 0; if(GetCharLocation(0, &x, &y, &font)) { SetDrawingMode(E_OP_COPY); SetPenSize(0); SetHighColor(fgColor); SetLowColor(bkColor); _DrawString(fText, EPoint(x, y)); if(IsEnabled() && IsSelected()) { char *selectedText = DuplicateText(fSelectStart, fSelectEnd); if(selectedText != NULL) { x = 0; y = 0; if(GetCharLocation(fSelectStart, &x, &y, &font)) { DrawSelectedBackground(updateRect); SetLowColor(e_ui_color(E_DOCUMENT_HIGHLIGHT_COLOR)); _DrawString(selectedText, EPoint(x, y)); } free(selectedText); } } } PopState(); } if(IsEnabled() && IsEditable() && (IsFocus() || IsFocusChanging())) { PushState(); ConstrainClippingRegion(&clipping); DrawCursor(); PopState(); } if((IsFocus() || IsFocusChanging()) && Window()->IsActivate() && IsEnabled() && (Flags() & E_NAVIGABLE)) { e_rgb_color color = e_ui_color(E_NAVIGATION_BASE_COLOR); if(IsFocusChanging() && !IsFocus()) color = e_ui_color(E_DOCUMENT_BACKGROUND_COLOR); PushState(); ConstrainClippingRegion(&clipping); SetDrawingMode(E_OP_COPY); SetPenSize(0); SetHighColor(color); StrokeRect(rect, E_SOLID_HIGH); PopState(); } }