WXLRESULT wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { WXLRESULT rc = 0; bool processed = false; switch ( message ) { #ifdef __WXWINCE__ // react to pressing the OK button in the title case WM_COMMAND: { switch ( LOWORD(wParam) ) { #ifdef __POCKETPC__ case IDOK: processed = DoOK(); if (!processed) processed = !Close(); #endif #ifdef __SMARTPHONE__ case IDM_LEFT: case IDM_RIGHT: processed = HandleCommand( LOWORD(wParam) , 0 , NULL ); break; #endif // __SMARTPHONE__ } break; } #endif case WM_CLOSE: // if we can't close, tell the system that we processed the // message - otherwise it would close us processed = !Close(); break; case WM_SIZE: if ( m_hGripper ) { switch ( wParam ) { case SIZE_MAXIMIZED: ShowGripper(false); break; case SIZE_RESTORED: ShowGripper(true); } } // the Windows dialogs unfortunately are not meant to be resizeable // at all and their standard class doesn't include CS_[VH]REDRAW // styles which means that the window is not refreshed properly // after the resize and no amount of WS_CLIPCHILDREN/SIBLINGS can // help with it - so we have to refresh it manually which certainly // creates flicker but at least doesn't show garbage on the screen rc = wxWindow::MSWWindowProc(message, wParam, lParam); processed = true; if ( HasFlag(wxFULL_REPAINT_ON_RESIZE) ) { ::InvalidateRect(GetHwnd(), NULL, false /* erase bg */); } break; #ifndef __WXMICROWIN__ case WM_SETCURSOR: // we want to override the busy cursor for modal dialogs: // typically, wxBeginBusyCursor() is called and then a modal dialog // is shown, but the modal dialog shouldn't have hourglass cursor if ( IsModal() && wxIsBusy() ) { // set our cursor for all windows (but see below) wxCursor cursor = m_cursor; if ( !cursor.Ok() ) cursor = wxCURSOR_ARROW; ::SetCursor(GetHcursorOf(cursor)); // in any case, stop here and don't let wxWindow process this // message (it would set the busy cursor) processed = true; // but return false to tell the child window (if the event // comes from one of them and not from ourselves) that it can // set its own cursor if it has one: thus, standard controls // (e.g. text ctrl) still have correct cursors in a dialog // invoked while wxIsBusy() rc = false; } break; #endif // __WXMICROWIN__ } if ( !processed ) rc = wxWindow::MSWWindowProc(message, wParam, lParam); return rc; }
void Channel::Join(ObjectGuid p, const char* pass) { WorldPacket data; if (IsOn(p)) { if (!IsConstant()) // non send error message for built-in channels { MakePlayerAlreadyMember(&data, p); SendToOne(&data, p); } return; } if (IsBanned(p)) { MakeBanned(&data); SendToOne(&data, p); return; } if (m_password.length() > 0 && strcmp(pass, m_password.c_str())) { MakeWrongPassword(&data); SendToOne(&data, p); return; } Player* plr = sObjectMgr.GetPlayer(p); if (plr) { if (HasFlag(CHANNEL_FLAG_LFG) && sWorld.getConfig(CONFIG_BOOL_RESTRICTED_LFG_CHANNEL) && plr->GetSession()->GetSecurity() == SEC_PLAYER) { MakeNotInLfg(&data); SendToOne(&data, p); return; } if (plr->GetGuildId() && (GetFlags() == 0x38)) return; plr->JoinedChannel(this); } if (m_announce && (!plr || plr->GetSession()->GetSecurity() < SEC_GAMEMASTER || !sWorld.getConfig(CONFIG_BOOL_SILENTLY_GM_JOIN_TO_CHANNEL))) { MakeJoined(&data, p); SendToAll(&data); } data.clear(); PlayerInfo& pinfo = m_players[p]; pinfo.player = p; pinfo.flags = 0; MakeYouJoined(&data); SendToOne(&data, p); JoinNotify(p); // if no owner first logged will become if (!IsConstant() && !m_ownerGuid) { SetOwner(p, (m_players.size() > 1 ? true : false)); m_players[p].SetModerator(true); } }
void wxSlider::DoMoveWindow(int x, int y, int width, int height) { // all complications below are because we need to position the labels, // without them everything is easy if ( !m_labels ) { wxSliderBase::DoMoveWindow(x, y, width, height); return; } int minLabelWidth, maxLabelWidth; const int labelHeight = GetLabelsSize(&minLabelWidth, &maxLabelWidth); const int longestLabelWidth = wxMax(minLabelWidth, maxLabelWidth); if ( !HasFlag(wxSL_MIN_MAX_LABELS) ) { minLabelWidth = maxLabelWidth = 0; } int tickOffset = 0; if ( HasFlag(wxSL_TICKS)) tickOffset = TICK; if ( HasFlag(wxSL_BOTH)) tickOffset *= 2; // be careful to position the slider itself after moving the labels as // otherwise our GetBoundingBox(), which is called from WM_SIZE handler, // would return a wrong result and wrong size would be cached internally if ( HasFlag(wxSL_VERTICAL) ) { int labelOffset = 0; int holdTopX; int holdBottomX; int xLabel = (wxMax((THUMB + (BORDERPAD * 2)), longestLabelWidth) / 2) - (longestLabelWidth / 2) + x; if ( HasFlag(wxSL_LEFT) ) { holdTopX = xLabel; holdBottomX = xLabel - (abs(maxLabelWidth - minLabelWidth) / 2); } else // wxSL_RIGHT { holdTopX = xLabel + longestLabelWidth + (abs(maxLabelWidth - minLabelWidth) / 2); holdBottomX = xLabel + longestLabelWidth; labelOffset = longestLabelWidth + HGAP; } if ( HasFlag(wxSL_MIN_MAX_LABELS) ) { if ( HasFlag(wxSL_INVERSE) ) { wxSwap(holdTopX, holdBottomX); } DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min], holdTopX, y, minLabelWidth, labelHeight); DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max], holdBottomX, y + height - labelHeight, maxLabelWidth, labelHeight); } if ( HasFlag(wxSL_VALUE_LABEL) ) { DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value], x + ( HasFlag(wxSL_LEFT) ? THUMB + tickOffset + HGAP : 0 ), y + (height - labelHeight)/2, longestLabelWidth, labelHeight); } // position the slider itself along the left/right edge wxSliderBase::DoMoveWindow( x + labelOffset, y + labelHeight, THUMB + tickOffset + HGAP, height - (labelHeight * 2)); } else // horizontal { int yLabelMinMax = (y + ((THUMB + tickOffset) / 2)) - (labelHeight / 2); int xLabelValue = x + minLabelWidth + ((width - (minLabelWidth + maxLabelWidth)) / 2) - (longestLabelWidth / 2); int ySlider = y; if ( HasFlag(wxSL_VALUE_LABEL) ) { DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value], xLabelValue, y + (HasFlag(wxSL_BOTTOM) ? 0 : THUMB + tickOffset), longestLabelWidth, labelHeight); if ( HasFlag(wxSL_BOTTOM) ) { ySlider += labelHeight; yLabelMinMax += labelHeight; } } if ( HasFlag(wxSL_MIN_MAX_LABELS) ) { DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min], x, yLabelMinMax, minLabelWidth, labelHeight); DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max], x + width - maxLabelWidth, yLabelMinMax, maxLabelWidth, labelHeight); } // position the slider itself along the top/bottom edge wxSliderBase::DoMoveWindow( x + minLabelWidth + VGAP, ySlider, width - (minLabelWidth + maxLabelWidth + (VGAP*2)), THUMB + tickOffset); } }
bool wxToolBar::Realize() { int nMaxToolWidth = 0; int nMaxToolHeight = 0; m_nCurrentRowsOrColumns = 0; m_vLastX = m_xMargin; m_vLastY = m_yMargin; m_vMaxWidth = 0; m_vMaxHeight = 0; // // Find the maximum tool width and height // wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); while (node ) { wxToolBarTool* pTool = (wxToolBarTool *)node->GetData(); if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty()) { // // Set the height according to the font and the border size // if (pTool->GetWidth() > m_vTextX) nMaxToolWidth = pTool->GetWidth() + 4; else nMaxToolWidth = m_vTextX; if (pTool->GetHeight() + m_vTextY > nMaxToolHeight) nMaxToolHeight = pTool->GetHeight() + m_vTextY; } else { if (pTool->GetWidth() > nMaxToolWidth ) nMaxToolWidth = pTool->GetWidth() + 4; if (pTool->GetHeight() > nMaxToolHeight) nMaxToolHeight = pTool->GetHeight(); } node = node->GetNext(); } wxCoord vTbWidth = 0L; wxCoord vTbHeight = 0L; GetSize( &vTbWidth ,&vTbHeight ); if (vTbHeight < nMaxToolHeight) { SetSize( -1L ,-1L ,vTbWidth ,nMaxToolHeight + 4 ); if (GetParent()->IsKindOf(CLASSINFO(wxFrame))) { wxFrame* pFrame = wxDynamicCast(GetParent(), wxFrame); if (pFrame) pFrame->PositionToolBar(); } } int nSeparatorSize = m_toolSeparation; node = m_tools.GetFirst(); while (node) { wxToolBarTool* pTool = (wxToolBarTool *)node->GetData(); if (pTool->IsSeparator()) { if (GetWindowStyleFlag() & (wxTB_TOP | wxTB_BOTTOM)) { pTool->m_vX = m_vLastX + nSeparatorSize; pTool->m_vHeight = m_defaultHeight + m_vTextY; if (m_nCurrentRowsOrColumns >= m_maxCols) m_vLastY += nSeparatorSize; else m_vLastX += nSeparatorSize * 4; } else { pTool->m_vY = m_vLastY + nSeparatorSize; pTool->m_vHeight = m_defaultHeight + m_vTextY; if (m_nCurrentRowsOrColumns >= m_maxRows) m_vLastX += nSeparatorSize; else m_vLastY += nSeparatorSize * 4; } } else if (pTool->IsButton()) { if (GetWindowStyleFlag() & (wxTB_TOP | wxTB_BOTTOM)) { if (m_nCurrentRowsOrColumns >= m_maxCols) { m_nCurrentRowsOrColumns = 0; m_vLastX = m_xMargin; m_vLastY += nMaxToolHeight + m_toolPacking; } pTool->m_vX = m_vLastX + (nMaxToolWidth - ((int)(nMaxToolWidth/2) + (int)(pTool->GetWidth()/2))); if (HasFlag(wxTB_TEXT)) pTool->m_vY = m_vLastY + nSeparatorSize - 2; // just bit of adjustment else pTool->m_vY = m_vLastY + (nMaxToolHeight - (int)(pTool->GetHeight()/2)); m_vLastX += nMaxToolWidth + m_toolPacking + m_toolSeparation; } else { if (m_nCurrentRowsOrColumns >= m_maxRows) { m_nCurrentRowsOrColumns = 0; m_vLastX += (nMaxToolWidth + m_toolPacking); m_vLastY = m_yMargin; } pTool->m_vX = m_vLastX + pTool->GetWidth(); if ( HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty() ) pTool->m_vY = m_vLastY + (nMaxToolHeight - m_vTextY) + m_toolPacking; else pTool->m_vY = m_vLastY + (nMaxToolHeight - (int)(pTool->GetHeight()/2)); m_vLastY += nMaxToolHeight + m_toolPacking + m_toolSeparation; } m_nCurrentRowsOrColumns++; } else { // TODO: support the controls } if (m_vLastX > m_maxWidth) m_maxWidth = m_vLastX; if (m_vLastY > m_maxHeight) m_maxHeight = m_vLastY; node = node->GetNext(); } if (GetWindowStyleFlag() & (wxTB_TOP | wxTB_BOTTOM)) m_maxWidth += nMaxToolWidth; else m_maxHeight += nMaxToolHeight; m_maxWidth += m_xMargin; m_maxHeight += m_yMargin; m_bInitialized = true; return true; } // end of wxToolBar::Realize
void wxToolBar::DrawTool( wxDC& rDc, wxToolBarToolBase* pToolBase ) { wxToolBarTool* pTool = (wxToolBarTool *)pToolBase; wxColour gray85( 85,85,85 ); wxPen vDarkGreyPen( gray85, 1, wxSOLID ); wxBitmap vBitmap = pTool->GetNormalBitmap(); bool bUseMask = false; wxMask* pMask = NULL; PrepareDC(rDc); if (!vBitmap.IsOk()) return; if ((pMask = vBitmap.GetMask()) != NULL) if (pMask->GetMaskBitmap() != NULLHANDLE) bUseMask = true; if (!pTool->IsToggled()) { LowerTool(pTool, FALSE); if (!pTool->IsEnabled()) { wxColour vColor(wxT("GREY")); rDc.SetTextForeground(vColor); if (!pTool->GetDisabledBitmap().IsOk()) pTool->SetDisabledBitmap(wxDisableBitmap( vBitmap ,(long)GetBackgroundColour().GetPixel() )); rDc.DrawBitmap( pTool->GetDisabledBitmap() ,pTool->m_vX ,pTool->m_vY ,bUseMask ); } else { rDc.SetTextForeground(*wxBLACK); rDc.DrawBitmap( vBitmap ,pTool->m_vX ,pTool->m_vY ,bUseMask ); } if (m_windowStyle & wxTB_3DBUTTONS) { RaiseTool(pTool); } if ( HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty() ) { wxCoord vX; wxCoord vY; wxCoord vLeft = pTool->m_vX - (int)(pTool->GetWidth()/2); rDc.SetFont(GetFont()); rDc.GetTextExtent( pTool->GetLabel() ,&vX ,&vY ); if (pTool->GetWidth() > vX) // large tools { vLeft = pTool->m_vX + (pTool->GetWidth() - vX); GetSize(&vX, &vY); rDc.DrawText( pTool->GetLabel() ,vLeft ,vY - m_vTextY - 1 ); } else // normal tools { vLeft += (wxCoord)((m_vTextX - vX)/2); rDc.DrawText( pTool->GetLabel() ,vLeft ,pTool->m_vY + m_vTextY - 1 // a bit of margin ); } } } else { wxColour vColor(wxT("GREY")); LowerTool(pTool); rDc.SetTextForeground(vColor); if (!pTool->GetDisabledBitmap().IsOk()) pTool->SetDisabledBitmap(wxDisableBitmap( vBitmap ,(long)GetBackgroundColour().GetPixel() )); rDc.DrawBitmap( pTool->GetDisabledBitmap() ,pTool->m_vX ,pTool->m_vY ,bUseMask ); if ( HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty() ) { wxCoord vX; wxCoord vY; wxCoord vLeft = pTool->m_vX - (int)(pTool->GetWidth()/2); rDc.SetFont(GetFont()); rDc.GetTextExtent( pTool->GetLabel() ,&vX ,&vY ); vLeft += (wxCoord)((m_vTextX - vX)/2); rDc.DrawText( pTool->GetLabel() ,vLeft ,pTool->m_vY + m_vTextY - 1 // a bit of margin ); } } } // end of wxToolBar::DrawTool
void Cmd_Bless(edict_t *ent) { int radius; float duration, cooldown; edict_t *target = NULL; if (debuginfo->value) gi.dprintf("DEBUG: %s just called Cmd_Bless()\n", ent->client->pers.netname); if(ent->myskills.abilities[BLESS].disable) return; //if (!G_CanUseAbilities(ent, ent->myskills.abilities[BLESS].current_level, BLESS_COST)) // return; if (!V_CanUseAbilities(ent, BLESS, BLESS_COST, true)) return; radius = SHAMAN_CURSE_RADIUS_BASE + (SHAMAN_CURSE_RADIUS_BONUS * ent->myskills.abilities[BLESS].current_level); duration = BLESS_DURATION_BASE + (BLESS_DURATION_BONUS * ent->myskills.abilities[BLESS].current_level); //Blessing self? if (Q_strcasecmp(gi.argv(1), "self") == 0) { if (HasFlag(ent)) { gi.cprintf(ent, PRINT_HIGH, "Can't use this while carrying the flag!\n"); return; } if (!curse_add(ent, ent, BLESS, 0, duration)) { gi.cprintf(ent, PRINT_HIGH, "Unable to bless self.\n"); return; } target = ent; } else { target = curse_Attack(ent, BLESS, radius, duration, false); } if (target != NULL) { que_t *slot = NULL; //Finish casting the spell ent->client->ability_delay = level.time + BLESS_DELAY; ent->client->pers.inventory[power_cube_index] -= BLESS_COST; cooldown = 2.0 * duration; if (cooldown > 10.0) cooldown = 10.0; ent->myskills.abilities[BLESS].delay = level.time + cooldown; //Change the curse think to the bless think slot = que_findtype(target->curses, NULL, BLESS); if (slot) { slot->ent->think = Bless_think; slot->ent->nextthink = level.time + FRAMETIME; } //Notify the target if (target == ent) { gi.cprintf(target, PRINT_HIGH, "YOU HAVE BEEN BLESSED FOR %0.1f seconds!!\n", duration); } else if ((target->client) && !(target->svflags & SVF_MONSTER)) { gi.cprintf(target, PRINT_HIGH, "YOU HAVE BEEN BLESSED FOR %0.1f seconds!!\n", duration); gi.cprintf(ent, PRINT_HIGH, "Blessed %s for %0.1f seconds.\n", target->myskills.player_name, duration); } else { gi.cprintf(ent, PRINT_HIGH, "Blessed %s for %0.1f seconds.\n", target->classname, duration); } //Play the spell sound! gi.sound(target, CHAN_ITEM, gi.soundindex("curses/bless.wav"), 1, ATTN_NORM, 0); } }
void wxToolBar::RaiseTool ( wxToolBarToolBase* pToolBase, bool bRaise ) { wxToolBarTool* pTool = (wxToolBarTool*)pToolBase; wxCoord vX; wxCoord vY; wxCoord vWidth; wxCoord vHeight; wxColour gray85( 85,85,85 ); wxPen vDarkGreyPen( gray85, 1, wxSOLID ); wxPen vClearPen( GetBackgroundColour(), 1, wxSOLID ); wxClientDC vDC(this); if (!pTool) return; if (pTool->IsSeparator()) return; if (!pTool->IsEnabled()) return; // // We only do this for flat toolbars // if (!HasFlag(wxTB_FLAT)) return; if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty()) { if (pTool->GetWidth() > m_vTextX) { vX = pTool->m_vX - 2; vWidth = pTool->GetWidth() + 4; } else { vX = pTool->m_vX - (wxCoord)(pTool->GetWidth()/2); vWidth = m_vTextX + 4; } vY = pTool->m_vY - 2; vHeight = pTool->GetHeight() + m_vTextY + 2; } else { vX = pTool->m_vX - 2; vY = pTool->m_vY - 2; vWidth = pTool->GetWidth() + 4; vHeight = pTool->GetHeight() + 4; } if (bRaise) { vDC.SetPen(vDarkGreyPen); vDC.DrawLine(vX + vWidth, vY + vHeight, vX, vY + vHeight); vDC.DrawLine(vX + vWidth, vY, vX + vWidth, vY + vHeight); vDC.SetPen(*wxWHITE_PEN); vDC.DrawLine(vX, vY, vX + vWidth, vY); vDC.DrawLine(vX, vY + vHeight, vX, vY); } else { vDC.SetPen(vClearPen); vDC.DrawLine(vX + vWidth, vY + vHeight, vX, vY + vHeight); vDC.DrawLine(vX + vWidth, vY, vX + vWidth, vY + vHeight); vDC.DrawLine(vX, vY, vX + vWidth, vY); vDC.DrawLine(vX, vY + vHeight, vX, vY); } } // end of wxToolBar::RaiseTool
void DIALOG_SCH_FIND::OnUpdateReplaceUI( wxUpdateUIEvent& aEvent ) { aEvent.Enable( HasFlag( wxFR_REPLACEDIALOG ) && !m_comboFind->GetValue().empty() && (m_findReplaceData->GetFlags() & FR_REPLACE_ITEM_FOUND) ); }
void DIALOG_SCH_FIND::SendEvent( const wxEventType& aEventType ) { wxFindDialogEvent event( aEventType, GetId() ); event.SetEventObject( this ); event.SetFindString( m_comboFind->GetValue() ); int flags = 0; if ( HasFlag( wxFR_REPLACEDIALOG ) ) { event.SetReplaceString( m_comboReplace->GetValue() ); flags |= FR_SEARCH_REPLACE; } if( m_checkReplaceReferences->GetValue() ) flags |= FR_REPLACE_REFERENCES; if( m_radioForward->GetValue() ) flags |= wxFR_DOWN; if( m_checkMatchCase->GetValue() ) flags |= wxFR_MATCHCASE; if( m_checkWholeWord->GetValue() ) flags |= wxFR_WHOLEWORD; if( m_checkWildcardMatch->IsShown() && m_checkWildcardMatch->GetValue() ) flags |= FR_MATCH_WILDCARD; if( m_checkAllFields->GetValue() ) flags |= FR_SEARCH_ALL_FIELDS; if( m_checkAllPins->GetValue() ) flags |= FR_SEARCH_ALL_PINS; if( m_checkWrap->GetValue() ) flags |= FR_SEARCH_WRAP; if( m_checkCurrentSheetOnly->GetValue() ) flags |= FR_CURRENT_SHEET_ONLY; if( m_checkNoWarpCursor->GetValue() ) flags |= FR_NO_WARP_CURSOR; m_findReplaceData->SetFindString( event.GetFindString() ); if( HasFlag( wxFR_REPLACEDIALOG ) && ( event.GetEventType() == wxEVT_COMMAND_FIND_REPLACE || event.GetEventType() == wxEVT_COMMAND_FIND_REPLACE_ALL ) ) { m_findReplaceData->SetReplaceString( event.GetReplaceString() ); } event.SetFlags( flags ); m_findReplaceData->SetFlags( event.GetFlags() ); // when we are no using the find/replace (just find) // FR_REPLACE_REFERENCES flag bit is always set to 1 in event flags // but not set in m_findReplaceData if ( ! HasFlag( wxFR_REPLACEDIALOG ) ) { flags |= FR_REPLACE_REFERENCES; event.SetFlags( flags ); } if( !GetEventHandler()->ProcessEvent( event ) ) { GetParent()->GetEventHandler()->ProcessEvent( event ); } if( event.GetFlags() != flags ) m_findReplaceData->SetFlags( event.GetFlags() ); }
bool wxToolMenuBar::Realize() { const size_t nTools = GetToolsCount(); if ( nTools == 0 ) { // nothing to do return true; } #if 0 // delete all old buttons, if any for ( size_t pos = 0; pos < m_nButtons; pos++ ) { if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, 0, 0) ) { wxLogDebug(wxT("TB_DELETEBUTTON failed")); } } #endif // 0 bool lastWasRadio = false; wxToolBarToolsList::Node* node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { wxToolMenuBarTool *tool = (wxToolMenuBarTool*) node->GetData(); TBBUTTON buttons[1] ; TBBUTTON& button = buttons[0]; wxZeroMemory(button); bool isRadio = false; switch ( tool->GetStyle() ) { case wxTOOL_STYLE_CONTROL: button.idCommand = tool->GetId(); // fall through: create just a separator too // TODO: controls are not yet supported on wxToolMenuBar. case wxTOOL_STYLE_SEPARATOR: button.fsState = TBSTATE_ENABLED; button.fsStyle = TBSTYLE_SEP; break; case wxTOOL_STYLE_BUTTON: if ( HasFlag(wxTB_TEXT) ) { const wxString& label = tool->GetLabel(); if ( !label.empty() ) { button.iString = (int) wxMSW_CONV_LPCTSTR(label); } } const wxBitmap& bmp = tool->GetNormalBitmap(); wxBitmap bmpToUse = bmp; if (bmp.GetWidth() < 16 || bmp.GetHeight() < 16 || bmp.GetMask() != NULL) { wxMemoryDC memDC; wxBitmap b(16,16); memDC.SelectObject(b); wxColour col = wxColour(192,192,192); memDC.SetBackground(wxBrush(col)); memDC.Clear(); int x = (16 - bmp.GetWidth())/2; int y = (16 - bmp.GetHeight())/2; memDC.DrawBitmap(bmp, x, y, true); memDC.SelectObject(wxNullBitmap); bmpToUse = b; tool->SetNormalBitmap(b); } int n = 0; if ( bmpToUse.IsOk() ) { n = ::CommandBar_AddBitmap( (HWND) GetHWND(), NULL, (int) (HBITMAP) bmpToUse.GetHBITMAP(), 1, 16, 16 ); } button.idCommand = tool->GetId(); button.iBitmap = n; if ( tool->IsEnabled() ) button.fsState |= TBSTATE_ENABLED; if ( tool->IsToggled() ) button.fsState |= TBSTATE_CHECKED; switch ( tool->GetKind() ) { case wxITEM_RADIO: button.fsStyle = TBSTYLE_CHECKGROUP; if ( !lastWasRadio ) { // the first item in the radio group is checked by // default to be consistent with wxGTK and the menu // radio items button.fsState |= TBSTATE_CHECKED; tool->Toggle(true); } isRadio = true; break; case wxITEM_CHECK: button.fsStyle = TBSTYLE_CHECK; break; default: wxFAIL_MSG( wxT("unexpected toolbar button kind") ); // fall through case wxITEM_NORMAL: button.fsStyle = TBSTYLE_BUTTON; } break; } if ( !::CommandBar_AddButtons( (HWND) GetHWND(), 1, buttons ) ) { wxFAIL_MSG( wxT("Could not add toolbar button.")); } lastWasRadio = isRadio; } return true; }
void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) { // TODO: Convert drawing in this function to Windows API Code wxSize sz = GetClientSize(); wxDC* dcPtr = wxAutoBufferedPaintDCFactory(this); wxDC& dc = *dcPtr; const wxRect& rectButton = m_btnArea; wxRect rectTextField = m_tcArea; wxColour bgCol = GetBackgroundColour(); #if wxUSE_UXTHEME const bool isEnabled = IsEnabled(); wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); HDC hDc = GetHdcOf(*impl); HWND hWnd = GetHwndOf(this); wxUxThemeEngine* theme = NULL; wxUxThemeHandle hTheme(this, L"COMBOBOX"); if ( hTheme ) theme = wxUxThemeEngine::GetIfActive(); #endif // wxUSE_UXTHEME wxRect borderRect(0,0,sz.x,sz.y); if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE ) { borderRect = m_tcArea; borderRect.Inflate(1); } int drawButFlags = 0; #if wxUSE_UXTHEME if ( hTheme ) { const bool useVistaComboBox = ::wxGetWinVersion() >= wxWinVersion_Vista; RECT rFull; wxCopyRectToRECT(borderRect, rFull); RECT rButton; wxCopyRectToRECT(rectButton, rButton); RECT rBorder; wxCopyRectToRECT(borderRect, rBorder); bool isNonStdButton = (m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE) || (m_iFlags & wxCC_IFLAG_HAS_NONSTANDARD_BUTTON); // // Get some states for themed drawing int butState; if ( !isEnabled ) { butState = CBXS_DISABLED; } // Vista will display the drop-button as depressed always // when the popup window is visilbe else if ( (m_btnState & wxCONTROL_PRESSED) || (useVistaComboBox && !IsPopupWindowState(Hidden)) ) { butState = CBXS_PRESSED; } else if ( m_btnState & wxCONTROL_CURRENT ) { butState = CBXS_HOT; } else { butState = CBXS_NORMAL; } int comboBoxPart = 0; // For XP, use the 'default' part RECT* rUseForBg = &rBorder; bool drawFullButton = false; int bgState = butState; const bool isFocused = (FindFocus() == GetMainWindowOfCompositeControl()) ? true : false; if ( useVistaComboBox ) { // FIXME: Either SetBackgroundColour or GetBackgroundColour // doesn't work under Vista, so here's a temporary // workaround. bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); // Draw the entire control as a single button? if ( !isNonStdButton ) { if ( HasFlag(wxCB_READONLY) ) drawFullButton = true; } if ( drawFullButton ) { comboBoxPart = CP_READONLY; rUseForBg = &rFull; // It should be safe enough to update this flag here. m_iFlags |= wxCC_FULL_BUTTON; } else { comboBoxPart = CP_BORDER; m_iFlags &= ~wxCC_FULL_BUTTON; if ( isFocused ) bgState = CBB_FOCUSED; else bgState = CBB_NORMAL; } } // // Draw parent's background, if necessary RECT* rUseForTb = NULL; if ( theme->IsThemeBackgroundPartiallyTransparent( hTheme, comboBoxPart, bgState ) ) rUseForTb = &rFull; else if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE ) rUseForTb = &rButton; if ( rUseForTb ) theme->DrawThemeParentBackground( hWnd, hDc, rUseForTb ); // // Draw the control background (including the border) if ( m_widthCustomBorder > 0 ) { theme->DrawThemeBackground( hTheme, hDc, comboBoxPart, bgState, rUseForBg, NULL ); } else { // No border. We can't use theme, since it cannot be relied on // to deliver borderless drawing, even with DrawThemeBackgroundEx. dc.SetBrush(bgCol); dc.SetPen(bgCol); dc.DrawRectangle(borderRect); } // // Draw the drop-button if ( !isNonStdButton ) { drawButFlags = Button_BitmapOnly; int butPart = CP_DROPDOWNBUTTON; if ( useVistaComboBox ) { if ( drawFullButton ) { // We need to alter the button style slightly before // drawing the actual button (but it was good above // when background etc was done). if ( butState == CBXS_HOT || butState == CBXS_PRESSED ) butState = CBXS_NORMAL; } if ( m_btnSide == wxRIGHT ) butPart = CP_DROPDOWNBUTTONRIGHT; else butPart = CP_DROPDOWNBUTTONLEFT; } theme->DrawThemeBackground( hTheme, hDc, butPart, butState, &rButton, NULL ); } else if ( useVistaComboBox && (m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE) ) { // We'll do this, because DrawThemeParentBackground // doesn't seem to be reliable on Vista. drawButFlags |= Button_PaintBackground; } } else #endif { // Windows 2000 and earlier drawButFlags = Button_PaintBackground; dc.SetBrush(bgCol); dc.SetPen(bgCol); dc.DrawRectangle(borderRect); } // Button rendering (may only do the bitmap on button, depending on the flags) DrawButton( dc, rectButton, drawButFlags ); // Paint required portion of the custom image on the control if ( (!m_text || m_widthCustomPaint) ) { wxASSERT( m_widthCustomPaint >= 0 ); // this is intentionally here to allow drawed rectangle's // right edge to be hidden if ( m_text ) rectTextField.width = m_widthCustomPaint; dc.SetFont( GetFont() ); dc.SetClippingRegion(rectTextField); if ( m_popupInterface ) m_popupInterface->PaintComboControl(dc,rectTextField); else wxComboPopup::DefaultPaintComboControl(this,dc,rectTextField); } delete dcPtr; }
void Item::SaveToDB() { uint32 guid = GetGUIDLow(); switch (uState) { case ITEM_NEW: { std::string text = m_text; CharacterDatabase.escape_string(text); CharacterDatabase.PExecute( "DELETE FROM item_instance WHERE guid = '%u'", guid ); std::ostringstream ss; ss << "INSERT INTO item_instance (guid,owner_guid,data,text) VALUES (" << guid << "," << GetOwnerGuid().GetCounter() << ",'"; for(uint16 i = 0; i < m_valuesCount; ++i ) ss << GetUInt32Value(i) << " "; ss << "', '" << text << "')"; CharacterDatabase.Execute( ss.str().c_str() ); } break; case ITEM_CHANGED: { std::string text = m_text; CharacterDatabase.escape_string(text); std::ostringstream ss; ss << "UPDATE item_instance SET data = '"; for(uint16 i = 0; i < m_valuesCount; ++i ) ss << GetUInt32Value(i) << " "; ss << "', owner_guid = '" << GetOwnerGuid().GetCounter(); ss << "', text = '" << text << "' WHERE guid = '" << guid << "'"; CharacterDatabase.Execute( ss.str().c_str() ); if (HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED)) CharacterDatabase.PExecute("UPDATE character_gifts SET guid = '%u' WHERE item_guid = '%u'", GetOwnerGuid().GetCounter(), GetGUIDLow()); } break; case ITEM_REMOVED: { CharacterDatabase.PExecute("DELETE FROM item_instance WHERE guid = '%u'", guid); if (HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED)) CharacterDatabase.PExecute("DELETE FROM character_gifts WHERE item_guid = '%u'", GetGUIDLow()); if (HasSavedLoot()) CharacterDatabase.PExecute("DELETE FROM item_loot WHERE guid = '%u'", GetGUIDLow()); delete this; return; } case ITEM_UNCHANGED: return; } if (m_lootState == ITEM_LOOT_CHANGED || m_lootState == ITEM_LOOT_REMOVED) CharacterDatabase.PExecute("DELETE FROM item_loot WHERE guid = '%u'", GetGUIDLow()); if (m_lootState == ITEM_LOOT_NEW || m_lootState == ITEM_LOOT_CHANGED) { if(Player* owner = GetOwner()) { // save money as 0 itemid data if (loot.gold) CharacterDatabase.PExecute("INSERT INTO item_loot (guid,owner_guid,itemid,amount,suffix,property) " "VALUES (%u, %u, 0, %u, 0, 0)", GetGUIDLow(), owner->GetGUIDLow(), loot.gold); // save items and quest items (at load its all will added as normal, but this not important for item loot case) for (size_t i = 0; i < loot.GetMaxSlotInLootFor(owner); ++i) { QuestItem *qitem = NULL; LootItem *item = loot.LootItemInSlot(i,owner,&qitem); if(!item) continue; // questitems use the blocked field for other purposes if (!qitem && item->is_blocked) continue; CharacterDatabase.PExecute("INSERT INTO item_loot (guid,owner_guid,itemid,amount,suffix,property) " "VALUES (%u, %u, %u, %u, %u, %i)", GetGUIDLow(), owner->GetGUIDLow(), item->itemid, item->count, item->randomSuffix, item->randomPropertyId); } } } if (m_lootState != ITEM_LOOT_NONE && m_lootState != ITEM_LOOT_TEMPORARY) SetLootState(ITEM_LOOT_UNCHANGED); SetState(ITEM_UNCHANGED); }
bool wxRadioButton::Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { if( !CreateControl( parent, id, pos, size, style, validator, name ) ) return false; PreCreation(); Widget parentWidget = (Widget) parent->GetClientWidget(); Display* dpy = XtDisplay(parentWidget); wxString label1(GetLabelText(label)); wxXmString text( label1 ); Widget radioButtonWidget = XtVaCreateManagedWidget ("toggle", #if wxUSE_GADGETS xmToggleButtonGadgetClass, parentWidget, #else xmToggleButtonWidgetClass, parentWidget, #endif wxFont::GetFontTag(), m_font.GetFontTypeC(dpy), XmNlabelString, text(), XmNfillOnSelect, True, XmNindicatorType, XmONE_OF_MANY, // diamond-shape NULL); XtAddCallback (radioButtonWidget, XmNvalueChangedCallback, (XtCallbackProc)wxRadioButtonCallback, (XtPointer)this); m_mainWidget = (WXWidget) radioButtonWidget; XtManageChild (radioButtonWidget); PostCreation(); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); //copied from mac/radiobut.cpp (from here till "return true;") m_cycle = this ; if (HasFlag(wxRB_GROUP)) { AddInCycle( NULL ) ; } else { /* search backward for last group start */ wxRadioButton *chief = NULL; wxWindowList::compatibility_iterator node = parent->GetChildren().GetLast(); while (node) { wxWindow *child = node->GetData(); if (child->IsKindOf( CLASSINFO( wxRadioButton ) ) ) { chief = (wxRadioButton*) child; if (child->HasFlag(wxRB_GROUP)) break; } node = node->GetPrevious(); } AddInCycle( chief ) ; } return true; }
void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId) { wxDirItemData *data = GetItemData(parentId); if (data->m_isExpanded) return; data->m_isExpanded = true; if (parentId == m_treeCtrl->GetRootItem()) { SetupSections(); return; } wxASSERT(data); wxString search,path,filename; wxString dirName(data->m_path); #if (defined(__WINDOWS__) && !defined(__WXWINCE__)) || defined(__DOS__) || defined(__OS2__) // Check if this is a root directory and if so, // whether the drive is avaiable. if (!wxIsDriveAvailable(dirName)) { data->m_isExpanded = false; //wxMessageBox(wxT("Sorry, this drive is not available.")); return; } #endif // This may take a longish time. Go to busy cursor wxBusyCursor busy; #if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) if (dirName.Last() == ':') dirName += wxString(wxFILE_SEP_PATH); #endif wxArrayString dirs; wxArrayString filenames; wxDir d; wxString eachFilename; wxLogNull log; d.Open(dirName); if (d.IsOpened()) { int style = wxDIR_DIRS; if (m_showHidden) style |= wxDIR_HIDDEN; if (d.GetFirst(& eachFilename, wxEmptyString, style)) { do { if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) { dirs.Add(eachFilename); } } while (d.GetNext(&eachFilename)); } } dirs.Sort(wxDirCtrlStringCompareFunction); // Now do the filenames -- but only if we're allowed to if (!HasFlag(wxDIRCTRL_DIR_ONLY)) { d.Open(dirName); if (d.IsOpened()) { int style = wxDIR_FILES; if (m_showHidden) style |= wxDIR_HIDDEN; // Process each filter (ex: "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg") wxStringTokenizer strTok; wxString curFilter; strTok.SetString(m_currentFilterStr,wxT(";")); while(strTok.HasMoreTokens()) { curFilter = strTok.GetNextToken(); if (d.GetFirst(& eachFilename, curFilter, style)) { do { if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) { filenames.Add(eachFilename); } } while (d.GetNext(& eachFilename)); } } } filenames.Sort(wxDirCtrlStringCompareFunction); } // Now we really know whether we have any children so tell the tree control // about it. m_treeCtrl->SetItemHasChildren(parentId, !dirs.empty() || !filenames.empty()); // Add the sorted dirs size_t i; for (i = 0; i < dirs.GetCount(); i++) { eachFilename = dirs[i]; path = dirName; if (!wxEndsWithPathSeparator(path)) path += wxString(wxFILE_SEP_PATH); path += eachFilename; wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,true); wxTreeItemId treeid = AppendItem( parentId, eachFilename, wxFileIconsTable::folder, -1, dir_item); m_treeCtrl->SetItemImage( treeid, wxFileIconsTable::folder_open, wxTreeItemIcon_Expanded ); // assume that it does have children by default as it can take a long // time to really check for this (think remote drives...) // // and if we're wrong, we'll correct the icon later if // the user really tries to open this item m_treeCtrl->SetItemHasChildren(treeid); } // Add the sorted filenames if (!HasFlag(wxDIRCTRL_DIR_ONLY)) { for (i = 0; i < filenames.GetCount(); i++) { eachFilename = filenames[i]; path = dirName; if (!wxEndsWithPathSeparator(path)) path += wxString(wxFILE_SEP_PATH); path += eachFilename; //path = dirName + wxString(wxT("/")) + eachFilename; wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,false); int image_id = wxFileIconsTable::file; if (eachFilename.Find(wxT('.')) != wxNOT_FOUND) image_id = wxTheFileIconsTable->GetIconID(eachFilename.AfterLast(wxT('.'))); (void) AppendItem( parentId, eachFilename, image_id, -1, dir_item); } } }
void Item::SaveToDB() { uint32 guid = GetGUIDLow(); switch (uState) { case ITEM_NEW: { static SqlStatementID delItem ; static SqlStatementID insItem ; SqlStatement stmt = CharacterDatabase.CreateStatement(delItem, "DELETE FROM item_instance WHERE guid = ?"); stmt.PExecute(guid); std::ostringstream ss; for (uint16 i = 0; i < m_valuesCount; ++i) ss << GetUInt32Value(i) << " "; stmt = CharacterDatabase.CreateStatement(insItem, "INSERT INTO item_instance (guid,owner_guid,data,text) VALUES (?, ?, ?, ?)"); stmt.PExecute(guid, GetOwnerGuid().GetCounter(), ss.str().c_str(), m_text.c_str()); } break; case ITEM_CHANGED: { static SqlStatementID updInstance ; static SqlStatementID updGifts ; SqlStatement stmt = CharacterDatabase.CreateStatement(updInstance, "UPDATE item_instance SET data = ?, owner_guid = ?, text = ? WHERE guid = ?"); std::ostringstream ss; for (uint16 i = 0; i < m_valuesCount; ++i) ss << GetUInt32Value(i) << " "; stmt.PExecute(ss.str().c_str(), GetOwnerGuid().GetCounter(), m_text.c_str(), guid); if (HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED)) { stmt = CharacterDatabase.CreateStatement(updGifts, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?"); stmt.PExecute(GetOwnerGuid().GetCounter(), GetGUIDLow()); } } break; case ITEM_REMOVED: { static SqlStatementID delInst ; static SqlStatementID delGifts ; static SqlStatementID delLoot ; SqlStatement stmt = CharacterDatabase.CreateStatement(delInst, "DELETE FROM item_instance WHERE guid = ?"); stmt.PExecute(guid); if (HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED)) { stmt = CharacterDatabase.CreateStatement(delGifts, "DELETE FROM character_gifts WHERE item_guid = ?"); stmt.PExecute(GetGUIDLow()); } if (HasSavedLoot()) { stmt = CharacterDatabase.CreateStatement(delLoot, "DELETE FROM item_loot WHERE guid = ?"); stmt.PExecute(GetGUIDLow()); } delete this; return; } case ITEM_UNCHANGED: return; } if (m_lootState == ITEM_LOOT_CHANGED || m_lootState == ITEM_LOOT_REMOVED) { static SqlStatementID delLoot ; SqlStatement stmt = CharacterDatabase.CreateStatement(delLoot, "DELETE FROM item_loot WHERE guid = ?"); stmt.PExecute(GetGUIDLow()); } if (m_lootState == ITEM_LOOT_NEW || m_lootState == ITEM_LOOT_CHANGED) { if (Player* owner = GetOwner()) { static SqlStatementID saveGold ; static SqlStatementID saveLoot ; // save money as 0 itemid data if (loot.gold) { SqlStatement stmt = CharacterDatabase.CreateStatement(saveGold, "INSERT INTO item_loot (guid,owner_guid,itemid,amount,suffix,property) VALUES (?, ?, 0, ?, 0, 0)"); stmt.PExecute(GetGUIDLow(), owner->GetGUIDLow(), loot.gold); } SqlStatement stmt = CharacterDatabase.CreateStatement(saveLoot, "INSERT INTO item_loot (guid,owner_guid,itemid,amount,suffix,property) VALUES (?, ?, ?, ?, ?, ?)"); // save items and quest items (at load its all will added as normal, but this not important for item loot case) for (size_t i = 0; i < loot.GetMaxSlotInLootFor(owner); ++i) { QuestItem* qitem = NULL; LootItem* item = loot.LootItemInSlot(i, owner, &qitem); if (!item) continue; // questitems use the blocked field for other purposes if (!qitem && item->is_blocked) continue; stmt.addUInt32(GetGUIDLow()); stmt.addUInt32(owner->GetGUIDLow()); stmt.addUInt32(item->itemid); stmt.addUInt8(item->count); stmt.addUInt32(item->randomSuffix); stmt.addInt32(item->randomPropertyId); stmt.Execute(); } } } if (m_lootState != ITEM_LOOT_NONE && m_lootState != ITEM_LOOT_TEMPORARY) SetLootState(ITEM_LOOT_UNCHANGED); SetState(ITEM_UNCHANGED); }
void wxWindowQt::SetWindowStyleFlag( long style ) { wxWindowBase::SetWindowStyleFlag( style ); // wxMISSING_IMPLEMENTATION( "wxWANTS_CHARS, wxTAB_TRAVERSAL" ); // // wxFULL_REPAINT_ON_RESIZE: Qt::WResizeNoErase (marked obsolete) // // wxTRANSPARENT_WINDOW, wxCLIP_CHILDREN: Used in window for // // performance, apparently not needed. // // // wxWANTS_CHARS: Need to reimplement event() // // See: http://doc.qt.nokia.com/latest/qwidget.html#events // // wxTAB_TRAVERSAL: reimplement focusNextPrevChild() // // Qt::WindowFlags qtFlags = GetHandle()->windowFlags(); // // // For this to work Qt::CustomizeWindowHint must be set (done in Create()) // if ( HasFlag( wxCAPTION ) ) // { // // Enable caption bar and all buttons. This behavious // // is overwritten by subclasses (wxTopLevelWindow). // qtFlags |= Qt::WindowTitleHint; // qtFlags |= Qt::WindowSystemMenuHint; // qtFlags |= Qt::WindowMinMaxButtonsHint; // qtFlags |= Qt::WindowCloseButtonHint; // } // else // { // // Disable caption bar, include all buttons to be effective // qtFlags &= ~Qt::WindowTitleHint; // qtFlags &= ~Qt::WindowSystemMenuHint; // qtFlags &= ~Qt::WindowMinMaxButtonsHint; // qtFlags &= ~Qt::WindowCloseButtonHint; // } // // GetHandle()->setWindowFlags( qtFlags ); // // // Validate border styles // int numberOfBorderStyles = 0; // if ( HasFlag( wxBORDER_NONE )) // numberOfBorderStyles++; // if ( HasFlag( wxBORDER_STATIC )) // numberOfBorderStyles++; // if ( HasFlag( wxBORDER_SIMPLE )) // numberOfBorderStyles++; // if ( HasFlag( wxBORDER_RAISED )) // numberOfBorderStyles++; // if ( HasFlag( wxBORDER_SUNKEN )) // numberOfBorderStyles++; // if ( HasFlag( wxBORDER_THEME )) // numberOfBorderStyles++; // wxCHECK_RET( numberOfBorderStyles <= 1, "Only one border style can be specified" ); // // // Borders only supported for QFrame's // QFrame *qtFrame = qobject_cast< QFrame* >( QtGetContainer() ); // wxCHECK_RET( numberOfBorderStyles == 0 || qtFrame, // "Borders not supported for this window type (not QFrame)" ); // // if ( HasFlag( wxBORDER_NONE ) ) // { // qtFrame->setFrameStyle( QFrame::NoFrame ); // } // else if ( HasFlag( wxBORDER_STATIC ) ) // { // wxMISSING_IMPLEMENTATION( "wxBORDER_STATIC" ); // } // else if ( HasFlag( wxBORDER_SIMPLE ) ) // { // qtFrame->setFrameStyle( QFrame::Panel ); // qtFrame->setFrameShadow( QFrame::Plain ); // } // else if ( HasFlag( wxBORDER_RAISED ) ) // { // qtFrame->setFrameStyle( QFrame::Panel ); // qtFrame->setFrameShadow( QFrame::Raised ); // } // else if ( HasFlag( wxBORDER_SUNKEN ) ) // { // qtFrame->setFrameStyle( QFrame::Panel ); // qtFrame->setFrameShadow( QFrame::Sunken ); // } // else if ( HasFlag( wxBORDER_THEME ) ) // { // qtFrame->setFrameStyle( QFrame::StyledPanel ); // qtFrame->setFrameShadow( QFrame::Plain ); // } Qt::WindowFlags qtFlags = GetHandle()->windowFlags(); if ( HasFlag( wxFRAME_NO_TASKBAR ) ) { // qtFlags &= ~Qt::WindowType_Mask; if ( (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER) ) { qtFlags = Qt::ToolTip | Qt::FramelessWindowHint; } else qtFlags |= Qt::Dialog; } else if ( ( (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER) ) != qtFlags.testFlag( Qt::FramelessWindowHint ) ) { qtFlags ^= Qt::FramelessWindowHint; } GetHandle()->setWindowFlags( qtFlags ); }
bool Item::LoadFromDB(uint32 guidLow, Field* fields, ObjectGuid ownerGuid) { // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB Object::_Create(guidLow, 0, HIGHGUID_ITEM); if (!LoadValues(fields[0].GetString())) { sLog.outError("Item #%d have broken data in `data` field. Can't be loaded.", guidLow); return false; } SetText(fields[1].GetCppString()); bool need_save = false; // need explicit save data at load fixes // overwrite possible wrong/corrupted guid ObjectGuid new_item_guid = ObjectGuid(HIGHGUID_ITEM, guidLow); if (GetGuidValue(OBJECT_FIELD_GUID) != new_item_guid) { SetGuidValue(OBJECT_FIELD_GUID, new_item_guid); need_save = true; } ItemPrototype const* proto = GetProto(); if (!proto) return false; // update max durability (and durability) if need if (proto->MaxDurability!= GetUInt32Value(ITEM_FIELD_MAXDURABILITY)) { SetUInt32Value(ITEM_FIELD_MAXDURABILITY, proto->MaxDurability); if (GetUInt32Value(ITEM_FIELD_DURABILITY) > proto->MaxDurability) SetUInt32Value(ITEM_FIELD_DURABILITY, proto->MaxDurability); need_save = true; } // recalculate suffix factor if (GetItemRandomPropertyId() < 0) { if (UpdateItemSuffixFactor()) need_save = true; } // Remove bind flag for items vs NO_BIND set if (IsSoulBound() && proto->Bonding == NO_BIND) { ApplyModFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_BINDED, false); need_save = true; } // update duration if need, and remove if not need if ((proto->Duration == 0) != (GetUInt32Value(ITEM_FIELD_DURATION) == 0)) { SetUInt32Value(ITEM_FIELD_DURATION, proto->Duration); need_save = true; } // set correct owner if (ownerGuid && GetOwnerGuid() != ownerGuid) { SetOwnerGuid(ownerGuid); need_save = true; } // set correct wrapped state if (HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED)) { // wrapped item must be wrapper (used version that not stackable) if (!(proto->Flags & ITEM_FLAG_WRAPPER) || GetMaxStackCount() > 1) { RemoveFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED); need_save = true; static SqlStatementID delGifts ; // also cleanup for sure gift table SqlStatement stmt = CharacterDatabase.CreateStatement(delGifts, "DELETE FROM character_gifts WHERE item_guid = ?"); stmt.PExecute(GetGUIDLow()); } } if (need_save) // normal item changed state set not work at loading { static SqlStatementID updItem ; SqlStatement stmt = CharacterDatabase.CreateStatement(updItem, "UPDATE item_instance SET data = ?, owner_guid = ? WHERE guid = ?"); std::ostringstream ss; for (uint16 i = 0; i < m_valuesCount; ++i) ss << GetUInt32Value(i) << " "; stmt.addString(ss); stmt.addUInt32(GetOwnerGuid().GetCounter()); stmt.addUInt32(guidLow); stmt.Execute(); } return true; }
bool wxListBox::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int n, const wxString choices[], long style, const wxValidator& validator, const wxString &name ) { if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxListBox creation failed") ); return false; } m_widget = gtk_scrolled_window_new( NULL, NULL ); g_object_ref(m_widget); if (style & wxLB_ALWAYS_SB) { gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(m_widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS ); } else { gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(m_widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); } GTKScrolledWindowSetBorder(m_widget, style); m_treeview = GTK_TREE_VIEW( gtk_tree_view_new( ) ); //wxListBox doesn't have a header :) //NB: If enabled SetFirstItem doesn't work correctly gtk_tree_view_set_headers_visible(m_treeview, FALSE); #if wxUSE_CHECKLISTBOX if(m_hasCheckBoxes) ((wxCheckListBox*)this)->DoCreateCheckList(); #endif // wxUSE_CHECKLISTBOX // Create the data column gtk_tree_view_insert_column_with_attributes(m_treeview, -1, "", gtk_cell_renderer_text_new(), "text", WXLISTBOX_DATACOLUMN, NULL); // Now create+set the model (GtkListStore) - first argument # of columns #if wxUSE_CHECKLISTBOX if(m_hasCheckBoxes) m_liststore = gtk_list_store_new(2, G_TYPE_BOOLEAN, GTK_TYPE_TREE_ENTRY); else #endif m_liststore = gtk_list_store_new(1, GTK_TYPE_TREE_ENTRY); gtk_tree_view_set_model(m_treeview, GTK_TREE_MODEL(m_liststore)); g_object_unref (m_liststore); //free on treeview destruction // Disable the pop-up textctrl that enables searching - note that // the docs specify that even if this disabled (which we are doing) // the user can still have it through the start-interactive-search // key binding...either way we want to provide a searchequal callback // NB: If this is enabled a doubleclick event (activate) gets sent // on a successful search gtk_tree_view_set_search_column(m_treeview, WXLISTBOX_DATACOLUMN); gtk_tree_view_set_search_equal_func(m_treeview, (GtkTreeViewSearchEqualFunc) gtk_listbox_searchequal_callback, this, NULL); gtk_tree_view_set_enable_search(m_treeview, FALSE); GtkSelectionMode mode; // GTK_SELECTION_EXTENDED is a deprecated synonym for GTK_SELECTION_MULTIPLE if ( style & (wxLB_MULTIPLE | wxLB_EXTENDED) ) { mode = GTK_SELECTION_MULTIPLE; } else // no multi-selection flags specified { m_windowStyle |= wxLB_SINGLE; // Notice that we must use BROWSE and not GTK_SELECTION_SINGLE because // the latter allows to not select any items at all while a single // selection listbox is supposed to always have a selection (at least // once the user selected something, it might not have any initially). mode = GTK_SELECTION_BROWSE; } GtkTreeSelection* selection = gtk_tree_view_get_selection( m_treeview ); gtk_tree_selection_set_mode( selection, mode ); // Handle sortable stuff if(HasFlag(wxLB_SORT)) { // Setup sorting in ascending (wx) order gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(m_liststore), WXLISTBOX_DATACOLUMN, GTK_SORT_ASCENDING); // Set the sort callback gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(m_liststore), WXLISTBOX_DATACOLUMN, (GtkTreeIterCompareFunc) gtk_listbox_sort_callback, this, //userdata NULL //"destroy notifier" ); } gtk_container_add (GTK_CONTAINER (m_widget), GTK_WIDGET(m_treeview) ); gtk_widget_show( GTK_WIDGET(m_treeview) ); m_focusWidget = GTK_WIDGET(m_treeview); Append(n, choices); // insert initial items // generate dclick events g_signal_connect_after(m_treeview, "row-activated", G_CALLBACK(gtk_listbox_row_activated_callback), this); // for intercepting dclick generation by <ENTER> g_signal_connect (m_treeview, "key_press_event", G_CALLBACK (gtk_listbox_key_press_callback), this); m_parent->DoAddChild( this ); PostCreation(size); SetInitialSize(size); // need this too because this is a wxControlWithItems g_signal_connect_after (selection, "changed", G_CALLBACK (gtk_listitem_changed_callback), this); return true; }
bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, QueryResult *result) { // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB Object::_Create(guid, 0, HIGHGUID_ITEM); bool delete_result = false; if(!result) { result = CharacterDatabase.PQuery("SELECT data FROM item_instance WHERE guid = '%u'", guid); delete_result = true; } if (!result) { sLog.outError("Item (GUID: %u owner: %u) not found in table `item_instance`, can't load. ",guid,GUID_LOPART(owner_guid)); return false; } Field *fields = result->Fetch(); if(!LoadValues(fields[0].GetString())) { sLog.outError("Item #%d have broken data in `data` field. Can't be loaded.",guid); if (delete_result) delete result; return false; } bool need_save = false; // need explicit save data at load fixes // overwrite possible wrong/corrupted guid uint64 new_item_guid = MAKE_NEW_GUID(guid,0, HIGHGUID_ITEM); if(GetUInt64Value(OBJECT_FIELD_GUID) != new_item_guid) { SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid,0, HIGHGUID_ITEM)); need_save = true; } if (delete_result) delete result; ItemPrototype const* proto = GetProto(); if(!proto) return false; // update max durability (and durability) if need if(proto->MaxDurability!= GetUInt32Value(ITEM_FIELD_MAXDURABILITY)) { SetUInt32Value(ITEM_FIELD_MAXDURABILITY,proto->MaxDurability); if(GetUInt32Value(ITEM_FIELD_DURABILITY) > proto->MaxDurability) SetUInt32Value(ITEM_FIELD_DURABILITY,proto->MaxDurability); need_save = true; } // recalculate suffix factor if(GetItemRandomPropertyId() < 0) { if(UpdateItemSuffixFactor()) need_save = true; } // Remove bind flag for items vs NO_BIND set if (IsSoulBound() && proto->Bonding == NO_BIND) { ApplyModFlag(ITEM_FIELD_FLAGS,ITEM_FLAGS_BINDED, false); need_save = true; } // update duration if need, and remove if not need if ((proto->Duration == 0) != (GetUInt32Value(ITEM_FIELD_DURATION) == 0)) { SetUInt32Value(ITEM_FIELD_DURATION, proto->Duration); need_save = true; } // set correct owner if (owner_guid != 0 && GetOwnerGUID() != owner_guid) { SetOwnerGUID(owner_guid); need_save = true; } if (need_save) // normal item changed state set not work at loading { std::ostringstream ss; ss << "UPDATE item_instance SET data = '"; for(uint16 i = 0; i < m_valuesCount; ++i ) ss << GetUInt32Value(i) << " "; ss << "', owner_guid = '" << GUID_LOPART(GetOwnerGUID()) << "' WHERE guid = '" << guid << "'"; CharacterDatabase.Execute( ss.str().c_str() ); } //Set extended cost for refundable item if(HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_REFUNDABLE)) { QueryResult *result_ext = CharacterDatabase.PQuery("SELECT ExtendedCost, price FROM item_instance WHERE guid = '%u'", guid); if(result_ext) { m_ExtendedCostId = result_ext->Fetch()[0].GetUInt32(); m_price = result_ext->Fetch()[1].GetUInt32(); delete result_ext; } } return true; }
bool wxPickerBase::CreateBase(wxWindow *parent, wxWindowID id, const wxString &text, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { // remove any border style from our style as wxPickerBase's window must be // invisible (user styles must be set on the textctrl or the platform-dependent picker) style &= ~wxBORDER_MASK; if (!wxControl::Create(parent, id, pos, size, style | wxNO_BORDER | wxTAB_TRAVERSAL, validator, name)) return false; SetMinSize( size ); m_sizer = new wxBoxSizer(wxHORIZONTAL); if (HasFlag(wxPB_USE_TEXTCTRL)) { // NOTE: the style of this class (wxPickerBase) and the style of the // attached text control are different: GetTextCtrlStyle() extracts // the styles related to the textctrl from the styles passed here m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, GetTextCtrlStyle(style)); if (!m_text) { wxFAIL_MSG( wxT("wxPickerBase's textctrl creation failed") ); return false; } // set the maximum lenght allowed for this textctrl. // This is very important since any change to it will trigger an update in // the m_picker; for very long strings, this real-time synchronization could // become a CPU-blocker and thus should be avoided. // 32 characters will be more than enough for all common uses. m_text->SetMaxLength(32); // set the initial contents of the textctrl m_text->SetValue(text); m_text->Connect(m_text->GetId(), wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(wxPickerBase::OnTextCtrlUpdate), NULL, this); m_text->Connect(m_text->GetId(), wxEVT_KILL_FOCUS, wxFocusEventHandler(wxPickerBase::OnTextCtrlKillFocus), NULL, this); m_text->Connect(m_text->GetId(), wxEVT_DESTROY, wxWindowDestroyEventHandler(wxPickerBase::OnTextCtrlDelete), NULL, this); // the text control's proportion values defaults to 2 m_sizer->Add(m_text, 2, GetDefaultTextCtrlFlag(), 5); } return true; }
bool wxToolBar::Create( wxWindow* pParent, wxWindowID vId, const wxPoint& rPos, const wxSize& rSize, long lStyle, const wxString& rsName ) { if ( !wxWindow::Create( pParent ,vId ,rPos ,rSize ,lStyle ,rsName )) return false; // Set it to grey (or other 3D face colour) SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR)); SetFont(*wxSMALL_FONT); if (GetWindowStyleFlag() & (wxTB_LEFT | wxTB_RIGHT)) { m_vLastX = 7; m_vLastY = 3; m_maxRows = 32000; // a lot m_maxCols = 1; } else { m_vLastX = 3; m_vLastY = 7; m_maxRows = 1; m_maxCols = 32000; // a lot } SetCursor(*wxSTANDARD_CURSOR); // // The toolbar's tools, if they have labels and the winTB_TEXT // style is set, then we need to take into account the size of // the text when drawing tool bitmaps and the text // if (HasFlag(wxTB_TEXT)) { wxClientDC vDC(this); vDC.SetFont(GetFont()); vDC.GetTextExtent( wxT("XXXX") ,&m_vTextX ,&m_vTextY ); } // // Position it // int nX = rPos.x; int nY = rPos.y; int nWidth = rSize.x; int nHeight = rSize.y; if (lStyle & (wxTB_TOP | wxTB_BOTTOM)) { if (nWidth <= 0) { nWidth = pParent->GetClientSize().x; } if (nHeight <= 0) { if (lStyle & wxTB_TEXT) nHeight = m_defaultHeight + m_vTextY; else nHeight = m_defaultHeight; } } else { if (nHeight <= 0) { nHeight = pParent->GetClientSize().y; } if (nWidth <= 0) { if (lStyle & wxTB_TEXT) nWidth = m_vTextX + (int)(m_vTextX/2); // a little margin else nWidth = m_defaultWidth + (int)(m_defaultWidth/2); // a little margin } } if (nX < 0) nX = 0; if (nY < 0) nY = 0; SetSize( nX ,nY ,nWidth ,nHeight ); return true; } // end of wxToolBar::Create
void Item::SaveToDB(SQLTransaction& trans) { bool isInTransaction = bool(trans); if (!isInTransaction) trans = CharacterDatabase.BeginTransaction(); uint32 guid = GetGUID().GetCounter(); switch (uState) { case ITEM_NEW: case ITEM_CHANGED: { uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(uState == ITEM_NEW ? CHAR_REP_ITEM_INSTANCE : CHAR_UPD_ITEM_INSTANCE); stmt->setUInt32( index, GetEntry()); stmt->setUInt32(++index, GetOwnerGUID().GetCounter()); stmt->setUInt32(++index, GetGuidValue(ITEM_FIELD_CREATOR).GetCounter()); stmt->setUInt32(++index, GetGuidValue(ITEM_FIELD_GIFTCREATOR).GetCounter()); stmt->setUInt32(++index, GetCount()); stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_DURATION)); std::ostringstream ssSpells; for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) ssSpells << GetSpellCharges(i) << ' '; stmt->setString(++index, ssSpells.str()); stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_FLAGS)); std::ostringstream ssEnchants; for (uint8 i = 0; i < MAX_ENCHANTMENT_SLOT; ++i) { ssEnchants << GetEnchantmentId(EnchantmentSlot(i)) << ' '; ssEnchants << GetEnchantmentDuration(EnchantmentSlot(i)) << ' '; ssEnchants << GetEnchantmentCharges(EnchantmentSlot(i)) << ' '; } stmt->setString(++index, ssEnchants.str()); stmt->setInt16 (++index, GetItemRandomPropertyId()); stmt->setUInt16(++index, GetUInt32Value(ITEM_FIELD_DURABILITY)); stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME)); stmt->setString(++index, m_text); stmt->setUInt32(++index, guid); trans->Append(stmt); if ((uState == ITEM_CHANGED) && HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GIFT_OWNER); stmt->setUInt32(0, GetOwnerGUID().GetCounter()); stmt->setUInt32(1, guid); trans->Append(stmt); } break; } case ITEM_REMOVED: { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE); stmt->setUInt32(0, guid); trans->Append(stmt); if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); stmt->setUInt32(0, guid); trans->Append(stmt); } if (!isInTransaction) CharacterDatabase.CommitTransaction(trans); // Delete the items if this is a container if (!loot.isLooted()) ItemContainerDeleteLootMoneyAndLootItemsFromDB(); delete this; return; } case ITEM_UNCHANGED: break; } SetState(ITEM_UNCHANGED); if (!isInTransaction) CharacterDatabase.CommitTransaction(trans); }
void wxToolBar::OnPaint ( wxPaintEvent& WXUNUSED(rEvent) ) { wxPaintDC vDc(this); PrepareDC(vDc); static int nCount = 0; // // Prevent reentry of OnPaint which would cause wxMemoryDC errors. // if (nCount > 0) return; nCount++; wxPMDCImpl *impl = (wxPMDCImpl*) vDc.GetImpl(); ::WinFillRect(impl->GetHPS(), &impl->m_vRclPaint, GetBackgroundColour().GetPixel()); for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); node; node = node->GetNext() ) { wxToolBarTool* pTool = (wxToolBarTool*)node->GetData(); if (pTool->IsButton() ) DrawTool(vDc, pTool); if (pTool->IsSeparator()) { wxColour gray85(85, 85, 85); wxPen vDarkGreyPen( gray85, 1, wxSOLID ); int nX; int nY; int nHeight = 0; int nWidth = 0; vDc.SetPen(vDarkGreyPen); if (HasFlag(wxTB_TEXT)) { if (HasFlag(wxTB_TOP) || HasFlag(wxTB_BOTTOM)) { nX = pTool->m_vX; nY = pTool->m_vY - (m_vTextY - 6); nHeight = (m_vTextY - 2) + pTool->GetHeight(); } else { nX = pTool->m_vX + m_xMargin + 10; nY = pTool->m_vY + m_vTextY + m_toolSeparation; nWidth = pTool->GetWidth() > m_vTextX ? pTool->GetWidth() : m_vTextX; } } else { nX = pTool->m_vX; nY = pTool->m_vY; if (HasFlag(wxTB_TOP) || HasFlag(wxTB_BOTTOM)) nHeight = pTool->GetHeight() - 2; else { nX += m_xMargin + 10; nY += m_yMargin + m_toolSeparation; nWidth = pTool->GetWidth(); } } vDc.DrawLine(nX, nY, nX + nWidth, nY + nHeight); } } nCount--; } // end of wxToolBar::OnPaint
bool wxTopLevelWindowMSW::Show(bool show) { // don't use wxWindow version as we want to call DoShowWindow() ourselves if ( !wxWindowBase::Show(show) ) return false; int nShowCmd; if ( show ) { if ( m_maximizeOnShow ) { // show and maximize nShowCmd = SW_MAXIMIZE; m_maximizeOnShow = false; } else if ( m_iconized ) { // We were iconized while we were hidden, so now we need to show // the window in iconized state. nShowCmd = SW_MINIMIZE; } else if ( ::IsIconic(GetHwnd()) ) { // We were restored while we were hidden, so now we need to show // the window in its normal state. // // As below, don't activate some kinds of windows. if ( HasFlag(wxFRAME_TOOL_WINDOW) || !IsEnabled() ) nShowCmd = SW_SHOWNOACTIVATE; else nShowCmd = SW_RESTORE; } else // just show { // we shouldn't use SW_SHOW which also activates the window for // tool frames (as they shouldn't steal focus from the main window) // nor for the currently disabled windows as they would be enabled // as a side effect if ( HasFlag(wxFRAME_TOOL_WINDOW) || !IsEnabled() ) nShowCmd = SW_SHOWNA; else nShowCmd = SW_SHOW; } } else // hide { nShowCmd = SW_HIDE; } #if wxUSE_DEFERRED_SIZING // we only set pending size if we're maximized before being shown, now that // we're shown we don't need it any more (it is reset in size event handler // for child windows but we have to do it ourselves for this parent window) // // make sure to reset it before actually showing the window as this will // generate WM_SIZE events and we want to use the correct client size from // them, not the size returned by WM_NCCALCSIZE in DoGetClientSize() which // turns out to be wrong for maximized windows (see #11762) m_pendingSize = wxDefaultSize; #endif // wxUSE_DEFERRED_SIZING DoShowWindow(nShowCmd); return true; }
/* ms_tburst() * * parv[0] = sender prefix * parv[1] = channel timestamp * parv[2] = channel * parv[3] = topic timestamp * parv[4] = topic setter * parv[5] = topic */ static void ms_tburst(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { struct Channel *chptr = NULL; int accept_remote = 0; time_t remote_channel_ts = atol(parv[1]); time_t remote_topic_ts = atol(parv[3]); const char *topic = parv[5]; const char *setby = parv[4]; /* * Do NOT test parv[5] for an empty string and return if true! * parv[5] CAN be an empty string, i.e. if the other side wants * to unset our topic. Don't forget: an empty topic is also a * valid topic. */ if ((chptr = hash_find_channel(parv[2])) == NULL) return; /* * The logic for accepting and rejecting channel topics was * always a bit hairy, so now we got exactly 2 cases where * we would accept a bursted topic * * Case 1: * The TS of the remote channel is older than ours * Case 2: * The TS of the remote channel is equal to ours AND * the TS of the remote topic is newer than ours */ if (HasFlag(source_p, FLAGS_SERVICE)) accept_remote = 1; else if (remote_channel_ts < chptr->channelts) accept_remote = 1; else if (remote_channel_ts == chptr->channelts) if (remote_topic_ts > chptr->topic_time) accept_remote = 1; if (accept_remote) { int topic_differs = strncmp(chptr->topic, topic, sizeof(chptr->topic) - 1); int hidden_server = (ConfigServerHide.hide_servers || IsHidden(source_p)); set_channel_topic(chptr, topic, setby, remote_topic_ts, !!MyClient(source_p)); sendto_server(source_p, CAP_TBURST|CAP_TS6, NOCAPS, ":%s TBURST %s %s %s %s :%s", ID(source_p), parv[1], parv[2], parv[3], setby, topic); sendto_server(source_p, CAP_TBURST, CAP_TS6, ":%s TBURST %s %s %s %s :%s", source_p->name, parv[1], parv[2], parv[3], setby, topic); if (topic_differs) sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s TOPIC %s :%s", hidden_server ? me.name : source_p->name, chptr->chname, chptr->topic); } }
bool HTMLAnchorElement::HasDeferredDNSPrefetchRequest() { return HasFlag(HTML_ANCHOR_DNS_PREFETCH_DEFERRED); }
bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) { wxToolBarTool* tool = static_cast<wxToolBarTool*>(toolBase); GSList* radioGroup; GtkWidget* bin_child; switch ( tool->GetStyle() ) { case wxTOOL_STYLE_BUTTON: switch (tool->GetKind()) { case wxITEM_CHECK: tool->m_item = gtk_toggle_tool_button_new(); g_signal_connect(tool->m_item, "toggled", G_CALLBACK(item_toggled), tool); break; case wxITEM_RADIO: radioGroup = GetRadioGroup(pos); if (radioGroup) { // this is the first button in the radio button group, // it will be toggled automatically by GTK so bring the // internal flag in sync tool->Toggle(true); } tool->m_item = gtk_radio_tool_button_new(radioGroup); g_signal_connect(tool->m_item, "toggled", G_CALLBACK(item_toggled), tool); break; default: wxFAIL_MSG("unknown toolbar child type"); // fall through case wxITEM_DROPDOWN: case wxITEM_NORMAL: tool->m_item = gtk_tool_button_new(NULL, ""); g_signal_connect(tool->m_item, "clicked", G_CALLBACK(item_clicked), tool); break; } if (!HasFlag(wxTB_NOICONS)) { GtkWidget* image = gtk_image_new(); gtk_tool_button_set_icon_widget( GTK_TOOL_BUTTON(tool->m_item), image); tool->SetImage(); gtk_widget_show(image); g_signal_connect(image, "expose_event", G_CALLBACK(image_expose_event), tool); } if (!tool->GetLabel().empty()) { gtk_tool_button_set_label( GTK_TOOL_BUTTON(tool->m_item), wxGTK_CONV(tool->GetLabel())); // needed for labels in horizontal toolbar with wxTB_HORZ_LAYOUT gtk_tool_item_set_is_important(tool->m_item, true); } if (!HasFlag(wxTB_NO_TOOLTIPS) && !tool->GetShortHelp().empty()) { #if GTK_CHECK_VERSION(2, 12, 0) if (GTK_CHECK_VERSION(3,0,0) || gtk_check_version(2,12,0) == NULL) { gtk_tool_item_set_tooltip_text(tool->m_item, wxGTK_CONV(tool->GetShortHelp())); } else #endif { #if !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED) gtk_tool_item_set_tooltip(tool->m_item, m_tooltips, wxGTK_CONV(tool->GetShortHelp()), ""); #endif } } bin_child = gtk_bin_get_child(GTK_BIN(tool->m_item)); g_signal_connect(bin_child, "button_press_event", G_CALLBACK(button_press_event), tool); g_signal_connect(bin_child, "enter_notify_event", G_CALLBACK(enter_notify_event), tool); g_signal_connect(bin_child, "leave_notify_event", G_CALLBACK(enter_notify_event), tool); if (tool->GetKind() == wxITEM_DROPDOWN) tool->CreateDropDown(); gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos)); break; case wxTOOL_STYLE_SEPARATOR: tool->m_item = gtk_separator_tool_item_new(); if ( tool->IsStretchable() ) { gtk_separator_tool_item_set_draw ( GTK_SEPARATOR_TOOL_ITEM(tool->m_item), FALSE ); gtk_tool_item_set_expand(tool->m_item, TRUE); } gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos)); break; case wxTOOL_STYLE_CONTROL: wxWindow* control = tool->GetControl(); if (gtk_widget_get_parent(control->m_widget) == NULL) AddChildGTK(control); tool->m_item = GTK_TOOL_ITEM(gtk_widget_get_parent(gtk_widget_get_parent(control->m_widget))); if (gtk_toolbar_get_item_index(m_toolbar, tool->m_item) != int(pos)) { g_object_ref(tool->m_item); gtk_container_remove( GTK_CONTAINER(m_toolbar), GTK_WIDGET(tool->m_item)); gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos)); g_object_unref(tool->m_item); } // Inserted items "slide" into place using an animated effect that // causes multiple size events on the item. Must set size request // to keep item size from getting permanently set too small by the // first of these size events. const wxSize size = control->GetSize(); gtk_widget_set_size_request(control->m_widget, size.x, size.y); break; } gtk_widget_show(GTK_WIDGET(tool->m_item)); InvalidateBestSize(); return true; }
void Channel::Join(uint64 p, const char *pass) { WorldPacket data; if (IsOn(p)) { if (!IsConstant()) // non send error message for built-in channels { MakePlayerAlreadyMember(&data, p); SendToOne(&data, p); } return; } if (IsBanned(p)) { MakeBanned(&data); SendToOne(&data, p); return; } if (m_password.length() > 0 && strcmp(pass, m_password.c_str())) { MakeWrongPassword(&data); SendToOne(&data, p); return; } Player* player = ObjectAccessor::FindPlayer(p); if (player) { if (HasFlag(CHANNEL_FLAG_LFG) && sWorld->getBoolConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && AccountMgr::IsPlayerAccount(player->GetSession()->GetSecurity()) && player->GetGroup()) { MakeNotInLfg(&data); SendToOne(&data, p); return; } player->JoinedChannel(this); } if (m_announce && (!player || !AccountMgr::IsGMAccount(player->GetSession()->GetSecurity()) || !sWorld->getBoolConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL))) { MakeJoined(&data, p); SendToAll(&data); } data.clear(); PlayerInfo pinfo; pinfo.player = p; pinfo.flags = MEMBER_FLAG_NONE; players[p] = pinfo; MakeYouJoined(&data); SendToOne(&data, p); JoinNotify(p); // Custom channel handling if (!IsConstant()) { // Update last_used timestamp in db if (!players.empty()) UpdateChannelUseageInDB(); // If the channel has no owner yet and ownership is allowed, set the new owner. if (!m_ownerGUID && m_ownership) { SetOwner(p, (players.size() > 1 ? true : false)); players[p].SetModerator(true); } } }
/* * m_who - generic message handler * * parv[0] = sender prefix * parv[1] = nickname mask list * parv[2] = additional selection flag, only 'o' for now. * and %flags to specify what fields to output * plus a ,querytype if the t flag is specified * so the final thing will be like o%tnchu,777 * parv[3] = _optional_ parameter that overrides parv[1] * This can be used as "/quote who foo % :The Black Hacker * to find me, parv[3] _can_ contain spaces !. */ int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char *mask; /* The mask we are looking for */ char ch; /* Scratch char register */ struct Channel *chptr; /* Channel to show */ struct Client *acptr; /* Client to show */ int bitsel; /* Mask of selectors to apply */ int matchsel; /* Which fields the match should apply on */ int counter; /* Query size counter, initially used to count fields */ int commas; /* Does our mask contain any comma ? If so is a list.. */ int fields; /* Mask of fields to show */ int isthere = 0; /* When this set the user is member of chptr */ char *nick; /* Single element extracted from the mask list */ char *p; /* Scratch char pointer */ char *qrt; /* Pointer to the query type */ static char mymask[512]; /* To save the mask before corrupting it */ /* Let's find where is our mask, and if actually contains something */ mask = ((parc > 1) ? parv[1] : 0); if (parc > 3 && parv[3]) mask = parv[3]; if (mask && ((mask[0] == '\0') || (mask[1] == '\0' && ((mask[0] == '0') || (mask[0] == '*'))))) mask = 0; /* Evaluate the flags now, we consider the second parameter as "matchFlags%fieldsToInclude,querytype" */ bitsel = fields = counter = matchsel = 0; qrt = 0; if (parc > 2 && parv[2] && *parv[2]) { p = parv[2]; while (((ch = *(p++))) && (ch != '%') && (ch != ',')) switch (ch) { case 'd': case 'D': bitsel |= WHOSELECT_DELAY; continue; case 'o': case 'O': bitsel |= WHOSELECT_OPER; continue; case 'x': case 'X': bitsel |= WHOSELECT_EXTRA; if (HasPriv(sptr, PRIV_WHOX)) log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr, (BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]); continue; case 'n': case 'N': matchsel |= WHO_FIELD_NIC; continue; case 'u': case 'U': matchsel |= WHO_FIELD_UID; continue; case 'h': case 'H': matchsel |= WHO_FIELD_HOS; continue; case 'i': case 'I': matchsel |= WHO_FIELD_NIP; continue; case 's': case 'S': matchsel |= WHO_FIELD_SER; continue; case 'r': case 'R': matchsel |= WHO_FIELD_REN; continue; case 'a': case 'A': matchsel |= WHO_FIELD_ACC; continue; } if (ch == '%') while ((ch = *p++) && (ch != ',')) { counter++; switch (ch) { case 'c': case 'C': fields |= WHO_FIELD_CHA; break; case 'd': case 'D': fields |= WHO_FIELD_DIS; break; case 'f': case 'F': fields |= WHO_FIELD_FLA; break; case 'h': case 'H': fields |= WHO_FIELD_HOS; break; case 'i': case 'I': fields |= WHO_FIELD_NIP; break; case 'l': case 'L': fields |= WHO_FIELD_IDL; case 'n': case 'N': fields |= WHO_FIELD_NIC; break; case 'r': case 'R': fields |= WHO_FIELD_REN; break; case 's': case 'S': fields |= WHO_FIELD_SER; break; case 't': case 'T': fields |= WHO_FIELD_QTY; break; case 'u': case 'U': fields |= WHO_FIELD_UID; break; case 'a': case 'A': fields |= WHO_FIELD_ACC; break; case 'o': case 'O': fields |= WHO_FIELD_OPL; break; default: break; } }; if (ch) qrt = p; } if (!matchsel) matchsel = WHO_FIELD_DEF; if (!fields) counter = 7; if (feature_bool(FEAT_HIS_WHO_SERVERNAME) && !IsAnOper(sptr)) matchsel &= ~WHO_FIELD_SER; if (qrt && (fields & WHO_FIELD_QTY)) { p = qrt; if (!((*p > '9') || (*p < '0'))) p++; if (!((*p > '9') || (*p < '0'))) p++; if (!((*p > '9') || (*p < '0'))) p++; *p = '\0'; } else qrt = 0; /* I'd love to add also a check on the number of matches fields per time */ counter = (2048 / (counter + 4)); if (mask && (strlen(mask) > 510)) mask[510] = '\0'; move_marker(); commas = (mask && strchr(mask, ',')); /* First treat mask as a list of plain nicks/channels */ if (mask) { strcpy(mymask, mask); for (p = 0, nick = ircd_strtok(&p, mymask, ","); nick; nick = ircd_strtok(&p, 0, ",")) { if (IsChannelName(nick) && (chptr = FindChannel(nick))) { isthere = (find_channel_member(sptr, chptr) != 0); if (isthere || SEE_CHANNEL(sptr, chptr, bitsel)) { struct Membership* member; for (member = chptr->members; member; member = member->next_member) { acptr = member->user; if ((bitsel & WHOSELECT_OPER) && !SeeOper(sptr,acptr)) continue; if ((acptr != sptr) && ((member->status & CHFL_ZOMBIE) || ((member->status & CHFL_DELAYED) && !(bitsel & WHOSELECT_DELAY)))) continue; if (!(isthere || (SEE_USER(sptr, acptr, bitsel)))) continue; if (!Process(acptr)) /* This can't be moved before other checks */ continue; if (!(isthere || (SHOW_MORE(sptr, counter)))) break; do_who(sptr, acptr, chptr, fields, qrt); } } } else { if ((acptr = FindUser(nick)) && ((!(bitsel & WHOSELECT_OPER)) || SeeOper(sptr,acptr)) && Process(acptr) && SHOW_MORE(sptr, counter)) { do_who(sptr, acptr, 0, fields, qrt); } } } } /* If we didn't have any comma in the mask treat it as a real mask and try to match all relevant fields */ if (!(commas || (counter < 1))) { struct irc_in_addr imask; int minlen, cset; unsigned char ibits; if (mask) { matchcomp(mymask, &minlen, &cset, mask); if (!ipmask_parse(mask, &imask, &ibits)) matchsel &= ~WHO_FIELD_NIP; if ((minlen > NICKLEN) || !(cset & NTL_IRCNK)) matchsel &= ~WHO_FIELD_NIC; if ((matchsel & WHO_FIELD_SER) && ((minlen > HOSTLEN) || (!(cset & NTL_IRCHN)) || (!markMatchexServer(mymask, minlen)))) matchsel &= ~WHO_FIELD_SER; if ((minlen > USERLEN) || !(cset & NTL_IRCUI)) matchsel &= ~WHO_FIELD_UID; if ((minlen > HOSTLEN) || !(cset & NTL_IRCHN)) matchsel &= ~WHO_FIELD_HOS; if ((minlen > ACCOUNTLEN)) matchsel &= ~WHO_FIELD_ACC; } /* First of all loop through the clients in common channels */ if ((!(counter < 1)) && matchsel) { struct Membership* member; struct Membership* chan; for (chan = cli_user(sptr)->channel; chan; chan = chan->next_channel) { chptr = chan->channel; for (member = chptr->members; member; member = member->next_member) { acptr = member->user; if (!(IsUser(acptr) && Process(acptr))) continue; /* Now Process() is at the beginning, if we fail we'll never have to show this acptr in this query */ if ((bitsel & WHOSELECT_OPER) && !SeeOper(sptr,acptr)) continue; if ((mask) && ((!(matchsel & WHO_FIELD_NIC)) || matchexec(cli_name(acptr), mymask, minlen)) && ((!(matchsel & WHO_FIELD_UID)) || matchexec(cli_user(acptr)->username, mymask, minlen)) && ((!(matchsel & WHO_FIELD_SER)) || (!(HasFlag(cli_user(acptr)->server, FLAG_MAP)))) && ((!(matchsel & WHO_FIELD_HOS)) || matchexec(cli_user(acptr)->host, mymask, minlen)) && ((!(matchsel & WHO_FIELD_HOS)) || !HasHiddenHost(acptr) || !IsAnOper(sptr) || matchexec(cli_user(acptr)->realhost, mymask, minlen)) && ((!(matchsel & WHO_FIELD_REN)) || matchexec(cli_info(acptr), mymask, minlen)) && ((!(matchsel & WHO_FIELD_NIP)) || (HasHiddenHost(acptr) && !IsAnOper(sptr)) || !ipmask_check(&cli_ip(acptr), &imask, ibits)) && ((!(matchsel & WHO_FIELD_ACC)) || matchexec(cli_user(acptr)->account, mymask, minlen))) continue; if (!SHOW_MORE(sptr, counter)) break; do_who(sptr, acptr, chptr, fields, qrt); } } } /* Loop through all clients :-\, if we still have something to match to and we can show more clients */ if ((!(counter < 1)) && matchsel) for (acptr = cli_prev(&me); acptr; acptr = cli_prev(acptr)) { if (!(IsUser(acptr) && Process(acptr))) continue; if ((bitsel & WHOSELECT_OPER) && !SeeOper(sptr,acptr)) continue; if (!(SEE_USER(sptr, acptr, bitsel))) continue; if ((mask) && ((!(matchsel & WHO_FIELD_NIC)) || matchexec(cli_name(acptr), mymask, minlen)) && ((!(matchsel & WHO_FIELD_UID)) || matchexec(cli_user(acptr)->username, mymask, minlen)) && ((!(matchsel & WHO_FIELD_SER)) || (!(HasFlag(cli_user(acptr)->server, FLAG_MAP)))) && ((!(matchsel & WHO_FIELD_HOS)) || matchexec(cli_user(acptr)->host, mymask, minlen)) && ((!(matchsel & WHO_FIELD_HOS)) || !HasHiddenHost(acptr) || !IsAnOper(sptr) || matchexec(cli_user(acptr)->realhost, mymask, minlen)) && ((!(matchsel & WHO_FIELD_REN)) || matchexec(cli_info(acptr), mymask, minlen)) && ((!(matchsel & WHO_FIELD_NIP)) || (HasHiddenHost(acptr) && !IsAnOper(sptr)) || !ipmask_check(&cli_ip(acptr), &imask, ibits)) && ((!(matchsel & WHO_FIELD_ACC)) || matchexec(cli_user(acptr)->account, mymask, minlen))) continue; if (!SHOW_MORE(sptr, counter)) break; do_who(sptr, acptr, 0, fields, qrt); } } /* Make a clean mask suitable to be sent in the "end of" */ if (mask && (p = strchr(mask, ' '))) *p = '\0'; /* Notify the user if we decided that his query was too long */ if (counter < 0) send_reply(sptr, ERR_QUERYTOOLONG, BadPtr(mask) ? "*" : mask); send_reply(sptr, RPL_ENDOFWHO, BadPtr(mask) ? "*" : mask); return 0; }
void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { int x = (int)event.GetX(), y = (int)event.GetY(); if ( GetWindowStyle() & wxSP_NOSASH ) { event.Skip(); return; } // with wxSP_LIVE_UPDATE style the splitter windows are always resized // following the mouse movement while it drags the sash, without it we only // draw the sash at the new position but only resize the windows when the // dragging is finished #if defined( __WXMAC__ ) && defined(TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX == 1 bool isLive = true ; // FIXME: why? #else bool isLive = HasFlag(wxSP_LIVE_UPDATE); #endif if (event.LeftDown()) { if ( SashHitTest(x, y) ) { // Start the drag now m_dragMode = wxSPLIT_DRAG_DRAGGING; // Capture mouse and set the cursor CaptureMouse(); SetResizeCursor(); if ( !isLive ) { // remember the initial sash position and draw the initial // shadow sash m_sashPositionCurrent = m_sashPosition; DrawSashTracker(x, y); } m_oldX = x; m_oldY = y; SetResizeCursor(); return; } } else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; // Release mouse and unset the cursor ReleaseMouse(); SetCursor(* wxSTANDARD_CURSOR); // exit if unsplit after doubleclick if ( !IsSplit() ) { return; } // Erase old tracker if ( !isLive ) { DrawSashTracker(m_oldX, m_oldY); } // the position of the click doesn't exactly correspond to // m_sashPosition, rather it changes it by the distance by which the // mouse has moved int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; int posSashOld = isLive ? m_sashPosition : m_sashPositionCurrent; int posSashNew = OnSashPositionChanging(posSashOld + diff); if ( posSashNew == -1 ) { // change not allowed return; } if ( m_permitUnsplitAlways || m_minimumPaneSize == 0 ) { // Deal with possible unsplit scenarios if ( posSashNew == 0 ) { // We remove the first window from the view wxWindow *removedWindow = m_windowOne; m_windowOne = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); eventUnsplit.m_data.win = removedWindow; (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else if ( posSashNew == GetWindowSize() ) { // We remove the second window from the view wxWindow *removedWindow = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); eventUnsplit.m_data.win = removedWindow; (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else { SetSashPositionAndNotify(posSashNew); } } else { SetSashPositionAndNotify(posSashNew); } SizeWindows(); } // left up && dragging else if ((event.Moving() || event.Leaving() || event.Entering()) && (m_dragMode == wxSPLIT_DRAG_NONE)) { if ( event.Leaving() || !SashHitTest(x, y) ) OnLeaveSash(); else OnEnterSash(); } else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; if ( !diff ) { // nothing to do, mouse didn't really move far enough return; } int posSashOld = isLive ? m_sashPosition : m_sashPositionCurrent; int posSashNew = OnSashPositionChanging(posSashOld + diff); if ( posSashNew == -1 ) { // change not allowed return; } if ( posSashNew == m_sashPosition ) return; // Erase old tracker if ( !isLive ) { DrawSashTracker(m_oldX, m_oldY); } if (m_splitMode == wxSPLIT_VERTICAL) x = posSashNew; else y = posSashNew; // Remember old positions m_oldX = x; m_oldY = y; #ifdef __WXMSW__ // As we captured the mouse, we may get the mouse events from outside // our window - for example, negative values in x, y. This has a weird // consequence under MSW where we use unsigned values sometimes and // signed ones other times: the coordinates turn as big positive // numbers and so the sash is drawn on the *right* side of the window // instead of the left (or bottom instead of top). Correct this. if ( (short)m_oldX < 0 ) m_oldX = 0; if ( (short)m_oldY < 0 ) m_oldY = 0; #endif // __WXMSW__ // Draw new one if ( !isLive ) { m_sashPositionCurrent = posSashNew; DrawSashTracker(m_oldX, m_oldY); } else { DoSetSashPosition(posSashNew); m_needUpdating = true; } } else if ( event.LeftDClick() && m_windowTwo ) { OnDoubleClickSash(x, y); } else { event.Skip(); } }