bool ColorWheel::onProcessMessage(ui::Message* msg) { switch (msg->type()) { case kMouseDownMessage: captureMouse(); // Continue... case kMouseMoveMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); app::Color color = pickColor( mouseMsg->position() - getBounds().getOrigin()); if (color != app::Color::fromMask()) { base::ScopedValue<bool> switcher(m_lockColor, m_harmonyPicked, false); StatusBar::instance()->showColor(0, "", color); if (hasCapture()) ColorChange(color, mouseMsg->buttons()); } break; } case kMouseUpMessage: if (hasCapture()) { releaseMouse(); } return true; case kSetCursorMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); app::Color color = pickColor( mouseMsg->position() - getBounds().getOrigin()); if (color.getType() != app::Color::MaskType) { ui::set_mouse_cursor(kEyedropperCursor); return true; } break; } } return Widget::onProcessMessage(msg); }
bool ColorTintShadeTone::onProcessMessage(ui::Message* msg) { switch (msg->type()) { case kMouseDownMessage: if (manager()->getCapture()) break; captureMouse(); // Continue... case kMouseMoveMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); if (msg->type() == kMouseDownMessage) m_capturedInHue = inHueBarArea(mouseMsg->position()); app::Color color = getColorByPosition(mouseMsg->position()); if (color != app::Color::fromMask()) { StatusBar::instance()->showColor(0, "", color); if (hasCapture()) ColorChange(color, mouseMsg->buttons()); } break; } case kMouseUpMessage: if (hasCapture()) { releaseMouse(); } return true; case kSetCursorMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); if (childrenBounds().contains(mouseMsg->position())) { ui::set_mouse_cursor(kEyedropperCursor); return true; } break; } } return ColorSelector::onProcessMessage(msg); }
bool ColorSpectrum::onProcessMessage(ui::Message* msg) { switch (msg->type()) { case kMouseDownMessage: captureMouse(); // Continue... case kMouseMoveMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); app::Color color = pickColor(mouseMsg->position()); if (color != app::Color::fromMask()) { StatusBar::instance()->showColor(0, "", color); if (hasCapture()) ColorChange(color, mouseMsg->buttons()); } break; } case kMouseUpMessage: if (hasCapture()) { releaseMouse(); } return true; case kSetCursorMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); if (childrenBounds().contains(mouseMsg->position())) { ui::set_mouse_cursor(kEyedropperCursor); return true; } break; } } return Widget::onProcessMessage(msg); }
bool IntEntry::onProcessMessage(Message* msg) { switch (msg->type()) { // Reset value if it's out of bounds when focus is lost case kFocusLeaveMessage: setValue(MID(m_min, getValue(), m_max)); deselectText(); break; case kMouseDownMessage: requestFocus(); captureMouse(); openPopup(); selectAllText(); return true; case kMouseMoveMessage: if (hasCapture()) { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); Widget* pick = getManager()->pick(mouseMsg->position()); if (pick == &m_slider) { releaseMouse(); MouseMessage mouseMsg2(kMouseDownMessage, mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); m_slider.sendMessage(&mouseMsg2); } } break; case kMouseWheelMessage: if (isEnabled()) { int oldValue = getValue(); int newValue = oldValue + static_cast<MouseMessage*>(msg)->wheelDelta().x - static_cast<MouseMessage*>(msg)->wheelDelta().y; newValue = MID(m_min, newValue, m_max); if (newValue != oldValue) { setValue(newValue); selectAllText(); } return true; } break; case kKeyDownMessage: if (hasFocus() && !isReadOnly()) { KeyMessage* keymsg = static_cast<KeyMessage*>(msg); int chr = keymsg->unicodeChar(); if (chr < '0' || chr > '9') { // By-pass Entry::onProcessMessage() return Widget::onProcessMessage(msg); } } break; } return Entry::onProcessMessage(msg); }
bool ToolBar::ToolStrip::onProcessMessage(Message* msg) { switch (msg->type()) { case kMouseDownMessage: captureMouse(); // fallthrough case kMouseMoveMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); gfx::Point mousePos = mouseMsg->position(); ToolBox* toolbox = App::instance()->getToolBox(); Tool* hot_tool = NULL; Rect toolrc; int index = 0; for (ToolIterator it = toolbox->begin(); it != toolbox->end(); ++it) { Tool* tool = *it; if (tool->getGroup() == m_group) { toolrc = getToolBounds(index++); if (toolrc.contains(Point(mousePos.x, mousePos.y))) { hot_tool = tool; break; } } } // Hot button changed if (m_hotTool != hot_tool) { m_hotTool = hot_tool; invalidate(); // Show the tooltip for the hot tool if (m_hotTool && !hasCapture()) m_toolbar->openTipWindow(m_group, m_hotTool); else m_toolbar->closeTipWindow(); if (m_hotTool) StatusBar::instance()->showTool(0, m_hotTool); } if (hasCapture()) { if (m_hotTool) m_toolbar->selectTool(m_hotTool); Widget* pick = getManager()->pick(mouseMsg->position()); if (ToolBar* bar = dynamic_cast<ToolBar*>(pick)) { releaseMouse(); MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, mouseMsg->buttons(), mouseMsg->position()); mouseMsg2->addRecipient(bar); getManager()->enqueueMessage(mouseMsg2); } } break; } case kMouseUpMessage: if (hasCapture()) { releaseMouse(); closeWindow(); } break; } return Widget::onProcessMessage(msg); }
bool ToolBar::onProcessMessage(Message* msg) { switch (msg->type()) { case kMouseDownMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); ToolBox* toolbox = App::instance()->getToolBox(); int groups = toolbox->getGroupsCount(); Rect toolrc; ToolGroupList::iterator it = toolbox->begin_group(); for (int c=0; c<groups; ++c, ++it) { ToolGroup* tool_group = *it; Tool* tool = m_selectedInGroup[tool_group]; toolrc = getToolGroupBounds(c); if (mouseMsg->position().y >= toolrc.y && mouseMsg->position().y < toolrc.y+toolrc.h) { selectTool(tool); openPopupWindow(c, tool_group); // We capture the mouse so the user can continue navigating // the ToolBar to open other groups while he is pressing the // mouse button. captureMouse(); } } toolrc = getToolGroupBounds(ConfigureToolIndex); if (mouseMsg->position().y >= toolrc.y && mouseMsg->position().y < toolrc.y+toolrc.h) { Command* conf_tools_cmd = CommandsModule::instance()->getCommandByName(CommandId::ConfigureTools); UIContext::instance()->executeCommand(conf_tools_cmd); } toolrc = getToolGroupBounds(MiniEditorVisibilityIndex); if (mouseMsg->position().y >= toolrc.y && mouseMsg->position().y < toolrc.y+toolrc.h) { // Switch the state of the mini editor MiniEditorWindow* miniEditorWindow = App::instance()->getMainWindow()->getMiniEditor(); bool state = miniEditorWindow->isMiniEditorEnabled(); miniEditorWindow->setMiniEditorEnabled(!state); } break; } case kMouseMoveMessage: { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); ToolBox* toolbox = App::instance()->getToolBox(); int groups = toolbox->getGroupsCount(); Tool* new_hot_tool = NULL; int new_hot_index = NoneIndex; Rect toolrc; ToolGroupList::iterator it = toolbox->begin_group(); for (int c=0; c<groups; ++c, ++it) { ToolGroup* tool_group = *it; Tool* tool = m_selectedInGroup[tool_group]; toolrc = getToolGroupBounds(c); if (mouseMsg->position().y >= toolrc.y && mouseMsg->position().y < toolrc.y+toolrc.h) { new_hot_tool = tool; new_hot_index = c; if ((m_openOnHot) && (m_hotTool != new_hot_tool) && hasCapture()) { openPopupWindow(c, tool_group); } break; } } toolrc = getToolGroupBounds(ConfigureToolIndex); if (mouseMsg->position().y >= toolrc.y && mouseMsg->position().y < toolrc.y+toolrc.h) { new_hot_index = ConfigureToolIndex; } toolrc = getToolGroupBounds(MiniEditorVisibilityIndex); if (mouseMsg->position().y >= toolrc.y && mouseMsg->position().y < toolrc.y+toolrc.h) { new_hot_index = MiniEditorVisibilityIndex; } // hot button changed if (new_hot_tool != m_hotTool || new_hot_index != m_hotIndex) { m_hotTool = new_hot_tool; m_hotIndex = new_hot_index; invalidate(); if (!m_currentStrip) { if (m_hotIndex != NoneIndex && !hasCapture()) openTipWindow(m_hotIndex, m_hotTool); else closeTipWindow(); } if (m_hotTool) { if (hasCapture()) selectTool(m_hotTool); else StatusBar::instance()->showTool(0, m_hotTool); } } // We can change the current tool if the user is dragging the // mouse over the ToolBar. if (hasCapture()) { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); Widget* pick = getManager()->pick(mouseMsg->position()); if (ToolStrip* strip = dynamic_cast<ToolStrip*>(pick)) { releaseMouse(); MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, mouseMsg->buttons(), mouseMsg->position()); mouseMsg2->addRecipient(strip); getManager()->enqueueMessage(mouseMsg2); } } break; } case kMouseUpMessage: if (!hasCapture()) break; if (!m_openedRecently) { if (m_popupWindow && m_popupWindow->isVisible()) m_popupWindow->closeWindow(this); } m_openedRecently = false; releaseMouse(); // fallthrough case kMouseLeaveMessage: if (hasCapture()) break; closeTipWindow(); if (!m_popupWindow || !m_popupWindow->isVisible()) { m_tipOpened = false; m_hotTool = NULL; m_hotIndex = NoneIndex; invalidate(); } StatusBar::instance()->clearText(); break; case kTimerMessage: if (static_cast<TimerMessage*>(msg)->timer() == &m_tipTimer) { if (m_tipWindow) m_tipWindow->openWindow(); m_tipTimer.stop(); m_tipOpened = true; } break; } return Widget::onProcessMessage(msg); }
bool IntEntry::onProcessMessage(Message* msg) { switch (msg->type()) { // Reset value if it's out of bounds when focus is lost case kFocusLeaveMessage: setValue(MID(m_min, getValue(), m_max)); deselectText(); break; case kMouseDownMessage: requestFocus(); captureMouse(); openPopup(); selectAllText(); return true; case kMouseMoveMessage: if (hasCapture()) { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); Widget* pick = manager()->pick(mouseMsg->position()); if (pick == &m_slider) { releaseMouse(); MouseMessage mouseMsg2(kMouseDownMessage, mouseMsg->pointerType(), mouseMsg->buttons(), mouseMsg->modifiers(), mouseMsg->position()); m_slider.sendMessage(&mouseMsg2); } } break; case kMouseWheelMessage: if (isEnabled()) { int oldValue = getValue(); int newValue = oldValue + static_cast<MouseMessage*>(msg)->wheelDelta().x - static_cast<MouseMessage*>(msg)->wheelDelta().y; newValue = MID(m_min, newValue, m_max); if (newValue != oldValue) { setValue(newValue); selectAllText(); } return true; } break; case kKeyDownMessage: if (hasFocus() && !isReadOnly()) { KeyMessage* keymsg = static_cast<KeyMessage*>(msg); int chr = keymsg->unicodeChar(); if (chr >= 32 && (chr < '0' || chr > '9')) { // "Eat" all keys that aren't number return true; } // Else we use the default Entry processing function which // will process keys like Left/Right arrows, clipboard // handling, etc. } break; } return Entry::onProcessMessage(msg); }
bool ComboBoxEntry::onProcessMessage(Message* msg) { switch (msg->type()) { case kKeyDownMessage: if (hasFocus()) { KeyMessage* keymsg = static_cast<KeyMessage*>(msg); KeyScancode scancode = keymsg->scancode(); if (!m_comboBox->isEditable()) { if (scancode == kKeySpace || scancode == kKeyEnter || scancode == kKeyEnterPad) { m_comboBox->switchListBox(); return true; } } else { if (scancode == kKeyEnter || scancode == kKeyEnterPad) { m_comboBox->switchListBox(); return true; } } } break; case kMouseDownMessage: if (m_comboBox->isClickOpen()) { m_comboBox->switchListBox(); } if (m_comboBox->isEditable()) { getManager()->setFocus(this); } else { captureMouse(); return true; } break; case kMouseUpMessage: if (hasCapture()) releaseMouse(); break; case kMouseMoveMessage: if (hasCapture()) { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); Widget* pick = getManager()->pick(mouseMsg->position()); Widget* listbox = m_comboBox->m_listbox; if (pick != NULL && (pick == listbox || pick->hasAncestor(listbox))) { releaseMouse(); MouseMessage mouseMsg2(kMouseDownMessage, mouseMsg->buttons(), mouseMsg->position()); pick->sendMessage(&mouseMsg2); return true; } } break; } return Entry::onProcessMessage(msg); }
bool Tabs::onProcessMessage(Message* msg) { switch (msg->type()) { case kMouseEnterMessage: case kMouseMoveMessage: calculateHot(); return true; case kMouseLeaveMessage: if (m_hot != NULL) { m_hot = NULL; invalidate(); } return true; case kMouseDownMessage: case kMouseUpMessage: if (m_hot != NULL) { MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg); if (m_selected != m_hot) { m_selected = m_hot; invalidate(); } // Left button is processed in mouse down message, right // button is processed in mouse up. if (m_selected && m_delegate && ((mouseMsg->left() && msg->type() == kMouseDownMessage) || (!mouseMsg->left() && msg->type() == kMouseUpMessage))) { m_delegate->clickTab(this, m_selected->view, mouseMsg->buttons()); } } return true; case kMouseWheelMessage: { int dz = (static_cast<MouseMessage*>(msg)->wheelDelta().x - static_cast<MouseMessage*>(msg)->wheelDelta().y) * getBounds().w/6; m_begScrollX = m_scrollX; if (m_ani != ANI_SMOOTH_SCROLL) m_endScrollX = m_scrollX + dz; else m_endScrollX += dz; // Limit endScrollX position (to improve animation ending to the correct position) { int max_x = getMaxScrollX(); m_endScrollX = MID(0, m_endScrollX, max_x); } startAni(ANI_SMOOTH_SCROLL); return true; } case kTimerMessage: { switch (m_ani) { case ANI_NONE: // Do nothing break; case ANI_SCROLL: { ScrollButton* button = dynamic_cast<ScrollButton*>(getManager()->getCapture()); if (button != NULL) setScrollX(m_scrollX + button->getDirection()*8*static_cast<TimerMessage*>(msg)->count()); break; } case ANI_SMOOTH_SCROLL: { if (m_ani_t == ANI_SMOOTH_SCROLL_TICKS) { stopAni(); setScrollX(m_endScrollX); } else { // Lineal //setScrollX(m_begScrollX + m_endScrollX - m_begScrollX) * m_ani_t / 10); // Exponential setScrollX(m_begScrollX + (m_endScrollX - m_begScrollX) * (1.0-std::exp(-10.0 * m_ani_t / (double)ANI_SMOOTH_SCROLL_TICKS))); } break; } case ANI_ADDING_TAB: { if (m_ani_t == ANI_ADDING_TAB_TICKS) stopAni(); invalidate(); break; } case ANI_REMOVING_TAB: { if (m_ani_t == ANI_REMOVING_TAB_TICKS) stopAni(); invalidate(); break; } } ++m_ani_t; break; } } return Widget::onProcessMessage(msg); }