001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.visualweb.insync.action;
043:
044: import com.sun.rave.designtime.DesignBean;
045: import com.sun.rave.designtime.DesignContext;
046: import com.sun.rave.designtime.DesignEvent;
047: import org.netbeans.modules.visualweb.insync.live.LiveUnit;
048: import org.netbeans.modules.visualweb.insync.models.FacesModel;
049: import org.netbeans.modules.visualweb.spi.designtime.idebridge.action.AbstractDesignBeanAction;
050: import java.util.ArrayList;
051: import java.util.Collections;
052: import java.util.List;
053: import javax.swing.Action;
054: import javax.swing.JMenuItem;
055: import javax.swing.event.ChangeListener;
056: import org.openide.ErrorManager;
057: import org.openide.awt.Actions;
058: import org.openide.cookies.EditCookie;
059: import org.openide.filesystems.FileObject;
060: import org.openide.loaders.DataObject;
061: import org.openide.loaders.DataObjectNotFoundException;
062: import org.openide.util.HelpCtx;
063: import org.openide.util.Lookup;
064: import org.openide.util.NbBundle;
065:
066: /**
067: * Action allowing to edit the event handlers.
068: *
069: * @author Peter Zavadsky
070: * @author Tor Norbye (old functionality implementation -> performActionAt impl)
071: */
072: public class EditEventHandlerAction extends AbstractDesignBeanAction {
073:
074: /** Creates a new instance of EditEventHandlerAction. */
075: public EditEventHandlerAction() {
076: }
077:
078: protected String getDisplayName(DesignBean[] designBeans) {
079: List handlersAndLabels = getHandlersAndLabels(designBeans);
080: String name;
081: // XXX Missused list, 2 items mean 1 handler = 1 handler + 1 label.
082: if (handlersAndLabels.size() == 2) {
083: name = (String) handlersAndLabels.get(1);
084: } else {
085: name = null;
086: }
087: if (name == null) {
088: return NbBundle.getMessage(EditEventHandlerAction.class,
089: "LBL_EditEventHandlerAction");
090: }
091: return NbBundle.getMessage(EditEventHandlerAction.class,
092: "LBL_EditEventHandlerActionName", name);
093: }
094:
095: protected String getIconBase(DesignBean[] designBeans) {
096: return null;
097: }
098:
099: protected boolean isEnabled(DesignBean[] designBeans) {
100: return !getHandlersAndLabels(designBeans).isEmpty();
101: }
102:
103: protected void performAction(DesignBean[] designBeans) {
104: // XXX Strange impl of the Actions.SubMenu(action, model, isPopup). If the model provides one item,
105: // it doesn't call the performAt(0), but this method.
106: new EventHandlersMenuModel(designBeans).performActionAt(0);
107: }
108:
109: protected JMenuItem getMenuPresenter(Action contextAwareAction,
110: Lookup.Result result) {
111: return new Actions.SubMenu(contextAwareAction,
112: new EventHandlersMenuModel(getDesignBeans(result)),
113: false);
114: }
115:
116: protected JMenuItem getPopupPresenter(Action contextAwareAction,
117: Lookup.Result result) {
118: return new Actions.SubMenu(contextAwareAction,
119: new EventHandlersMenuModel(getDesignBeans(result)),
120: true);
121: }
122:
123: private static List getHandlersAndLabels(DesignBean[] designBeans) {
124: if (designBeans.length == 0) {
125: return Collections.EMPTY_LIST;
126: }
127:
128: // XXX TODO take only the first one?
129: // XXX Also very strange List content, mixing apples with pears (DesignEvents and Strings).
130: // EAT: Tor changed it to use a call that takes isHidden into account
131: return FacesModel
132: .getVisibleEventsWithHandlerNames(designBeans[0]);
133: }
134:
135: /** Implementation of the actions submenu model. */
136: private static class EventHandlersMenuModel implements
137: Actions.SubMenuModel {
138:
139: private final DesignBean[] designBeans;
140: private final DesignEvent[] designEvents;
141: private final String[] labels;
142:
143: public EventHandlersMenuModel(DesignBean[] designBeans) {
144: this .designBeans = designBeans;
145:
146: List handlersAndLabels = getHandlersAndLabels(designBeans);
147:
148: List designEventList = new ArrayList();
149: List labelList = new ArrayList();
150:
151: for (int i = 0, max = handlersAndLabels.size(); i < max; i += 2) {
152: DesignEvent event = (DesignEvent) handlersAndLabels
153: .get(i);
154: String label = (String) handlersAndLabels.get(i + 1);
155: designEventList.add(event);
156: labelList.add(label);
157: }
158:
159: this .designEvents = (DesignEvent[]) designEventList
160: .toArray(new DesignEvent[designEventList.size()]);
161: this .labels = (String[]) labelList
162: .toArray(new String[labelList.size()]);
163: }
164:
165: public int getCount() {
166: return designEvents.length;
167: }
168:
169: public String getLabel(int i) {
170: return labels[i];
171: }
172:
173: public HelpCtx getHelpCtx(int i) {
174: // XXX Implement?
175: return null;
176: }
177:
178: public void performActionAt(int i) {
179: if (designBeans.length == 0) {
180: return;
181: }
182:
183: DesignBean bean = designBeans[0];
184: DesignContext context = bean.getDesignContext();
185: // XXX Casting is error-prone.
186: FacesModel facesModel = ((LiveUnit) context).getModel();
187:
188: facesModel.openEventHandler(designEvents[i]);
189: }
190:
191: public void addChangeListener(ChangeListener changeListener) {
192: // this model is not mutable.
193: }
194:
195: public void removeChangeListener(ChangeListener changeListener) {
196: // this model is not mutable.
197: }
198:
199: } // End of EventHandlerMenuModel.
200: }
|