Beispiel #1
0
    public MenuControl()
    {
      // Set default values
      this.Dock = DockStyle.Top;
      _trackItem = -1;
      _selected = false;
      _multiLine = false;
      _popupMenu = null;
      _mouseOver = false;
      _manualFocus = false;
      _drawUpwards = false;
      _plainAsBlock = false;
      _oldFocus = IntPtr.Zero;
      _ignoreEscapeUp = false;
      _ignoreMouseMove = false;
      _dismissTransfer = false;
      _style = VisualStyle.IDE;
      _chevronStartCommand = null;
      _direction = Direction.Horizontal;
      _menuCommands = new MenuCommandCollection();
      
      // Prevent flicker with double buffering and all painting inside WM_PAINT
      SetStyle(ControlStyles.DoubleBuffer, true);
      SetStyle(ControlStyles.AllPaintingInWmPaint, true);

      // Should not be allowed to select this control
      SetStyle(ControlStyles.Selectable, false);

      // Hookup to collection events
      _menuCommands.Cleared += new CollectionClear( OnCollectionCleared );
      _menuCommands.Inserted+= new CollectionChange( OnCollectionInserted );
      _menuCommands.Removed += new CollectionChange( OnCollectionRemoved );

      // Set the default menu color as background
      this.BackColor = SystemColors.Control;

      // Do not allow tab key to select this control
      this.TabStop = false;

      // Default the Font we use
      this.Font = SystemInformation.MenuFont;

      // Calculate the initial height/width of the control
      _rowWidth = _rowHeight = this.Font.Height + _breadthGap * 2 + 1;

      // Default to one line of items
      this.Height = _rowHeight;

      // Add ourself to the application filtering list
      Application.AddMessageFilter(this);
    }
        protected void InternalConstruct(string text, ImageList imageList, int imageIndex, 
      Shortcut shortcut, EventHandler clickHandler, Bitmap bitmap, object realOwner)
        {
            // Save parameters
              this.text       = text;
              this.imageList  = imageList;
              this.imageIndex = imageIndex;
              this.shortcut   = shortcut;
              image           = bitmap;
              this.realOwner  = realOwner;
              this.comboBox   = null;

              if( clickHandler != null )
              {
            Click += clickHandler;
              }

              // Define defaults for others
              enabled     = true;
              _checked    = false;
              radioCheck  = false;
              _break      = false;
              userData    = null;
              visible     = true;
              infrequent  = false;

              // Create the collection of embedded menu commands
              menuItems = new MenuCommandCollection();
        }
Beispiel #3
0
    protected bool GenerateShortcut(Shortcut sc, MenuCommandCollection mcc)
    {
      foreach(MenuCommand mc in mcc)
      {
        // Does the command match?
        if (mc.Enabled && (mc.Shortcut == sc))
        {
          // Generate event for command
          mc.OnClick(EventArgs.Empty);

          return true;
        }
        else
        {
          // Any child items to test?
          if (mc.MenuCommands.Count > 0)
          {
            // Recursive descent of all collections
            if (GenerateShortcut(sc, mc.MenuCommands))
              return true;
          }
        }
      }

      return false;
    }
Beispiel #4
0
    internal void OperateSubMenu(DrawCommand dc, bool selectFirst, bool trackRemove)
    {
      Rectangle drawRect = dc.DrawRect;

      // Find screen positions for popup menu
      Point screenPos;
      
      if (_style == VisualStyle.IDE)
      {
        if (_direction == Direction.Horizontal)
          screenPos = PointToScreen(new Point(dc.DrawRect.Left + 1, drawRect.Bottom - _lengthGap - 1));
        else
          screenPos = PointToScreen(new Point(dc.DrawRect.Right - _breadthGap, drawRect.Top + _boxExpandSides - 1));
      }
      else
      {
        if (_direction == Direction.Horizontal)
          screenPos = PointToScreen(new Point(dc.DrawRect.Left + 1, drawRect.Bottom));
        else
          screenPos = PointToScreen(new Point(dc.DrawRect.Right, drawRect.Top));
      }

      Point aboveScreenPos;
      
      if (_style == VisualStyle.IDE)
      {
        if (_direction == Direction.Horizontal)
          aboveScreenPos = PointToScreen(new Point(dc.DrawRect.Left + 1, drawRect.Top + _lengthGap + 1));
        else
          aboveScreenPos = PointToScreen(new Point(dc.DrawRect.Right - _breadthGap, drawRect.Bottom + _lengthGap));
      }
      else
      {
        if (_direction == Direction.Horizontal)
          aboveScreenPos = PointToScreen(new Point(dc.DrawRect.Left + 1, drawRect.Top));
        else
          aboveScreenPos = PointToScreen(new Point(dc.DrawRect.Right, drawRect.Bottom));
      }

      int borderGap;

      // Calculate the missing gap in the PopupMenu border
      if (_direction == Direction.Horizontal)
        borderGap = dc.DrawRect.Width - _subMenuBorderAdjust;
      else
        borderGap = dc.DrawRect.Height - _subMenuBorderAdjust;    
  
      _popupMenu = new PopupMenu();

      // Define the correct visual style based on ours
      _popupMenu.Style = this.Style;

      // Key direction when keys cause dismissal
      int returnDir = 0;

      if (dc.Chevron)
      {
        MenuCommandCollection mcc = new MenuCommandCollection();

        bool addCommands = false;

        // Generate a collection of menu commands for those not visible
        foreach(MenuCommand command in _menuCommands)
        {
          if (!addCommands && (command == _chevronStartCommand))
            addCommands = true;

          if (addCommands)
            mcc.Add(command);
        }

        // Track the popup using provided menu item collection
        _popupMenu.TrackPopup(screenPos, 
          aboveScreenPos,
          _direction,
          mcc, 
          borderGap,
          selectFirst,
          this,
          ref returnDir);
      }
      else
      {
        // Generate event so that caller has chance to modify MenuCommand contents
        OnPopupStart(dc.MenuCommand);

        // Track the popup using provided menu item collection
        _popupMenu.TrackPopup(screenPos, 
          aboveScreenPos,
          _direction,
          dc.MenuCommand.MenuCommands, 
          borderGap,
          selectFirst,
          this,
          ref returnDir);

        // Generate event so that caller has chance to modify MenuCommand contents
        OnPopupEnd(dc.MenuCommand);
      }

      // Remove unwanted object
      _popupMenu = null;

      // Was arrow key used to dismiss the submenu?
      if (returnDir != 0)
      {
        // Using keyboard movements means we should have the focus
        if (!_manualFocus)
        {
          _manualFocus = true;

          GrabTheFocus();
        }

        if (returnDir < 0)
        {
          // Shift selection left one
          ProcessMoveLeft(true);
        }
        else
        {
          // Shift selection right one
          ProcessMoveRight(true);
        }

        // A WM_MOUSEMOVE is generated when we open up the new submenu for 
        // display, ignore this as it causes the selection to move
        _ignoreMouseMove = true;
      }
      else
      {
        // Only if the submenu was dismissed at the request of the submenu
        // should the selection mode be cancelled, otherwise keep selection mode
        if (!_dismissTransfer)
        {
          // This item is no longer selected
          _selected = false;
          _drawUpwards = false;

          // Should we stop tracking this item
          if (trackRemove)
          {
            ReturnTheFocus();

            // Unselect the current item
            _trackItem = SwitchTrackingItem(_trackItem, -1);
          }
          else
          {
            // Repaint the item
            DrawCommand(_trackItem, true);
          }
        }
        else
        {
          // Do not change _selected status
          _dismissTransfer = false;
        }
      }
    }
