/* * Created on Jan 18, 2006 * * Copyright (c) 2006 P.J.Leonard * * http://www.frinika.com * * This file is part of Frinika. * * Frinika is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Frinika is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Frinika; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.frinika.sequencer.gui.partview; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JSplitPane; import com.frinika.gui.ToolbarSeperator; import com.frinika.project.ProjectContainer; import com.frinika.project.gui.ProjectFrame; import com.frinika.sequencer.gui.ItemPanel; import com.frinika.sequencer.gui.ItemRollToolBar; import com.frinika.sequencer.gui.ItemScrollPane; import com.frinika.sequencer.gui.Layout; import com.frinika.sequencer.model.Lane; import com.frinika.sequencer.model.Part; import com.frinika.sequencer.model.ProjectLane; import static com.frinika.localization.CurrentLocale.getMessage; /** * Top level panel for the piano roll. * * @author pjl * */ public class PartViewEditor extends ItemScrollPane { private static final long serialVersionUID = 1L; PartView partView; // VoiceView voiceView; LaneHeaderPanel laneHeaderPanel; public void showNewMenu(Component caller) { partView.getProjectFrame().newLaneMenu.show(caller, 0, 0); } public PartViewEditor(final ProjectFrame frame) { final ProjectContainer project=frame.getProjectContainer(); partView = new PartView(frame, this); Vector<ItemPanel> clients=new Vector<ItemPanel>(); clients.add(partView); ItemRollToolBar toolBar = new ItemRollToolBar(clients,frame.getProjectContainer()); JPanel new_panel = new JPanel(); new_panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); new_panel.setBorder(BorderFactory.createEmptyBorder(4,4,4,4)); new_panel.setOpaque(false); Insets insets = new Insets(0, 0, 0, 0); final JButton new_button = new JButton(ProjectFrame.getIconResource("new_track.gif")); new_button.setText(getMessage("new_track")) ; new_button.setMargin(insets); new_button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showNewMenu(new_button); } }); new_panel.add(new_button); JPanel sep = new JPanel(); sep.setOpaque(false); sep.setMinimumSize(new Dimension(5,5)); new_panel.add(sep); final JButton up_button = new JButton(ProjectFrame.getIconResource("uparrow.gif")); up_button.setMargin(insets); up_button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Collection<Lane> selected_lane = partView.getProjectContainer().getLaneSelection().getSelected(); if(selected_lane.size() == 1) { List<Lane> c = partView.getProjectContainer().getProjectLane().getChildren(); Lane lane = selected_lane.iterator().next(); if(lane instanceof ProjectLane) return; int li = c.indexOf(lane); if(li == 0) return; li--; partView.getProjectContainer().getEditHistoryContainer().mark("Move Lane Up"); partView.getProjectContainer().remove(lane); partView.getProjectContainer().add(li, lane); partView.getProjectContainer().getEditHistoryContainer().notifyEditHistoryListeners(); } } }); new_panel.add(up_button); final JButton down_button = new JButton(ProjectFrame.getIconResource("downarrow.gif")); down_button.setMargin(insets); down_button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Collection<Lane> selected_lane = partView.getProjectContainer().getLaneSelection().getSelected(); if(selected_lane.size() == 1) { List<Lane> c = partView.getProjectContainer().getProjectLane().getChildren(); Lane lane = selected_lane.iterator().next(); if(lane instanceof ProjectLane) return; int li = c.indexOf(lane); if(li == c.size() - 1) return; li++; partView.getProjectContainer().getEditHistoryContainer().mark("Move Lane Down"); partView.getProjectContainer().remove(lane); partView.getProjectContainer().add(li, lane); partView.getProjectContainer().getEditHistoryContainer().notifyEditHistoryListeners(); } } }); new_panel.add(down_button); toolBar.add(new_panel, 0); toolBar.add(new ToolbarSeperator(),1); partView.setToolBar(toolBar); setView(partView); toolBar.addButtonToTools("scissors16", "split", getMessage("sequencer.partview.split_part_tool_tip")); toolBar.addButtonToTools("glue", "glue", getMessage("sequencer.partview.glue_part_tool_tip")); // toolBar.add(new ToolbarSeperator(),1); // toolBar.add(new ToolbarSeperator()); JButton palette = new JButton(ProjectFrame .getIconResource("pallete.png")); palette.setMargin(insets); palette.setToolTipText(getMessage("sequencer.partview.colour_palette_tip")); toolBar.add(palette); palette.addActionListener(new ActionListener() { JColorChooser colorChooser; public void actionPerformed(ActionEvent e) { if (colorChooser == null) colorChooser = new JColorChooser(); colorChooser.setPreviewPanel(new JPanel()); JDialog dialog = JColorChooser.createDialog(frame, "Part Colour", true, colorChooser, (ActionListener) null, (ActionListener) null); dialog.setVisible(true); Color col = colorChooser.getColor(); if (col != null) for (Part part : project.getPartSelection().getSelected()) { part.setColor(col); } project.getEditHistoryContainer().notifyEditHistoryListeners(); } }); JSplitPane split = new JSplitPane(); split.setRightComponent(partView); add(split, BorderLayout.CENTER); setToolBar(toolBar); // int maxY = 10 * Layout.getLaneHeight; // partView.yRangeModel.setRangeProperties(0, getHeight(), 0, maxY,false); // vertScroll.setValues(0, getHeight(), 0, maxY); vertScroll.setModel(partView.getYRangeModel()); // horizScroll.setValues(0, 10, 0, x); // horizScroll.setUnitIncrement(20); horizScroll.setModel(partView.getXRangeModel()); laneHeaderPanel = new LaneHeaderPanel(partView,frame); split.setLeftComponent(laneHeaderPanel); vertScroll.addAdjustmentListener(laneHeaderPanel); partView.setLaneHeader(laneHeaderPanel); rebuild(); } public PartView getPartView() { return partView; } protected void rebuild() { // TODO this is naff laneHeaderPanel.visibleLanes.rebuild(); int maxY = 50 * Layout.getLaneHeightScale(); partView.getYRangeModel().setRangeProperties(0, getHeight(), 0, maxY,false); partView.setDirty(); partView.repaint(); laneHeaderPanel.rePositionItems(); laneHeaderPanel.repaint(); } @Override protected void vertZoom(int inc) { Layout.laneHeightIndex += inc; Layout.laneHeightIndex = Math.min(Layout.laneHeightIndex,Layout.laneItemHeights.length-1); Layout.laneHeightIndex = Math.max(Layout.laneHeightIndex,0); // TODO Auto-generated method stub } }