| /* |
| * Copyright 2000-2009 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.uiDesigner.radComponents; |
| |
| import com.intellij.openapi.util.Comparing; |
| import com.intellij.psi.codeStyle.JavaCodeStyleManager; |
| import com.intellij.psi.codeStyle.SuggestedNameInfo; |
| import com.intellij.psi.codeStyle.VariableKind; |
| import com.intellij.ui.JBColor; |
| import com.intellij.uiDesigner.FormEditingUtil; |
| import com.intellij.uiDesigner.ModuleProvider; |
| import com.intellij.uiDesigner.UIFormXmlConstants; |
| import com.intellij.uiDesigner.XmlWriter; |
| import com.intellij.uiDesigner.compiler.Utils; |
| import com.intellij.uiDesigner.lw.IButtonGroup; |
| import com.intellij.uiDesigner.lw.IComponent; |
| import com.intellij.uiDesigner.lw.IRootContainer; |
| import com.intellij.uiDesigner.lw.LwInspectionSuppression; |
| import com.intellij.util.ui.UIUtil; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Locale; |
| |
| /** |
| * @author Anton Katilin |
| * @author Vladimir Kondratyev |
| */ |
| public final class RadRootContainer extends RadContainer implements IRootContainer { |
| private String myClassToBind; |
| private String myMainComponentBinding; |
| private Locale myStringDescriptorLocale; |
| private final List<RadButtonGroup> myButtonGroups = new ArrayList<RadButtonGroup>(); |
| private final List<LwInspectionSuppression> myInspectionSuppressions = new ArrayList<LwInspectionSuppression>(); |
| |
| public RadRootContainer(final ModuleProvider module, final String id) { |
| super(module, JPanel.class, id); |
| getDelegee().setBackground(new JBColor(Color.WHITE, UIUtil.getListBackground())); |
| } |
| |
| /** |
| * Always returns <code>false</code> because root group isn't selectable. |
| */ |
| public boolean isSelected() { |
| return false; |
| } |
| |
| /** |
| * <code>RadRootContainer</code> is not selectable |
| */ |
| public void setSelected(final boolean ignored) { } |
| |
| /** |
| * @return full qualified name of the class. If there is no bound class |
| * then the method returns <code>null</code>. |
| */ |
| @Nullable |
| public String getClassToBind(){ |
| return myClassToBind; |
| } |
| |
| public void setClassToBind(final String classToBind){ |
| myClassToBind = classToBind; |
| } |
| |
| public String getMainComponentBinding(){ |
| return myMainComponentBinding; |
| } |
| |
| public void setMainComponentBinding(final String mainComponentBinding){ |
| myMainComponentBinding = mainComponentBinding; |
| } |
| |
| public void write(final XmlWriter writer) { |
| writer.startElement("form", Utils.FORM_NAMESPACE); |
| try{ |
| writer.addAttribute("version", 1); |
| final String classToBind = getClassToBind(); |
| if (classToBind != null){ |
| writer.addAttribute("bind-to-class", classToBind); |
| } |
| final String mainComponentBinding = getMainComponentBinding(); |
| if (mainComponentBinding != null) { |
| writer.addAttribute("stored-main-component-binding", mainComponentBinding); |
| } |
| writeChildrenImpl(writer); |
| if (myButtonGroups.size() > 0) { |
| writer.startElement(UIFormXmlConstants.ELEMENT_BUTTON_GROUPS); |
| for(RadButtonGroup group: myButtonGroups) { |
| group.write(writer); |
| } |
| writer.endElement(); |
| } |
| writeInspectionSuppressions(writer); |
| } |
| finally{ |
| writer.endElement(); // form |
| } |
| } |
| |
| private void writeInspectionSuppressions(final XmlWriter writer) { |
| if (myInspectionSuppressions.size() > 0) { |
| writer.startElement(UIFormXmlConstants.ELEMENT_INSPECTION_SUPPRESSIONS); |
| for(LwInspectionSuppression suppression: myInspectionSuppressions) { |
| writer.startElement(UIFormXmlConstants.ELEMENT_SUPPRESS); |
| writer.addAttribute(UIFormXmlConstants.ATTRIBUTE_INSPECTION, suppression.getInspectionId()); |
| if (suppression.getComponentId() != null) { |
| writer.addAttribute(UIFormXmlConstants.ATTRIBUTE_ID, suppression.getComponentId()); |
| } |
| writer.endElement(); |
| } |
| writer.endElement(); |
| } |
| } |
| |
| @Override public void writeConstraints(final XmlWriter writer) { |
| writer.startElement("constraints"); |
| try { |
| myLayoutManager.writeChildConstraints(writer, this); |
| } finally { |
| writer.endElement(); // constraints |
| } |
| } |
| |
| @Override @Nullable |
| protected RadLayoutManager createInitialLayoutManager() { |
| return RadXYLayoutManager.INSTANCE; |
| } |
| |
| public void setGroupForComponent(@NotNull RadComponent component, @Nullable RadButtonGroup value) { |
| for(int i=myButtonGroups.size()-1; i >= 0; i--) { |
| RadButtonGroup group = myButtonGroups.get(i); |
| if (group == value) { |
| group.add(component); |
| } |
| else { |
| group.remove(component); |
| if (group.isEmpty()) { |
| myButtonGroups.remove(i); |
| } |
| } |
| } |
| } |
| |
| public RadButtonGroup[] getButtonGroups() { |
| return myButtonGroups.toArray(new RadButtonGroup[myButtonGroups.size()]); |
| } |
| |
| public String suggestGroupName() { |
| int groupNumber = 1; |
| group: while(true) { |
| @NonNls String suggestedName = "buttonGroup" + groupNumber; |
| // we don't have a project in snapshooter |
| if (getModule() != null) { |
| SuggestedNameInfo nameInfo = |
| JavaCodeStyleManager.getInstance(getProject()).suggestVariableName(VariableKind.FIELD, suggestedName, null, null); |
| suggestedName = nameInfo.names[0]; |
| } |
| for(RadButtonGroup group: myButtonGroups) { |
| if (group.getName().equals(suggestedName)) { |
| groupNumber++; |
| continue group; |
| } |
| } |
| return suggestedName; |
| } |
| } |
| |
| public RadButtonGroup createGroup(final String groupName) { |
| RadButtonGroup group = new RadButtonGroup(groupName); |
| myButtonGroups.add(group); |
| return group; |
| } |
| |
| public void deleteGroup(RadButtonGroup group) { |
| myButtonGroups.remove(group); |
| } |
| |
| public void setButtonGroups(final IButtonGroup[] buttonGroups) { |
| myButtonGroups.clear(); |
| for(IButtonGroup lwGroup: buttonGroups) { |
| final String[] componentIds = lwGroup.getComponentIds(); |
| if (componentIds.length > 0) { |
| RadButtonGroup group = createGroup(lwGroup.getName()); |
| group.setBound(lwGroup.isBound()); |
| group.addComponentIds(componentIds); |
| } |
| } |
| } |
| |
| public List<RadComponent> getGroupContents(final RadButtonGroup group) { |
| ArrayList<RadComponent> result = new ArrayList<RadComponent>(); |
| for(String id: group.getComponentIds()) { |
| RadComponent component = (RadComponent) FormEditingUtil.findComponent(this, id); |
| if (component != null) { |
| result.add(component); |
| } |
| } |
| return result; |
| } |
| |
| public String getButtonGroupName(IComponent component) { |
| for(RadButtonGroup group: myButtonGroups) { |
| if (group.contains((RadComponent)component)) { |
| return group.getName(); |
| } |
| } |
| return null; |
| } |
| |
| public String[] getButtonGroupComponentIds(String groupName) { |
| for(RadButtonGroup group: myButtonGroups) { |
| if (group.getName().equals(groupName)) { |
| return group.getComponentIds(); |
| } |
| } |
| throw new IllegalArgumentException("Cannot find group " + groupName); |
| } |
| |
| public Locale getStringDescriptorLocale() { |
| return myStringDescriptorLocale; |
| } |
| |
| public void setStringDescriptorLocale(final Locale stringDescriptorLocale) { |
| myStringDescriptorLocale = stringDescriptorLocale; |
| } |
| |
| public void suppressInspection(String inspectionId, @Nullable RadComponent component) { |
| for(int i=myInspectionSuppressions.size()-1; i >= 0; i--) { |
| LwInspectionSuppression suppression = myInspectionSuppressions.get(i); |
| if (suppression.getInspectionId().equals(inspectionId)) { |
| if (component != null && (component.getId().equals(suppression.getComponentId()) || suppression.getComponentId() == null)) { |
| return; |
| } |
| if (component == null && suppression.getComponentId() != null) { |
| myInspectionSuppressions.remove(i); |
| } |
| } |
| } |
| myInspectionSuppressions.add(new LwInspectionSuppression(inspectionId, component == null ? null : component.getId())); |
| } |
| |
| public boolean isInspectionSuppressed(final String inspectionId, final String componentId) { |
| for(LwInspectionSuppression suppression: myInspectionSuppressions) { |
| if ((suppression.getComponentId() == null || suppression.getComponentId().equals(componentId)) && |
| suppression.getInspectionId().equals(inspectionId)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public LwInspectionSuppression[] getInspectionSuppressions() { |
| return myInspectionSuppressions.toArray(new LwInspectionSuppression[myInspectionSuppressions.size()]); |
| } |
| |
| public void setInspectionSuppressions(final LwInspectionSuppression[] inspectionSuppressions) { |
| myInspectionSuppressions.clear(); |
| Collections.addAll(myInspectionSuppressions, inspectionSuppressions); |
| } |
| |
| public void removeInspectionSuppression(final LwInspectionSuppression suppression) { |
| for(LwInspectionSuppression existing: myInspectionSuppressions) { |
| if (existing.getInspectionId().equals(suppression.getInspectionId()) && |
| Comparing.equal(existing.getComponentId(), suppression.getComponentId())) { |
| myInspectionSuppressions.remove(existing); |
| break; |
| } |
| } |
| } |
| } |