blob: 362096a21572f32df46ddeadbd50290be6be7387 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.tasklist.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.JMenu;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import org.netbeans.modules.tasklist.filter.FilterEditor;
import org.netbeans.modules.tasklist.filter.FilterRepository;
import org.netbeans.modules.tasklist.filter.TaskFilter;
import org.netbeans.modules.tasklist.impl.TaskManagerImpl;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
/**
*
* @author S. Aubrecht
*/
public class FiltersMenuButton extends MenuToggleButton implements PropertyChangeListener {
private TaskManagerImpl taskManager;
/** Creates a new instance of FiltersMenuButton */
public FiltersMenuButton( TaskFilter currentFilter ) {
super( ImageUtilities.loadImageIcon("org/netbeans/modules/tasklist/ui/resources/filter.png", false), ImageUtilities.loadImageIcon("org/netbeans/modules/tasklist/ui/resources/filter_rollover.png", false), 4 ); //NOI18N
taskManager = TaskManagerImpl.getInstance();
updateState( currentFilter );
addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if( !isSelected() ) {
taskManager.observe( taskManager.getScope(), TaskFilter.EMPTY );
} else {
openFilterEditor();
updateState( taskManager.getFilter() );
}
}
});
}
@Override
public void addNotify() {
super.addNotify();
taskManager.addPropertyChangeListener( TaskManagerImpl.PROP_FILTER, this );
}
@Override
public void removeNotify() {
super.removeNotify();
taskManager.removePropertyChangeListener( TaskManagerImpl.PROP_FILTER, this );
}
@Override
protected JPopupMenu getPopupMenu() {
JPopupMenu popup = new JPopupMenu();
fillMenu( popup, null );
return popup;
}
static void fillMenu( JPopupMenu popup, JMenu menu ) {
assert null != popup || null != menu;
FilterRepository filterRep = FilterRepository.getDefault();
TaskManagerImpl tm = TaskManagerImpl.getInstance();
TaskFilter activeFilter = tm.getFilter();
JRadioButtonMenuItem item = new JRadioButtonMenuItem( new CancelFilterAction() );
item.setSelected( TaskFilter.EMPTY.equals( activeFilter ) );
if( null == popup )
menu.add( item );
else
popup.add( item );
if( null == popup )
menu.addSeparator();
else
popup.addSeparator();
List<TaskFilter> allFilters = filterRep.getAllFilters();
for( TaskFilter tf : allFilters ) {
item = new JRadioButtonMenuItem( new SetFilterAction( tf ) );
item.setSelected( activeFilter.equals( tf ) );
if( null == popup )
menu.add( item );
else
popup.add( item );
}
if( allFilters.size() > 0 ) {
if( null == popup )
menu.addSeparator();
else
popup.addSeparator();
}
if( null == popup )
menu.add( new ManageFiltersAction() );
else
popup.add( new ManageFiltersAction() );
}
private static class CancelFilterAction extends AbstractAction {
public CancelFilterAction() {
super( NbBundle.getMessage( FiltersMenuButton.class, "LBL_CancelFilter" ) ); //NOI18N
}
public void actionPerformed(ActionEvent e) {
FilterRepository.getDefault().setActive( null );
try {
FilterRepository.getDefault().save();
} catch( IOException ioE ) {
Logger.getLogger( FiltersMenuButton.class.getName() ).log( Level.INFO, ioE.getMessage(), ioE );
}
TaskManagerImpl tm = TaskManagerImpl.getInstance();
tm.observe( tm.getScope(), TaskFilter.EMPTY );
}
}
private static class SetFilterAction extends AbstractAction {
private TaskFilter filter;
public SetFilterAction( TaskFilter filter ) {
super( filter.getName() );
this.filter = filter;
}
public void actionPerformed(ActionEvent e) {
FilterRepository.getDefault().setActive( filter );
try {
FilterRepository.getDefault().save();
} catch( IOException ioE ) {
Logger.getLogger( FiltersMenuButton.class.getName() ).log( Level.INFO, ioE.getMessage(), ioE );
}
TaskManagerImpl tm = TaskManagerImpl.getInstance();
tm.observe( tm.getScope(), filter );
}
}
private static class ManageFiltersAction extends AbstractAction {
public ManageFiltersAction() {
super( NbBundle.getMessage( FiltersMenuButton.class, "LBL_EditFilters" ) ); //NOI18N
}
public void actionPerformed(ActionEvent arg0) {
openFilterEditor();
}
}
public void propertyChange( PropertyChangeEvent e ) {
updateState( taskManager.getFilter() );
}
private void updateState( TaskFilter filter ) {
if( null == filter || TaskFilter.EMPTY.equals( filter ) ) {
setSelected( false );
setToolTipText( NbBundle.getMessage( FiltersMenuButton.class, "HINT_SelectFilter" ) ); //NOI18N
FilterRepository.getDefault().setActive( null );
} else {
setSelected( true );
setToolTipText( filter.getName() );
FilterRepository.getDefault().setActive( filter );
}
}
private static void openFilterEditor() {
FilterRepository filterRep = FilterRepository.getDefault();
FilterRepository clone = (FilterRepository)filterRep.clone();
FilterEditor fe = new FilterEditor( clone );
if( fe.showWindow() ) {
filterRep.assign(clone);
TaskManagerImpl tm = TaskManagerImpl.getInstance();
tm.observe( tm.getScope(), filterRep.getActive() );
try {
filterRep.save();
} catch( IOException ioE ) {
Logger.getLogger( FiltersMenuButton.class.getName() ).log( Level.INFO, ioE.getMessage(), ioE );
}
}
}
}