void TExpandoMenuBar::MouseMoved(BPoint where, uint32 code, const BMessage *message) { if (!message) { // force a cleanup fBarView->DragStop(true); BMenuBar::MouseMoved(where, code, message); return; } BPoint loc; uint32 buttons; GetMouse(&loc, &buttons); switch (code) { case B_ENTERED_VIEW: if (message && buttons != 0) { fBarView->CacheDragData((BMessage *)message); MouseDown(loc); } break; case B_EXITED_VIEW: if (fBarView->Dragging() && buttons != 0) { if (!ItemAtPoint(where) && !InBeMenu(where) && (fSeparatorItem && !fSeparatorItem->Frame().Contains(where)) && !Frame().Contains(where)) fBarView->DragStop(); } break; } BMenuBar::MouseMoved(where, code, message); }
void TExpandoMenuBar::MouseDown(BPoint where) { BMessage *message = Window()->CurrentMessage(); // check for three finger salute, a.k.a. Vulcan Death Grip if (message != NULL) { int32 modifiers = 0; message->FindInt32("modifiers", &modifiers); if ((modifiers & B_COMMAND_KEY) != 0 && (modifiers & B_OPTION_KEY) != 0 && (modifiers & B_SHIFT_KEY) != 0 && !fBarView->Dragging()) { TTeamMenuItem *item = ItemAtPoint(where); if (item) { const BList *teams = item->Teams(); int32 teamCount = teams->CountItems(); team_id teamID; for (int32 team = 0; team < teamCount; team++) { teamID = (team_id)teams->ItemAt(team); kill_team(teamID); // remove the team immediately // from display RemoveTeam(teamID, false); } return; } } } const int32 count = CountItems(); // This feature is broken because the menu bar never receives // the second click #ifdef DOUBLECLICKBRINGSTOFRONT // doubleclick on an item brings all to front for (int32 i = fFirstApp; i < count; i++) { TTeamMenuItem *item = (TTeamMenuItem *)ItemAt(i); if (item->Frame().Contains(where)) { bigtime_t clickSpeed = 0; get_click_speed(&clickSpeed); if ( (fLastClickItem == i) && (clickSpeed > (system_time() - fLastClickTime)) ) { // bring this team's window to the front BMessage showMessage(M_BRING_TEAM_TO_FRONT); showMessage.AddInt32("itemIndex", i); Window()->PostMessage(&showMessage, this); return; } fLastClickItem = i; fLastClickTime = system_time(); break; } } #endif // control click - show all/hide all shortcut if (message != NULL) { int32 modifiers = 0; message->FindInt32("modifiers", &modifiers); if ((modifiers & B_CONTROL_KEY) != 0 && ! fBarView->Dragging()) { int32 lastApp = -1; // find the clicked item for (int32 i = fFirstApp; i < count; i++) { const TTeamMenuItem *item = (TTeamMenuItem *)ItemAt(i); // check if this item is really a team item (what a cruel way...) // "lastApp" will always point to the last application in // the list - the other entries might be windows (due to the team expander) if (item->Submenu()) lastApp = i; if (item->Frame().Contains(where)) { // show/hide item's teams BMessage showMessage((modifiers & B_SHIFT_KEY) != 0 ? M_MINIMIZE_TEAM : M_BRING_TEAM_TO_FRONT); showMessage.AddInt32("itemIndex", lastApp); Window()->PostMessage(&showMessage, this); return; } } } } // Check the bounds of the expand Team icon if (fShowTeamExpander && fVertical && !fBarView->Dragging()) { TTeamMenuItem *item = ItemAtPoint(where); if (item->Submenu()){ BRect expanderRect = item->ExpanderBounds(); if (expanderRect.Contains(where)) { item->ToggleExpandState(true); item->Draw(); // Absorb the message. return; } } } BMenuBar::MouseDown(where); }
void MFCSimpleTypeView::ContextMenu(UINT nFlags, CPoint point) { long caty[] = { // TypedValue::S_DOUBLE, // TypedValue::S_LAMBDA, TypedValue::S_FLOAT, TypedValue::S_INT, TypedValue::S_SHORT, TypedValue::S_BYTE, TypedValue::S_BOOL }; CPoint popPt = point; ClientToScreen(&popPt); CMenu *ctxtMenu = new CMenu; ctxtMenu->CreatePopupMenu(); CMenu *addVarMenu = new CMenu; addVarMenu->CreatePopupMenu(); char buf[512]; long item = ItemAtPoint(point); for (short i=0; i<sizeof(caty)/sizeof(caty[0]); i++) { if (ID_VARIABLECONTEXT_ADD_VAR + caty[i] > ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE) { reportError("Internal error. type index value exceeded in menu creator, is %d and shouldn't exceed %d", caty[i], ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE-ID_VARIABLECONTEXT_ADD_VAR); } else { string tnm = findTypeName(caty[i]); if (tnm.size()) { sprintf(buf, "%s", tnm.c_str()); addVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ADD_VAR + caty[i], buf); } } } ctxtMenu->AppendMenu(MF_POPUP, (UINT) addVarMenu->m_hMenu, "add variable"); ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ADD_METHOD, "add method"); StabEnt *itemSym = NULL; if (item >= 0) { // delete selected item // set selected item envelope // set selected item display type // set selected item length ... to create an array itemSym = SymForItem(item); if (itemSym != NULL) { CMenu *setVarTypeMenu = new CMenu; setVarTypeMenu->CreatePopupMenu(); for (short i=0; i<sizeof(caty)/sizeof(caty[0]); i++) { if (ID_VARIABLECONTEXT_SET_VAR_TYPE + caty[i] > ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE) { reportError("Internal error. type index value exceeded in menu creator, is %d and shouldn't exceed %d", caty[i], ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE-ID_VARIABLECONTEXT_SET_VAR_TYPE); } else { string tnm = findTypeName(caty[i]); if (tnm.size() && itemSym->type != caty[i]) { sprintf(buf, "%s", tnm.c_str()); setVarTypeMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_SET_VAR_TYPE + caty[i], buf); } } } sprintf(buf, "set '%s' type", itemSym->uniqueName()); ctxtMenu->AppendMenu(MF_POPUP, (UINT) setVarTypeMenu->m_hMenu, buf); sprintf(buf, "delete '%s'", itemSym->uniqueName()); ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_DELETE_SELECTED, buf); sprintf(buf, "set '%s' envelope", itemSym->uniqueName()); ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_ENVELOPE_SELECTED, buf); CMenu *dispVarMenu = new CMenu; dispVarMenu->CreatePopupMenu(); dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_NODISPLAY_SELECTED, "none"); dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_CONTROL_SELECTED, "control"); dispVarMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_DISPLAY_SELECTED, "display"); sprintf(buf, "set '%s' display", itemSym->uniqueName()); ctxtMenu->AppendMenu(MF_POPUP, (UINT) dispVarMenu->m_hMenu, buf); ctxtMenu->AppendMenu(MF_STRING, ID_VARIABLECONTEXT_SET_LENGTH_SELECTED, "set length"); } } // add item // by type // structures ???? short ret = ctxtMenu->TrackPopupMenuEx( TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RETURNCMD, popPt.x, popPt.y, this, NULL); if (ret >= ID_VARIABLECONTEXT_ADD_VAR && ret <= ID_VARIABLECONTEXT_ADD_VAR_TYPE_RANGE) { long typ = ret - ID_VARIABLECONTEXT_ADD_VAR; if (parent && parent->Symbol()) { StabEnt *pSym = parent->Symbol(); Stackable *stkbl = pSym->StackableValue(); if (stkbl) { char *vnm = "variable%d"; switch(typ) { case TypedValue::S_BYTE: vnm = "bytevar"; break; case TypedValue::S_SHORT: vnm = "wordvar"; break; case TypedValue::S_INT: vnm = "intvar"; break; case TypedValue::S_LONG: vnm = "longvar"; break; case TypedValue::S_FLOAT: vnm = "floatvar"; break; } string nmbuf = glob.makeUniqueName(pSym, vnm, 1); StabEnt *nsym=DefineSymbol(nmbuf, typ, 0, 0, pSym, TypedValue::REF_STACK, false, false, StabEnt::DISPLAY_NOT); stkbl->ReAllocateChildren(); AddSym(nsym); } } } else if (ret == ID_VARIABLECONTEXT_ADD_METHOD) { if (parent && parent->Symbol()) { StabEnt *pSym = parent->Symbol(); string nmbuf = glob.makeUniqueName(pSym, "action", 1); QuaPerceptualSet *quaLink=parent->QuaLink(); if (quaLink) { StabEnt *mSym = quaLink->CreateMethod(nmbuf, pSym); if (mSym) { AddSym(mSym); fprintf(stderr, "tried to add method element\n"); } } } } else if (ret >= ID_VARIABLECONTEXT_SET_VAR_TYPE && ret <= ID_VARIABLECONTEXT_SET_VAR_TYPE_RANGE) { long typ = ret - ID_VARIABLECONTEXT_SET_VAR_TYPE; if (itemSym && parent && parent->Symbol()) { StabEnt *pSym = parent->Symbol(); Stackable *stkbl = pSym->StackableValue(); if (stkbl) { bool validChange = false; switch(typ) { case TypedValue::S_BYTE: validChange = true; break; case TypedValue::S_SHORT: validChange = true; break; case TypedValue::S_INT: validChange = true; break; case TypedValue::S_LONG: validChange = true; break; case TypedValue::S_FLOAT: validChange = true; break; } if (validChange) { itemSym->type = typ; stkbl->ReAllocateChildren(); } } } } else if (ret == ID_VARIABLECONTEXT_DELETE_SELECTED) { if (itemSym) { glob.DeleteSymbol(itemSym, true); RemoveSym(itemSym); if (parent && parent->Symbol()) { StabEnt *pSym = parent->Symbol(); Stackable *stkbl = pSym->StackableValue(); if (stkbl) { stkbl->ReAllocateChildren(); } } } } else if (ret == ID_VARIABLECONTEXT_ENVELOPE_SELECTED) { if (itemSym) { itemSym->SetEnvelopeMode(true); } } else if (ret == ID_VARIABLECONTEXT_NODISPLAY_SELECTED) { if (itemSym) { itemSym->SetDisplayMode(StabEnt::DISPLAY_NOT); // forces redisplay of this entry to show icon change GetListCtrl().SetItemText(item, 3, "N"); } } else if (ret == ID_VARIABLECONTEXT_DISPLAY_SELECTED) { if (itemSym) { itemSym->SetDisplayMode(StabEnt::DISPLAY_DISP); // forces redisplay of this entry GetListCtrl().SetItemText(item, 3, "D"); } } else if (ret == ID_VARIABLECONTEXT_CONTROL_SELECTED) { if (itemSym) { itemSym->SetDisplayMode(StabEnt::DISPLAY_CTL); // forces redisplay of this entry GetListCtrl().SetItemText(item, 3, "C"); } } else if (ret == ID_VARIABLECONTEXT_SET_LENGTH_SELECTED) { reportError("Currently only undimensioned data are supported by this interface .... but they can be added manually by hand-editting the script"); } }