From 2e3eb9951d6c4318e436d8bd2f8400a2f0107a97 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Tue, 24 Apr 2012 21:53:05 +0400 Subject: [PATCH] GridLayout --- .../layout/GridLayoutOperation.java | 56 +++++++++++++++++++ .../layout/TableLayoutOperation.java | 11 +++- .../layout/grid/GridOperation.java | 6 ++ .../layout/grid/RadGridLayoutComponent.java | 27 +++++++++ .../layout/table/RadCaptionTableColumn.java | 29 ++++++++-- .../layout/table/RadTableLayoutComponent.java | 32 +++++++---- .../designer/model/views-meta-model.xml | 14 ++--- 7 files changed, 152 insertions(+), 23 deletions(-) diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/GridLayoutOperation.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/GridLayoutOperation.java index 1048cfa3ab1e..860b5bd7c9ed 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/GridLayoutOperation.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/GridLayoutOperation.java @@ -16,8 +16,13 @@ package com.intellij.android.designer.designSurface.layout; import com.intellij.android.designer.designSurface.layout.grid.GridOperation; +import com.intellij.android.designer.model.RadViewComponent; +import com.intellij.android.designer.model.grid.GridInfo; +import com.intellij.android.designer.model.grid.GridInsertType; +import com.intellij.android.designer.model.layout.grid.RadGridLayoutComponent; import com.intellij.designer.designSurface.OperationContext; import com.intellij.designer.model.RadComponent; +import org.jetbrains.annotations.Nullable; /** * @author Alexander Lobas @@ -29,6 +34,57 @@ public class GridLayoutOperation extends GridOperation { @Override public void execute() throws Exception { + GridInfo gridInfo = getGridInfo(); + + RadViewComponent container = (RadViewComponent)myContainer; + RadComponent editComponent = myComponents.get(0); + + if (myInsertType == GridInsertType.in_cell) { + if (myRow <= gridInfo.lastRow && myColumn <= gridInfo.lastColumn) { + RadComponent insertBefore = getNextComponent(myRow, myColumn); + + if (editComponent != insertBefore) { + execute(myContext, container, myComponents, (RadViewComponent)insertBefore); + } + RadGridLayoutComponent.setCellIndex(editComponent, myRow, myColumn); + } + else { + execute(myContext, container, myComponents, null); + RadGridLayoutComponent.setCellIndex(editComponent, myRow, myColumn); + RadGridLayoutComponent.setGridSize(container, + Math.max(myRow + 1, gridInfo.lastRow + 1), + Math.max(myColumn + 1, gridInfo.lastColumn + 1)); + } + } + // TODO: Auto-generated method stub } + + @Nullable + private RadComponent getNextComponent(int row, int column) { + GridInfo gridInfo = getGridInfo(); + RadComponent[][] components = gridInfo.components; + + RadComponent[] rowComponents = components[row]; + + for (int i = column + 1; i < rowComponents.length; i++) { + RadComponent component = rowComponents[i]; + if (component != null) { + return component; + } + } + + for (int i = row + 1; i < components.length; i++) { + rowComponents = components[i]; + + for (int j = 0; i < rowComponents.length; j++) { + RadComponent component = rowComponents[j]; + if (component != null) { + return component; + } + } + } + + return null; + } } \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/TableLayoutOperation.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/TableLayoutOperation.java index f248b0273ff3..7db249349872 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/TableLayoutOperation.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/TableLayoutOperation.java @@ -184,7 +184,16 @@ public class TableLayoutOperation extends GridOperation { RadComponent cellComponent = rowComponents[j]; if (cellComponent != null) { - RadTableLayoutComponent.setCellIndex(cellComponent, j + 1); + if (j == startColumn && startColumn > 0 && cellComponent == rowComponents[j - 1]) { + RadTableLayoutComponent.setCellSpan(cellComponent, RadTableLayoutComponent.getCellSpan(cellComponent) + 1); + } + else { + RadTableLayoutComponent.setCellIndex(cellComponent, j + 1); + } + + while (j + 1 < rowComponents.length && cellComponent == rowComponents[j + 1]) { + j++; + } } } } diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/grid/GridOperation.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/grid/GridOperation.java index 4e519cbf4dca..5931c91d3bc6 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/grid/GridOperation.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/layout/grid/GridOperation.java @@ -150,6 +150,12 @@ public abstract class GridOperation extends AbstractEditOperation { @Override public abstract void execute() throws Exception; + ////////////////////////////////////////////////////////////////////////////////////////// + // + // Grid + // + ////////////////////////////////////////////////////////////////////////////////////////// + private static final int CROSS_SIZE = 10; private void calculateGridInfo() { diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/layout/grid/RadGridLayoutComponent.java b/plugins/android-designer/src/com/intellij/android/designer/model/layout/grid/RadGridLayoutComponent.java index 4b722d4e0fec..4f9e6f1f1ff3 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/layout/grid/RadGridLayoutComponent.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/layout/grid/RadGridLayoutComponent.java @@ -16,11 +16,14 @@ package com.intellij.android.designer.model.layout.grid; import com.android.ide.common.rendering.api.ViewInfo; +import com.intellij.android.designer.model.ModelParser; import com.intellij.android.designer.model.RadViewComponent; import com.intellij.android.designer.model.RadViewContainer; import com.intellij.android.designer.model.grid.GridInfo; import com.intellij.android.designer.model.grid.IGridProvider; import com.intellij.designer.model.RadComponent; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.psi.xml.XmlTag; import java.awt.*; import java.lang.reflect.Field; @@ -170,4 +173,28 @@ public class RadGridLayoutComponent extends RadViewContainer implements IGridPro return cellInfo; } + + public static void setGridSize(final RadViewComponent container, final int rowCount, final int columnCount) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + XmlTag tag = container.getTag(); + tag.setAttribute("android:rowCount", Integer.toString(rowCount)); + tag.setAttribute("android:columnCount", Integer.toString(columnCount)); + } + }); + } + + public static void setCellIndex(final RadComponent component, final int row, final int column) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + XmlTag tag = ((RadViewComponent)component).getTag(); + tag.setAttribute("android:layout_row", Integer.toString(row)); + tag.setAttribute("android:layout_column", Integer.toString(column)); + ModelParser.deleteAttribute(tag, "android:layout_rowSpan"); + ModelParser.deleteAttribute(tag, "android:layout_columnSpan"); + } + }); + } } \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadCaptionTableColumn.java b/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadCaptionTableColumn.java index 48bf5c11e4c0..224293f8b98a 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadCaptionTableColumn.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadCaptionTableColumn.java @@ -19,6 +19,8 @@ import com.intellij.android.designer.model.grid.GridInfo; import com.intellij.android.designer.model.grid.RadCaptionColumn; import com.intellij.designer.model.RadComponent; +import java.util.Arrays; + /** * @author Alexander Lobas */ @@ -34,16 +36,35 @@ public class RadCaptionTableColumn extends RadCaptionColumn 0 && component == rowComponents[myIndex - 1]) { + RadTableLayoutComponent.setCellSpan(component, RadTableLayoutComponent.getCellSpan(component) - 1); + } + else { + Arrays.fill(rowComponents, myIndex, nextIndex, null); + + RadComponent parent = component.getParent(); + component.delete(); + if (parent.getChildren().isEmpty()) { + parent.delete(); + } + } } - for (int i = myIndex + 1; i < rowComponents.length; i++) { + for (int i = nextIndex; i < rowComponents.length; i++) { RadComponent cellComponent = rowComponents[i]; - if (cellComponent != null) { RadTableLayoutComponent.setCellIndex(cellComponent, i - 1); + + while (i + 1 < rowComponents.length && cellComponent == rowComponents[i + 1]) { + i++; + } } } } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadTableLayoutComponent.java b/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadTableLayoutComponent.java index a2e15ceac8c3..c3e0cff254a9 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadTableLayoutComponent.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/layout/table/RadTableLayoutComponent.java @@ -169,17 +169,6 @@ public class RadTableLayoutComponent extends RadViewContainer implements IGridPr return components; } - public static void setCellIndex(final RadComponent component, final int column) { - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - XmlTag tag = ((RadViewComponent)component).getTag(); - tag.setAttribute("android:layout_column", Integer.toString(column)); - ModelParser.deleteAttribute(tag, "android:layout_span"); - } - }); - } - private static int getCellIndex(RadComponent component) { try { String column = ((RadViewComponent)component).getTag().getAttributeValue("android:layout_column"); @@ -199,4 +188,25 @@ public class RadTableLayoutComponent extends RadViewContainer implements IGridPr return 1; } } + + public static void setCellIndex(final RadComponent component, final int column) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + XmlTag tag = ((RadViewComponent)component).getTag(); + tag.setAttribute("android:layout_column", Integer.toString(column)); + ModelParser.deleteAttribute(tag, "android:layout_span"); + } + }); + } + + public static void setCellSpan(final RadComponent component, final int span) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + XmlTag tag = ((RadViewComponent)component).getTag(); + tag.setAttribute("android:layout_span", Integer.toString(span)); + } + }); + } } \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/views-meta-model.xml b/plugins/android-designer/src/com/intellij/android/designer/model/views-meta-model.xml index ab501ad6539b..a655f11ac2a6 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/views-meta-model.xml +++ b/plugins/android-designer/src/com/intellij/android/designer/model/views-meta-model.xml @@ -1163,6 +1163,13 @@ + + + + + + + @@ -1218,13 +1225,6 @@ - - - - - - - \ No newline at end of file