IDEA-40712
[idea/community.git] / plugins / ui-designer / src / com / intellij / uiDesigner / designSurface / GridSpanInsertProcessor.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.uiDesigner.designSurface;
17
18 import com.intellij.uiDesigner.core.GridConstraints;
19 import com.intellij.uiDesigner.radComponents.RadAbstractGridLayoutManager;
20 import com.intellij.uiDesigner.radComponents.RadComponent;
21 import com.intellij.uiDesigner.radComponents.RadContainer;
22
23 import java.awt.*;
24
25 /**
26  * @author Alexander Lobas
27  */
28 public class GridSpanInsertProcessor {
29   private final RadContainer myContainer;
30   private final RadAbstractGridLayoutManager myLayoutManager;
31   private final int myRow;
32   private final int myColumn;
33   private GridInsertMode myMode;
34   private RadComponent myInsertCellComponent;
35
36   public GridSpanInsertProcessor(RadContainer container,
37                                  int insertRow,
38                                  int insertColumn,
39                                  GridInsertMode mode,
40                                  ComponentDragObject dragObject) {
41     myContainer = container;
42     myLayoutManager = container.getGridLayoutManager();
43     myRow = insertRow;
44     myColumn = insertColumn;
45
46     int[] vGridLines = myLayoutManager.getVerticalGridLines(container);
47     int[] hGridLines = myLayoutManager.getHorizontalGridLines(container);
48
49     RadComponent component = RadAbstractGridLayoutManager.getComponentAtGrid(container, insertRow, insertColumn);
50
51     if (component != null) {
52       int lastColIndex = insertColumn + dragObject.getColSpan(0);
53       if (lastColIndex > vGridLines.length - 1) {
54         lastColIndex = insertColumn + 1;
55       }
56
57       int lastRowIndex = insertRow + dragObject.getRowSpan(0);
58       if (lastRowIndex > hGridLines.length - 1) {
59         lastRowIndex = insertRow + 1;
60       }
61
62       Rectangle bounds = component.getBounds();
63       bounds.translate(-vGridLines[insertColumn], -hGridLines[insertRow]);
64
65       int spaceToRight = vGridLines[lastColIndex] - vGridLines[insertColumn] - (bounds.x + bounds.width);
66       int spaceBelow = hGridLines[lastRowIndex] - hGridLines[insertRow] - (bounds.y + bounds.height);
67
68       if (mode == GridInsertMode.RowBefore && bounds.y > GridInsertLocation.INSERT_RECT_MIN_SIZE) {
69         myMode = GridInsertMode.RowBefore;
70         myInsertCellComponent = component;
71       }
72       else if (mode == GridInsertMode.RowAfter && spaceBelow > GridInsertLocation.INSERT_RECT_MIN_SIZE) {
73         myMode = GridInsertMode.RowAfter;
74       }
75       else if (mode == GridInsertMode.ColumnBefore && bounds.x > GridInsertLocation.INSERT_RECT_MIN_SIZE) {
76         myMode = GridInsertMode.ColumnBefore;
77         myInsertCellComponent = component;
78       }
79       else if (mode == GridInsertMode.ColumnAfter && spaceToRight > GridInsertLocation.INSERT_RECT_MIN_SIZE) {
80         myMode = GridInsertMode.ColumnAfter;
81       }
82     }
83   }
84
85   public void doBefore(int newCell) {
86     if (myMode == GridInsertMode.RowBefore) {
87       int oldRow = myInsertCellComponent.getConstraints().getRow();
88       int columns = myLayoutManager.getGridColumnCount(myContainer);
89       for (int i = 0; i < columns; i++) {
90         if (i != myColumn) {
91           RadComponent component = RadAbstractGridLayoutManager.getComponentAtGrid(myContainer, oldRow, i);
92           if (component != null) {
93             GridConstraints constraints = component.getConstraints();
94
95             if (constraints.getRow() == oldRow) {
96               GridConstraints oldConstraints = (GridConstraints)constraints.clone();
97               constraints.setRow(newCell);
98               constraints.setRowSpan(constraints.getRowSpan() + oldRow - newCell);
99               component.fireConstraintsChanged(oldConstraints);
100             }
101
102             i = constraints.getColumn() + constraints.getColSpan() - 1;
103           }
104         }
105       }
106     }
107     else if (myMode == GridInsertMode.ColumnBefore) {
108       int oldColumn = myInsertCellComponent.getConstraints().getColumn();
109       int rows = myLayoutManager.getGridRowCount(myContainer);
110       for (int i = 0; i < rows; i++) {
111         if (i != myRow) {
112           RadComponent component = RadAbstractGridLayoutManager.getComponentAtGrid(myContainer, i, oldColumn);
113           if (component != null) {
114             GridConstraints constraints = component.getConstraints();
115
116             if (constraints.getColumn() == oldColumn) {
117               GridConstraints oldConstraints = (GridConstraints)constraints.clone();
118               constraints.setColumn(newCell);
119               constraints.setColSpan(constraints.getColSpan() + oldColumn - newCell);
120               component.fireConstraintsChanged(oldConstraints);
121             }
122
123             i = constraints.getRow() + constraints.getRowSpan() - 1;
124           }
125         }
126       }
127     }
128   }
129
130   public void doAfter(int newCell) {
131     if (myMode == GridInsertMode.RowAfter) {
132       int columns = myLayoutManager.getGridColumnCount(myContainer);
133       for (int i = 0; i < columns; i++) {
134         if (i != myColumn) {
135           RadComponent component = RadAbstractGridLayoutManager.getComponentAtGrid(myContainer, myRow, i);
136           if (component != null) {
137             GridConstraints constraints = component.getConstraints();
138             int endRow = constraints.getRow() + constraints.getRowSpan() - 1;
139
140             if (endRow == myRow) {
141               GridConstraints oldConstraints = (GridConstraints)constraints.clone();
142               constraints.setRowSpan(constraints.getRowSpan() + newCell - myRow);
143               component.fireConstraintsChanged(oldConstraints);
144             }
145
146             i = constraints.getColumn() + constraints.getColSpan() - 1;
147           }
148         }
149       }
150     }
151     else if (myMode == GridInsertMode.ColumnAfter) {
152       int rows = myLayoutManager.getGridRowCount(myContainer);
153       for (int i = 0; i < rows; i++) {
154         if (i != myRow) {
155           RadComponent component = RadAbstractGridLayoutManager.getComponentAtGrid(myContainer, i, myColumn);
156           if (component != null) {
157             GridConstraints constraints = component.getConstraints();
158             int endColumn = constraints.getColumn() + constraints.getColSpan() - 1;
159
160             if (endColumn == myColumn) {
161               GridConstraints oldConstraints = (GridConstraints)constraints.clone();
162               constraints.setColSpan(constraints.getColSpan() + newCell - myColumn);
163               component.fireConstraintsChanged(oldConstraints);
164             }
165
166             i = constraints.getRow() + constraints.getRowSpan() - 1;
167           }
168         }
169       }
170     }
171   }
172 }