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