void CSimpleTextEditorLayout::GetCellByLinePosition (unsigned int line, unsigned int position, TEXTCELL &text_cell) { ASSERT (line < text.GetLinesCount ()); ASSERT (position <= text.GetLineLength (line)); GetCellAt (line, position, text_cell); }
bool Aggrotech::Playfield::IsTetriminoInCollision(Aggrotech::Tetrimino &tetrimino) { TetriminoShape shapeMatrix = tetrimino.GetShapeMatrix(); int originX = tetrimino.GetX(); int originY = tetrimino.GetY(); for (int y = 0; y < shapeMatrix.size(); y++) { for (int x = 0; x < shapeMatrix[y].size(); x++) { if (shapeMatrix[y][x]) { int finalX = originX + x; int finalY = originY + y; if (GetCellAt(finalX, finalY)) { return true; } } } } return false; }
/** * Run through all the cells in the rows and columns and populate then with 2 cells. One from the row and one * from the column */ void nsGrid::PopulateCellMap(nsGridRow* aRows, nsGridRow* aColumns, PRInt32 aRowCount, PRInt32 aColumnCount, bool aIsHorizontal) { if (!aRows) return; // look through the columns PRInt32 j = 0; for(PRInt32 i=0; i < aRowCount; i++) { nsIBox* child = nsnull; nsGridRow* row = &aRows[i]; // skip bogus rows. They have no cells if (row->mIsBogus) continue; child = row->mBox; if (child) { child = child->GetChildBox(); j = 0; while(child && j < aColumnCount) { // skip bogus column. They have no cells nsGridRow* column = &aColumns[j]; if (column->mIsBogus) { j++; continue; } if (aIsHorizontal) GetCellAt(j,i)->SetBoxInRow(child); else GetCellAt(i,j)->SetBoxInColumn(child); child = child->GetNextBox(); j++; } } } }
Aggrotech::Cell *Aggrotech::Playfield::SetAndGetPreviousCellAt(unsigned int x, unsigned int y, Cell *cell) { Cell *previousCell = GetCellAt(x, y); cells[(y * width) + x] = cell; return previousCell; }
void CUIDragDropReferenceList::SetItem(CUICellItem* itm, Fvector2 abs_pos) { const Ivector2 dest_cell_pos = m_container->PickCell(abs_pos); if(m_container->ValidCell(dest_cell_pos) && m_container->IsRoomFree(dest_cell_pos,itm->GetGridSize())) SetItem(itm, dest_cell_pos); else { if(dest_cell_pos.x!=-1&&dest_cell_pos.y!=-1) { CUICellItem* old_itm = GetCellAt(dest_cell_pos).m_item; RemoveItem(old_itm, false); SetItem(itm, dest_cell_pos); } } }
void CUIDragDropReferenceList::OnItemDBClick(CUIWindow* w, void* pData) { CUIStatic* ref = smart_cast<CUIStatic*>(w); ITEMS_REFERENCES_VEC_IT it = std::find(m_references.begin(), m_references.end(), ref); if(it != m_references.end()) { u8 index = u8(it-m_references.begin()); CActor* actor = smart_cast<CActor*>(Level().CurrentViewEntity()); if(actor) { PIItem itm = actor->inventory().GetAny(ACTOR_DEFS::g_quick_use_slots[index]); if(itm) inherited::RemoveItem(GetCellAt(Ivector2().set(index, 0)).m_item, false); } xr_strcpy(ACTOR_DEFS::g_quick_use_slots[index], ""); (*it)->SetTextureColor(color_rgba(255,255,255,0)); } }
NS_IMETHODIMP nsXULTreeGridAccessible::GetSelectedCells(nsIArray **aCells) { NS_ENSURE_ARG_POINTER(aCells); *aCells = nsnull; nsCOMPtr<nsIMutableArray> selCells = do_CreateInstance(NS_ARRAY_CONTRACTID); NS_ENSURE_TRUE(selCells, NS_ERROR_FAILURE); PRInt32 selectedrowCount = 0; nsresult rv = GetSelectionCount(&selectedrowCount); NS_ENSURE_SUCCESS(rv, rv); PRInt32 columnCount = 0; rv = GetColumnCount(&columnCount); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsITreeSelection> selection; rv = mTreeView->GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(rv, rv); PRInt32 rowCount = 0; rv = GetRowCount(&rowCount); NS_ENSURE_SUCCESS(rv, rv); PRBool isSelected; for (PRInt32 rowIdx = 0; rowIdx < rowCount; rowIdx++) { selection->IsSelected(rowIdx, &isSelected); if (isSelected) { for (PRInt32 colIdx = 0; colIdx < columnCount; colIdx++) { nsCOMPtr<nsIAccessible> cell; GetCellAt(rowIdx, colIdx, getter_AddRefs(cell)); selCells->AppendElement(cell, PR_FALSE); } } } NS_ADDREF(*aCells = selCells); return NS_OK; }
NS_IMETHODIMP nsHTMLTableAccessible::GetCellAt(PRInt32 aRow, PRInt32 aColumn, nsIAccessible **aTableCellAccessible) { nsCOMPtr<nsIDOMElement> cellElement; nsresult rv = GetCellAt(aRow, aColumn, *getter_AddRefs(cellElement)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIContent> cellContent(do_QueryInterface(cellElement)); nsAccessible *cell = GetAccService()->GetAccessibleInWeakShell(cellContent, mWeakShell); if (!cell) { return NS_ERROR_INVALID_ARG; } if (cell != this) { // XXX bug 576838: crazy tables (like table6 in tables/test_table2.html) may // return itself as a cell what makes Orca hang. NS_ADDREF(*aTableCellAccessible = cell); } return NS_OK; }
int Aggrotech::Playfield::ClearFilledAndReturnAffectedRows() { std::vector< unsigned int > fullLineYIndices; for (unsigned int y = 0; y < height; y++) { bool fullLineFound = true; for (unsigned int x = 0; x < width; x++) { if (GetCellAt(x, y) == NULL) { fullLineFound = false; } } if (fullLineFound) { fullLineYIndices.push_back(y); } } std::vector< unsigned int>::const_iterator it = fullLineYIndices.begin(); while (it != fullLineYIndices.end()) { for (unsigned int x = 0; x < width; x++) { SetAndGetPreviousCellAt(x, *it, NULL); } it++; } return fullLineYIndices.size(); }
nscoord nsGrid::GetMaxRowHeight(nsBoxLayoutState& aState, PRInt32 aIndex, bool aIsHorizontal) { RebuildIfNeeded(); nsGridRow* row = GetRowAt(aIndex, aIsHorizontal); if (row->IsCollapsed(aState)) return 0; if (row->IsMaxSet()) return row->mMax; nsIBox* box = row->mBox; // set in CSS? if (box) { bool widthSet, heightSet; nsSize cssSize(-1, -1); nsIBox::AddCSSMaxSize(box, cssSize, widthSet, heightSet); row->mMax = GET_HEIGHT(cssSize, aIsHorizontal); // yep do nothing. if (row->mMax != -1) return row->mMax; } // get the offsets so they are cached. nscoord top; nscoord bottom; GetRowOffsets(aState, aIndex, top, bottom, aIsHorizontal); // is the row bogus? If so then just ask it for its size // it should not be affected by cells in the grid. if (row->mIsBogus) { nsSize size(NS_INTRINSICSIZE,NS_INTRINSICSIZE); if (box) { size = box->GetPrefSize(aState); nsBox::AddMargin(box, size); nsGridLayout2::AddOffset(aState, box, size); } row->mMax = GET_HEIGHT(size, aIsHorizontal); return row->mMax; } nsSize size(NS_INTRINSICSIZE,NS_INTRINSICSIZE); nsGridCell* child; PRInt32 count = GetColumnCount(aIsHorizontal); for (PRInt32 i=0; i < count; i++) { if (aIsHorizontal) child = GetCellAt(i,aIndex); else child = GetCellAt(aIndex,i); // ignore collapsed children if (!child->IsCollapsed(aState)) { nsSize min = child->GetMinSize(aState); nsSize childSize = nsBox::BoundsCheckMinMax(min, child->GetMaxSize(aState)); nsSprocketLayout::AddLargestSize(size, childSize, aIsHorizontal); } } row->mMax = GET_HEIGHT(size, aIsHorizontal) + top + bottom; return row->mMax; }
NS_IMETHODIMP nsHTMLTableAccessible::IsProbablyForLayout(PRBool *aIsProbablyForLayout) { // Implement a heuristic to determine if table is most likely used for layout // XXX do we want to look for rowspan or colspan, especialy that span all but a couple cells // at the beginning or end of a row/col, and especially when they occur at the edge of a table? // XXX expose this info via object attributes to AT-SPI // XXX For now debugging descriptions are always on via SHOW_LAYOUT_HEURISTIC // This will allow release trunk builds to be used by testers to refine the algorithm // Change to |#define SHOW_LAYOUT_HEURISTIC DEBUG| before final release #ifdef SHOW_LAYOUT_HEURISTIC #define RETURN_LAYOUT_ANSWER(isLayout, heuristic) \ { *aIsProbablyForLayout = isLayout; \ mLayoutHeuristic = isLayout ? NS_LITERAL_STRING("layout table: ") : NS_LITERAL_STRING("data table: "); \ mLayoutHeuristic += NS_LITERAL_STRING(heuristic); return NS_OK; } #else #define RETURN_LAYOUT_ANSWER(isLayout, heuristic) { *aIsProbablyForLayout = isLayout; return NS_OK; } #endif *aIsProbablyForLayout = PR_FALSE; if (IsDefunct()) return NS_ERROR_FAILURE; nsDocAccessible *docAccessible = GetDocAccessible(); if (docAccessible) { PRUint32 state, extState; docAccessible->GetState(&state, &extState); if (extState & nsIAccessibleStates::EXT_STATE_EDITABLE) { // Need to see all elements while document is being edited RETURN_LAYOUT_ANSWER(PR_FALSE, "In editable document"); } } // Check to see if an ARIA role overrides the role from native markup, // but for which we still expose table semantics (treegrid, for example). PRBool hasNonTableRole = (nsAccUtils::Role(this) != nsIAccessibleRole::ROLE_TABLE); if (hasNonTableRole) { RETURN_LAYOUT_ANSWER(PR_FALSE, "Has role attribute"); } if (mContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::role)) { // Role attribute is present, but overridden roles have already been dealt with. // Only landmarks and other roles that don't override the role from native // markup are left to deal with here. RETURN_LAYOUT_ANSWER(PR_FALSE, "Has role attribute, weak role, and role is table"); } // Check for legitimate data table elements or attributes nsAutoString summary; if ((mContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::summary, summary) && !summary.IsEmpty()) || HasDescendant(NS_LITERAL_STRING("caption"), PR_FALSE) || HasDescendant(NS_LITERAL_STRING("th")) || HasDescendant(NS_LITERAL_STRING("thead")) || HasDescendant(NS_LITERAL_STRING("tfoot")) || HasDescendant(NS_LITERAL_STRING("colgroup"))) { RETURN_LAYOUT_ANSWER(PR_FALSE, "Has caption, summary, th, thead, tfoot or colgroup -- legitimate table structures"); } if (HasDescendant(NS_LITERAL_STRING("table"))) { RETURN_LAYOUT_ANSWER(PR_TRUE, "Has a nested table within it"); } // If only 1 column or only 1 row, it's for layout PRInt32 columns, rows; GetColumnCount(&columns); if (columns <=1) { RETURN_LAYOUT_ANSWER(PR_TRUE, "Has only 1 column"); } GetRowCount(&rows); if (rows <=1) { RETURN_LAYOUT_ANSWER(PR_TRUE, "Has only 1 row"); } // Check for many columns if (columns >= 5) { RETURN_LAYOUT_ANSWER(PR_FALSE, ">=5 columns"); } // Now we know there are 2-4 columns and 2 or more rows // Check to see if there are visible borders on the cells // XXX currently, we just check the first cell -- do we really need to do more? nsCOMPtr<nsIDOMElement> cellElement; nsresult rv = GetCellAt(0, 0, *getter_AddRefs(cellElement)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsCOMPtr<nsIContent> cellContent(do_QueryInterface(cellElement)); NS_ENSURE_TRUE(cellContent, NS_ERROR_FAILURE); nsIFrame *cellFrame = cellContent->GetPrimaryFrame(); if (!cellFrame) { return NS_OK; } nsMargin border; cellFrame->GetBorder(border); if (border.top && border.bottom && border.left && border.right) { RETURN_LAYOUT_ANSWER(PR_FALSE, "Has nonzero border-width on table cell"); } /** * Rules for non-bordered tables with 2-4 columns and 2+ rows from here on forward */ // Check for styled background color across the row // Alternating background color is a common way nsCOMPtr<nsIDOMNodeList> nodeList; nsCOMPtr<nsIDOMElement> tableElt(do_QueryInterface(mContent)); tableElt->GetElementsByTagName(NS_LITERAL_STRING("tr"), getter_AddRefs(nodeList)); NS_ENSURE_TRUE(nodeList, NS_ERROR_FAILURE); PRUint32 length; nodeList->GetLength(&length); nsAutoString color, lastRowColor; for (PRUint32 rowCount = 0; rowCount < length; rowCount ++) { nsCOMPtr<nsIDOMNode> rowNode; nodeList->Item(rowCount, getter_AddRefs(rowNode)); nsCOMPtr<nsIContent> rowContent(do_QueryInterface(rowNode)); nsCOMPtr<nsIDOMCSSStyleDeclaration> styleDecl = nsCoreUtils::GetComputedStyleDeclaration(EmptyString(), rowContent); NS_ENSURE_TRUE(styleDecl, NS_ERROR_FAILURE); lastRowColor = color; styleDecl->GetPropertyValue(NS_LITERAL_STRING("background-color"), color); if (rowCount > 0 && PR_FALSE == lastRowColor.Equals(color)) { RETURN_LAYOUT_ANSWER(PR_FALSE, "2 styles of row background color, non-bordered"); } } // Check for many rows const PRInt32 kMaxLayoutRows = 20; if (rows > kMaxLayoutRows) { // A ton of rows, this is probably for data RETURN_LAYOUT_ANSWER(PR_FALSE, ">= kMaxLayoutRows (20) and non-bordered"); } // Check for very wide table nsAutoString styledWidth; GetComputedStyleValue(EmptyString(), NS_LITERAL_STRING("width"), styledWidth); if (styledWidth.EqualsLiteral("100%")) { RETURN_LAYOUT_ANSWER(PR_TRUE, "<=4 columns and 100% width"); } if (styledWidth.Find(NS_LITERAL_STRING("px"))) { // Hardcoded in pixels nsIFrame *tableFrame = GetFrame(); NS_ENSURE_TRUE(tableFrame , NS_ERROR_FAILURE); nsSize tableSize = tableFrame->GetSize(); nsDocAccessible *docAccessible = GetDocAccessible(); NS_ENSURE_TRUE(docAccessible, NS_ERROR_FAILURE); nsIFrame *docFrame = docAccessible->GetFrame(); NS_ENSURE_TRUE(docFrame , NS_ERROR_FAILURE); nsSize docSize = docFrame->GetSize(); if (docSize.width > 0) { PRInt32 percentageOfDocWidth = (100 * tableSize.width) / docSize.width; if (percentageOfDocWidth > 95) { // 3-4 columns, no borders, not a lot of rows, and 95% of the doc's width // Probably for layout RETURN_LAYOUT_ANSWER(PR_TRUE, "<=4 columns, width hardcoded in pixels and 95% of document width"); } } } // Two column rules if (rows * columns <= 10) { RETURN_LAYOUT_ANSWER(PR_TRUE, "2-4 columns, 10 cells or less, non-bordered"); } if (HasDescendant(NS_LITERAL_STRING("embed")) || HasDescendant(NS_LITERAL_STRING("object")) || HasDescendant(NS_LITERAL_STRING("applet")) || HasDescendant(NS_LITERAL_STRING("iframe"))) { RETURN_LAYOUT_ANSWER(PR_TRUE, "Has no borders, and has iframe, object, applet or iframe, typical of advertisements"); } RETURN_LAYOUT_ANSWER(PR_FALSE, "no layout factor strong enough, so will guess data"); }