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-2006 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.progress.spi;
043:
044: import javax.swing.DefaultListModel;
045: import javax.swing.DefaultListSelectionModel;
046: import javax.swing.event.ListDataListener;
047: import javax.swing.event.ListSelectionListener;
048: import org.netbeans.progress.module.*;
049:
050: /**
051: *
052: * @author Milos Kleint (mkleint@netbeans.org)
053: */
054: public final class TaskModel {
055: private DefaultListSelectionModel selectionModel;
056: private DefaultListModel model;
057: private InternalHandle explicit;
058:
059: /** Creates a new instance of TaskModel */
060: public TaskModel() {
061: selectionModel = new DefaultListSelectionModel();
062: model = new DefaultListModel();
063: }
064:
065: public void addHandle(InternalHandle handle) {
066: model.addElement(handle);
067: if (handle.isUserInitialized() && explicit == null) {
068: selectionModel.setSelectionInterval(model.size() - 1, model
069: .size() - 1);
070: }
071: }
072:
073: public void removeHandle(InternalHandle handle) {
074: if (explicit == handle) {
075: explicit = null;
076: }
077: int index = model.indexOf(handle);
078: if (selectionModel.getMinSelectionIndex() == index) {
079: // if we are removing the handle that is selected, do tricks with selection
080: // too figure out which one should be sleected now
081: changeSelection(index);
082: }
083: InternalHandle selectedHandle = getSelectedHandle();
084: model.removeElement(handle);
085: if (selectedHandle != null) {
086: selectionModel.setSelectionInterval(model
087: .indexOf(selectedHandle), model
088: .indexOf(selectedHandle));
089: } else {
090: //TODO what to do here?
091: selectionModel.clearSelection();
092: }
093:
094: }
095:
096: /**
097: * if we are removing the handle that is selected, do tricks with selection
098: * too figure out which one should be sleected no
099: */
100: private void changeSelection(int current) {
101: InternalHandle last = null;
102: for (int i = 0; i < model.size(); i++) {
103: if (current != i) {
104: InternalHandle handle = (InternalHandle) model
105: .getElementAt(i);
106: if (handle.isUserInitialized()) {
107: last = handle;
108: } else if (last == null) {
109: last = handle;
110: }
111: }
112: }
113: if (last != null) {
114: selectionModel.setSelectionInterval(model.indexOf(last),
115: model.indexOf(last));
116: } else {
117: selectionModel.clearSelection();
118: }
119:
120: }
121:
122: public void explicitlySelect(InternalHandle handle) {
123: explicit = handle;
124: int index = model.indexOf(explicit);
125: if (index == -1) {
126: //TODO what?
127: }
128: selectionModel.setSelectionInterval(index, index);
129: }
130:
131: public InternalHandle getExplicitSelection() {
132: return explicit;
133: }
134:
135: public int getSize() {
136: return model.size();
137: }
138:
139: public InternalHandle[] getHandles() {
140: InternalHandle[] handles = new InternalHandle[model.size()];
141: model.copyInto(handles);
142: return handles;
143: }
144:
145: public InternalHandle getSelectedHandle() {
146: int select = selectionModel.getMinSelectionIndex();
147: if (select != -1) {
148: if (select >= 0 && select < model.size()) {
149: return (InternalHandle) model
150: .getElementAt(selectionModel
151: .getMinSelectionIndex());
152: }
153: }
154: return null;
155: }
156:
157: public void addListSelectionListener(ListSelectionListener listener) {
158: selectionModel.addListSelectionListener(listener);
159: }
160:
161: public void removeListSelectionListener(
162: ListSelectionListener listener) {
163: selectionModel.removeListSelectionListener(listener);
164: }
165:
166: public void addListDataListener(ListDataListener listener) {
167: model.addListDataListener(listener);
168: }
169:
170: public void removeListDataListener(ListDataListener listener) {
171: model.removeListDataListener(listener);
172: }
173: }
|