1  /**************************************************************
2   *
3   * Licensed to the Apache Software Foundation (ASF) under one
4   * or more contributor license agreements.  See the NOTICE file
5   * distributed with this work for additional information
6   * regarding copyright ownership.  The ASF licenses this file
7   * to you under the Apache License, Version 2.0 (the
8   * "License"); you may not use this file except in compliance
9   * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   *
20   *************************************************************/
21  
22  
23  
24  package org.openoffice.setup.SetupData;
25  
26  import org.openoffice.setup.InstallData;
27  import org.openoffice.setup.Util.ModuleCtrl;
28  import java.util.Enumeration;
29  import javax.swing.tree.DefaultMutableTreeNode;
30  import javax.swing.tree.TreeNode;
31  
32  public class DisplayPackageDescription {
33  
34      private PackageDescription data;
35      private int size  = 0;
36  
DisplayPackageDescription(PackageDescription data)37      public DisplayPackageDescription(PackageDescription data) {
38          this.data = data;
39          // Setting default module settings for modules, that are not hidden
40          ModuleCtrl.setDefaultModuleSettings(data);
41          // The size is set dynamically, when a module is selected.
42          // This is better for the nodes, which have a changing size.
43      }
44  
getDescription()45      public String getDescription() {
46          return data.getDescription();
47      }
48  
getSize()49      public int getSize() {
50          return size;     // using local size
51      }
52  
getState()53      public int getState() {
54          return data.getSelectionState();
55      }
56  
getSize(TreeNode peerNode)57      private int getSize(TreeNode peerNode) {
58          // return peerNode.isLeaf() ? data.getAccumulatedSize() : data.getSize();
59          // using size from PackageDescription, which is pkgSize (and that is defined in xpd file)
60          return data.getSize();
61      }
62  
setState(TreeNode node, int newState)63      public void setState(TreeNode node, int newState) {
64          if ((data.getSelectionState() != PackageDescription.IGNORE) && data.isOptional()) {
65              data.setSelectionState(newState);
66          }
67  
68          if (!node.isLeaf()) {
69              size = data.getSize();  // -> that is the value defined in xpd file
70  
71              for (Enumeration e = node.children(); e.hasMoreElements();) {
72                  TreeNode child = (TreeNode)e.nextElement();
73                  DisplayPackageDescription childInfo = getInfo(child);
74  
75                  childInfo.setState(child, newState);
76  
77                  if (childInfo.isSelected())   {
78                      size += childInfo.getSize(child);
79                  }
80              }
81          } else if (isSelected()) {
82              size = data.getSize();  // -> that is the value defined in xpd file
83          }
84      }
85  
toggleState(TreeNode node)86      public void toggleState(TreeNode node) {
87  
88          int state = data.getSelectionState();
89  
90          if (state != PackageDescription.IGNORE) {
91  
92              if (state == PackageDescription.REMOVE) {
93                  setState(node, PackageDescription.DONT_REMOVE);
94              } else if ((state == PackageDescription.DONT_REMOVE) || (state == PackageDescription.REMOVE_SOME)) {
95                  setState(node, PackageDescription.REMOVE );
96              } else if ((state == PackageDescription.DONT_INSTALL) || (state == PackageDescription.INSTALL_SOME)) {
97                  setState(node, PackageDescription.INSTALL);
98              } else {
99                  setState(node, PackageDescription.DONT_INSTALL);
100              }
101  
102              if (!node.isLeaf()) {
103                  updateState(node);
104              }
105  
106              try {
107                  TreeNode parent = node.getParent();
108                  DisplayPackageDescription parentInfo = getInfo(parent);
109  
110                  parentInfo.updateState(parent);
111                  try {
112                      TreeNode grandpa = parent.getParent();
113                      DisplayPackageDescription grandpaInfo = getInfo(grandpa);
114  
115                      grandpaInfo.updateState(grandpa);
116                  } catch (java.lang.IllegalArgumentException e) {
117                      /* ignore */
118                  }
119  
120              } catch (java.lang.IllegalArgumentException e) {
121                  /* ignore */
122              }
123          }
124      }
125  
updateState(TreeNode node)126      public void updateState(TreeNode node)
127      {
128          int state = PackageDescription.DONT_KNOW;
129          InstallData installdata = InstallData.getInstance();
130          size = data.getSize();  // -> that is the value defined in xpd file
131  
132          for (Enumeration e = node.children(); e.hasMoreElements();) {
133              TreeNode child = (TreeNode) e.nextElement();
134              DisplayPackageDescription childInfo = getInfo(child);
135  
136              int childState = childInfo.getState();
137  
138              if ((state == PackageDescription.DONT_KNOW) || (state == PackageDescription.IGNORE)) {
139                  state = childState;
140              } else if ((state != childState) && (childState != PackageDescription.IGNORE)) {
141                  if ( installdata.isUninstallationMode() ) {
142                      state = PackageDescription.REMOVE_SOME;
143                  } else {
144                      state = PackageDescription.INSTALL_SOME;
145                  }
146              }
147              if (childInfo.isSelected()) {
148                  size += childInfo.getSize(child);
149              }
150          }
151  
152          data.setSelectionState(state);
153  
154      }
155  
updateSize(TreeNode node)156      public void updateSize(TreeNode node)
157      {
158          size = data.getSize();  // -> that is the value defined in xpd file
159  
160          for (Enumeration e = node.children(); e.hasMoreElements();) {
161              TreeNode child = (TreeNode) e.nextElement();
162              DisplayPackageDescription childInfo = getInfo(child);
163              if (childInfo.isSelected()) {
164                  size += childInfo.getSize(child);
165              }
166          }
167      }
168  
toString()169      public String toString() {
170          return data.getName();
171      }
172  
is(Object o)173      static public boolean is(Object o) {
174          return (o != null)
175              && (o.getClass().getName().equals("org.openoffice.setup.SetupData.DisplayPackageDescription"));
176      }
177  
isSelected()178      public boolean isSelected() {
179          int state = data.getSelectionState();
180          return     (state == PackageDescription.INSTALL) || (state == PackageDescription.INSTALL_SOME)
181                  || (state == PackageDescription.REMOVE)  || (state == PackageDescription.REMOVE_SOME);
182      }
183  
getInfo(TreeNode node)184      private DisplayPackageDescription getInfo(TreeNode node) throws java.lang.IllegalArgumentException {
185          if (node == null) {
186              throw new java.lang.IllegalArgumentException();
187          }
188  
189          DisplayPackageDescription info = (DisplayPackageDescription)((DefaultMutableTreeNode)node).getUserObject();
190          if ((info != null) && is(info)) {
191              return info;
192          } else {
193              throw new java.lang.IllegalArgumentException();
194          }
195      }
196  }
197