Beispiel #5
0
    protected MenuCommand InternalTrackPopup(Point screenPosTR, Point screenPosTL, 
      MenuCommandCollection menuCollection, 
      PopupMenu parentMenu, bool selectFirst, 
      MenuControl parentControl, bool popupRight,
      bool popupDown, ref int returnDir)
    {
      // Default the drawing direction
      direction = Direction.Horizontal;

      // Remember the MenuControl that initiated us
      parentControl = parentControl;

      // We have a parent popup menu that should be consulted about operation
      parentMenu = parentMenu;

      // Remember any currect menu item collection
      MenuCommandCollection oldCollection =  menuCommands;

      // Use the passed in collection of menu commands
      menuCommands = menuCollection;

      // Remember screen positions
      screenPos = screenPosTR;
      aboveScreenPos = screenPosTR;
      leftScreenPos = screenPosTL;

      // Remember display directions
      popupRight = popupRight;
      popupDown = popupDown;

      MenuCommand ret = InternalTrackPopup(selectFirst);

      // Restore to original collection
      menuCommands = oldCollection;

      // Remove references no longer required
      parentControl = null;
      parentMenu = null;

      // Return the direction key that caused dismissal
      returnDir =  returnDir;

      return ret;
    }
Beispiel #6
0
    internal MenuCommand TrackPopup(Point screenPos, Point aboveScreenPos, 
      Direction direction,
      MenuCommandCollection menuCollection, 
      int borderGap, 
      bool selectFirst, 
      MenuControl parentControl,
      ref int returnDir)
    {
      // Remember which direction the MenuControl is drawing in
      direction = direction;

      // Remember the MenuControl that initiated us
      parentControl = parentControl;

      // Remember the gap in drawing the top border
      borderGap = borderGap;

      // Remember any currect menu item collection
      MenuCommandCollection oldCollection =  menuCommands;

      // Use the passed in collection of menu commands
      menuCommands = menuCollection;

      // Remember screen positions
      screenPos = screenPos;
      aboveScreenPos = aboveScreenPos;
      leftScreenPos = screenPos;

      MenuCommand ret = InternalTrackPopup(selectFirst);

      // Restore to original collection
      menuCommands = oldCollection;

      // Remove reference no longer required
      parentControl = null;

      // Return the direction key that caused dismissal
      returnDir =  returnDir;

      return ret;
    }
Beispiel #7
0
    public PopupMenu()
    {
      // Create collection objects
      drawCommands = new ArrayList();
      menuCommands = new MenuCommandCollection(); 

      // Default the properties
      returnDir = 0;
      extraSize = 0;
      popupItem = -1;
      trackItem = -1;
      childMenu = null;
      exitLoop = false;
      popupDown = true;
      mouseOver = false;
      grabFocus = false;
      excludeTop = true;
      popupRight = true;
      parentMenu = null;
      excludeOffset = 0;
      focusCatcher = null;
      parentControl = null;
      returnCommand = null;
      oldFocus = IntPtr.Zero;
      showInfrequent = false;
      style = VisualStyle.IDE;
      lastMousePos = new Point(-1,-1);
      direction = Direction.Horizontal;
      textFont = SystemInformation.MenuFont;

      // Create and initialise the timer object (but do not start it running!)
      timer = new Timer();
      timer.Interval = selectionDelay;
      timer.Tick += new EventHandler(OnTimerExpire);
    }