Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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");
	}
}