📄 header.java
字号:
/** * Copyright 2004 Carlos Silva A. * * Licensed 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 jgantt.view.gantt;import java.awt.AWTEvent;import java.awt.Dimension;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Insets;import java.awt.Point;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.JCheckBoxMenuItem;import javax.swing.JComponent;import javax.swing.JMenuItem;import javax.swing.JPopupMenu;import jgantt.model.DateOrganizer;import jgantt.model.GraphColors;import jgantt.model.ViewOptions;import jgantt.view.adapters.ProjectViewModel;import jgantt.view.adapters.ProjectViewModelChange;import jgantt.view.adapters.ProjectViewModelListener;/** * Header representa la cabecera de la carta gantt. * * <p> * $Date: 2005/06/12 09:53:03 $ * </p> * * @version $Revision: 1.20 $ * @author {user} */public class Header extends JComponent implements ProjectViewModelListener, ViewOptions.Observer { private static final long serialVersionUID = 3546076977803966519L; ProjectViewModel pvModel = null; ViewOptions viewOptions = null; /** * Constructor * * @param model * modelo del proyecto * @param vo * Opciones de visualizacion */ public Header(ProjectViewModel pvm) { super(); assignViewModel(pvm); pvModel.addListener(this); // setBackground(graphColors.background); setOpaque(true); setPreferredSize(new Dimension(1200, viewOptions.headerHeight)); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } /** * Pintado de la imagen header con divisiones mayores y menores. */ public void paintComponent(Graphics g) { super.paintComponent(g); paintComponent(g, getBounds()); } /** * Funcion de pintado de apoyo (sirve tambien para generar imagenes). * * @param g * @param bounds */ public void paintComponent(Graphics g, Rectangle bounds) { super.paintComponent(g); GraphColors graphColors = pvModel.getProject().getGraphColors(); Rectangle mayorBounds = new Rectangle(bounds); Rectangle minorBounds = new Rectangle(); int x, y; g.setFont(viewOptions.divFont); g.setFont(new Font("宋体", 0, 12)); Insets titles = new Insets(0, 0, viewOptions.headerHeight, bounds.width); int divHeight = viewOptions.divHeight; int divWidth = viewOptions.divWidth; // fondo g.setColor(graphColors.titleBg); g.fillRect(mayorBounds.x, mayorBounds.y, mayorBounds.width, mayorBounds.height); // linea intermedia g.setColor(graphColors.titleFg); g.drawLine(mayorBounds.x, mayorBounds.y + divHeight, mayorBounds.width + mayorBounds.x, mayorBounds.y + divHeight); // minor divisions g.setColor(graphColors.titleFg); y = titles.top + divHeight; java.util.Calendar c = java.util.Calendar.getInstance(); c.setTime(viewOptions.startDate); int visibleDivs = 1 + (int) (bounds.width / divWidth); for (int i = 0; i < visibleDivs; i++) { x = titles.left + viewOptions.divX[i]; g.drawLine(x, y, x, titles.bottom); } // minor labels g.setColor(graphColors.text); y = titles.top + divHeight; String labels[]; if (viewOptions.minDivFormat == java.util.Calendar.DAY_OF_WEEK) labels = ViewOptions.dayNameLabels; else labels = ViewOptions.numberLabels; int delta = 0; // Logger.log(5,"visibleDivs="+visibleDivs); FontMetrics fm = g.getFontMetrics(); for (int i = 0; i < visibleDivs; i++) { x = titles.left + viewOptions.divX[i]; c.setTime(new Date(viewOptions.divTimes[i])); int d = c.get(viewOptions.minDivFormat); String toPrint = labels[d]; int w = fm.stringWidth(toPrint); int dx = 1 + (int) ((viewOptions.divWidth - w) / 2); g.drawString(toPrint, x + dx, y + divHeight - 2); } // mayor divisions preamble // truncar la fecha de partida a la unidad mayor c.setTime(viewOptions.startDate); switch (viewOptions.majDivUnit) { case java.util.Calendar.WEEK_OF_YEAR: c.set(java.util.Calendar.DAY_OF_WEEK, 2); break; case java.util.Calendar.MONTH: c.set(java.util.Calendar.DATE, 1); } g.setFont(viewOptions.stdFont); g.setFont(new Font("宋体", 0, 12)); // major divisions & labels y = titles.top; ; SimpleDateFormat majFormat = new SimpleDateFormat( viewOptions.majDivFormat); for (x = titles.left; x <= (titles.right + divWidth);) { Date d = c.getTime(); long t = d.getTime(); x = titles.left + (int) ((t - viewOptions.t0) / viewOptions.msPixel); // division mayor g.setColor(graphColors.titleFg); g.drawLine(x, y, x, titles.bottom - divHeight); // texto division mayor g.setColor(graphColors.text); String toPrint = majFormat.format(c.getTime()); g.drawString(toPrint, x + 5, y + divHeight - 3); c.add(viewOptions.majDivUnit, viewOptions.majDivMult); } g.setColor(graphColors.titleFg); g.drawLine(0, bounds.height - 1, bounds.width, bounds.height - 1); } /** * Eventos del modelo * * @see jgantt.view.adapters.ProjectViewModelListener#projectChanged(jgantt.view.adapters.ProjectViewModelChange) */ public void viewModelChanged(ProjectViewModelChange c) { if (c.getId() == ProjectViewModelChange.NEW_PROJECT_LOADED) assignViewModel(c.getProjectViewModel()); } /** * */ public void assignViewModel(ProjectViewModel pvm) { if (viewOptions != null) viewOptions.removeObserver(this); pvModel = pvm; viewOptions = pvm.getProject().getViewOptions(); viewOptions.addObserver(this); } /** * Repinta la ventana cuando cambian opciones de visualizacion * */ public void viewOptionsChanged() { repaint(); } public void paintHeader(Graphics g, Rectangle r) { paintComponent(g, r); } class DateActionListener implements ActionListener { public void actionPerformed(ActionEvent ev) { String ac = ev.getActionCommand(); if (!(ev.getSource() instanceof JMenuItem)) return; JMenuItem mi = (JMenuItem) ev.getSource(); Date dia = new Date(Long.parseLong(ac)); DateOrganizer dOrg = pvModel.getProject().getDateOrganizer(); dOrg.setLaborable(dia, mi.isSelected()); /* * if (mi.isSelected()) { dOrg.removeHoliday(dia); } else { * dOrg.addHoliday(dia); } */ // forzar un repaint pvModel.getProject().forceRecalc(); } } /** * Mostrar menu para definir feriados.... */ protected void processMouseEvent(MouseEvent ev) { super.processMouseEvent(ev); if (ev.getID() == MouseEvent.MOUSE_PRESSED) { if ((ev.getModifiers() & MouseEvent.BUTTON3_MASK) > 0) { Point p = ev.getPoint(); if (p.y > viewOptions.divHeight) { // click en un dia Date dia = new Date(viewOptions.t0 + viewOptions.msPixel * p.x); JPopupMenu popup = new JPopupMenu("Data Change"); ActionListener al = new DateActionListener(); SimpleDateFormat sdf = new SimpleDateFormat( viewOptions.dateFormat); popup.add(new JMenuItem(sdf.format(dia))); JCheckBoxMenuItem mi = new JCheckBoxMenuItem("Laborable"); DateOrganizer dOrg = pvModel.getProject() .getDateOrganizer(); mi.setSelected(dOrg.isLaborable(dia)); mi.setActionCommand(String.valueOf(dia.getTime())); mi.addActionListener(al); popup.add(mi); add(popup); popup.show(this, p.x, p.y); } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -