public DocumentationComponent( final DocumentationManager manager, final AnAction[] additionalActions) { myManager = manager; myIsEmpty = true; myIsShown = false; myEditorPane = new JEditorPane(UIUtil.HTML_MIME, "") { @Override public Dimension getPreferredScrollableViewportSize() { if (getWidth() == 0 || getHeight() == 0) { setSize(MAX_WIDTH, MAX_HEIGHT); } Insets ins = myEditorPane.getInsets(); View rootView = myEditorPane.getUI().getRootView(myEditorPane); rootView.setSize( MAX_WIDTH, MAX_HEIGHT); // Necessary! Without this line, size will not increase then you go // from small page to bigger one int prefHeight = (int) rootView.getPreferredSpan(View.Y_AXIS); prefHeight += ins.bottom + ins.top + myScrollPane.getHorizontalScrollBar().getMaximumSize().height; return new Dimension(MAX_WIDTH, Math.max(MIN_HEIGHT, Math.min(MAX_HEIGHT, prefHeight))); } { enableEvents(AWTEvent.KEY_EVENT_MASK); } @Override protected void processKeyEvent(KeyEvent e) { KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e); ActionListener listener = myKeyboardActions.get(keyStroke); if (listener != null) { listener.actionPerformed(new ActionEvent(DocumentationComponent.this, 0, "")); e.consume(); return; } super.processKeyEvent(e); } @Override protected void paintComponent(Graphics g) { GraphicsUtil.setupAntialiasing(g); super.paintComponent(g); } }; DataProvider helpDataProvider = new DataProvider() { @Override public Object getData(@NonNls String dataId) { return PlatformDataKeys.HELP_ID.is(dataId) ? DOCUMENTATION_TOPIC_ID : null; } }; myEditorPane.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, helpDataProvider); myText = ""; myEditorPane.setEditable(false); myEditorPane.setBackground(HintUtil.INFORMATION_COLOR); myEditorPane.setEditorKit(UIUtil.getHTMLEditorKit()); myScrollPane = new JBScrollPane(myEditorPane) { @Override protected void processMouseWheelEvent(MouseWheelEvent e) { if (!EditorSettingsExternalizable.getInstance().isWheelFontChangeEnabled() || !EditorUtil.isChangeFontSize(e)) { super.processMouseWheelEvent(e); return; } int change = Math.abs(e.getWheelRotation()); boolean increase = e.getWheelRotation() <= 0; EditorColorsManager colorsManager = EditorColorsManager.getInstance(); EditorColorsScheme scheme = colorsManager.getGlobalScheme(); FontSize newFontSize = scheme.getQuickDocFontSize(); for (; change > 0; change--) { if (increase) { newFontSize = newFontSize.larger(); } else { newFontSize = newFontSize.smaller(); } } if (newFontSize == scheme.getQuickDocFontSize()) { return; } scheme.setQuickDocFontSize(newFontSize); applyFontSize(); setFontSizeSliderSize(newFontSize); } }; myScrollPane.setBorder(null); myScrollPane.putClientProperty(DataManager.CLIENT_PROPERTY_DATA_PROVIDER, helpDataProvider); final MouseAdapter mouseAdapter = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { myManager.requestFocus(); myShowSettingsButton.hideSettings(); } }; myEditorPane.addMouseListener(mouseAdapter); Disposer.register( this, new Disposable() { @Override public void dispose() { myEditorPane.removeMouseListener(mouseAdapter); } }); final FocusAdapter focusAdapter = new FocusAdapter() { @Override public void focusLost(FocusEvent e) { Component previouslyFocused = WindowManagerEx.getInstanceEx() .getFocusedComponent(manager.getProject(getElement())); if (!(previouslyFocused == myEditorPane)) { if (myHint != null && !myHint.isDisposed()) myHint.cancel(); } } }; myEditorPane.addFocusListener(focusAdapter); Disposer.register( this, new Disposable() { @Override public void dispose() { myEditorPane.removeFocusListener(focusAdapter); } }); setLayout(new BorderLayout()); JLayeredPane layeredPane = new JBLayeredPane() { @Override public void doLayout() { final Rectangle r = getBounds(); for (Component component : getComponents()) { if (component instanceof JScrollPane) { component.setBounds(0, 0, r.width, r.height); } else { int insets = 2; Dimension d = component.getPreferredSize(); component.setBounds(r.width - d.width - insets, insets, d.width, d.height); } } } @Override public Dimension getPreferredSize() { Dimension editorPaneSize = myEditorPane.getPreferredScrollableViewportSize(); Dimension controlPanelSize = myControlPanel.getPreferredSize(); return new Dimension( Math.max(editorPaneSize.width, controlPanelSize.width), editorPaneSize.height + controlPanelSize.height); } }; layeredPane.add(myScrollPane); layeredPane.setLayer(myScrollPane, 0); mySettingsPanel = createSettingsPanel(); layeredPane.add(mySettingsPanel); layeredPane.setLayer(mySettingsPanel, JLayeredPane.POPUP_LAYER); add(layeredPane, BorderLayout.CENTER); setOpaque(true); myScrollPane.setViewportBorder(JBScrollPane.createIndentBorder()); final DefaultActionGroup actions = new DefaultActionGroup(); final BackAction back = new BackAction(); final ForwardAction forward = new ForwardAction(); actions.add(back); actions.add(forward); actions.add(myExternalDocAction = new ExternalDocAction()); back.registerCustomShortcutSet(CustomShortcutSet.fromString("LEFT"), this); forward.registerCustomShortcutSet(CustomShortcutSet.fromString("RIGHT"), this); myExternalDocAction.registerCustomShortcutSet(CustomShortcutSet.fromString("UP"), this); if (additionalActions != null) { for (final AnAction action : additionalActions) { actions.add(action); } } myToolBar = ActionManager.getInstance() .createActionToolbar(ActionPlaces.JAVADOC_TOOLBAR, actions, true); myControlPanel = new JPanel(); myControlPanel.setLayout(new BorderLayout()); myControlPanel.setBorder(IdeBorderFactory.createBorder(SideBorder.BOTTOM)); JPanel dummyPanel = new JPanel(); myElementLabel = new JLabel(); dummyPanel.setLayout(new BorderLayout()); dummyPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); dummyPanel.add(myElementLabel, BorderLayout.EAST); myControlPanel.add(myToolBar.getComponent(), BorderLayout.WEST); myControlPanel.add(dummyPanel, BorderLayout.CENTER); myControlPanel.add(myShowSettingsButton = new MyShowSettingsButton(), BorderLayout.EAST); myControlPanelVisible = false; final HyperlinkListener hyperlinkListener = new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { HyperlinkEvent.EventType type = e.getEventType(); if (type == HyperlinkEvent.EventType.ACTIVATED) { manager.navigateByLink(DocumentationComponent.this, e.getDescription()); } } }; myEditorPane.addHyperlinkListener(hyperlinkListener); Disposer.register( this, new Disposable() { @Override public void dispose() { myEditorPane.removeHyperlinkListener(hyperlinkListener); } }); registerActions(); updateControlState(); }
/** * Instantiates a new movie information panel. * * @param movieSelectionModel the movie selection model */ public MovieInformationPanel(MovieSelectionModel movieSelectionModel) { this.movieSelectionModel = movieSelectionModel; setLayout( new FormLayout( new ColumnSpec[] { ColumnSpec.decode("450px:grow"), }, new RowSpec[] { RowSpec.decode("fill:default:grow"), })); splitPaneVertical = new JSplitPane(); splitPaneVertical.setBorder(null); splitPaneVertical.setResizeWeight(0.9); splitPaneVertical.setContinuousLayout(true); splitPaneVertical.setOneTouchExpandable(true); splitPaneVertical.setOrientation(JSplitPane.VERTICAL_SPLIT); add(splitPaneVertical, "1, 1, fill, fill"); panelTop = new JPanel(); panelTop.setBorder(null); splitPaneVertical.setTopComponent(panelTop); panelTop.setLayout( new FormLayout( new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("200px:grow"), FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC, }, new RowSpec[] { RowSpec.decode("fill:default"), RowSpec.decode("top:pref:grow"), })); JPanel panelMovieHeader = new JPanel(); panelTop.add(panelMovieHeader, "2, 1, 3, 1, fill, top"); panelMovieHeader.setBorder(null); panelMovieHeader.setLayout(new BorderLayout(0, 0)); JPanel panelMovieTitle = new JPanel(); panelMovieHeader.add(panelMovieTitle, BorderLayout.NORTH); panelMovieTitle.setLayout(new BorderLayout(0, 0)); lblMovieName = new JLabel(""); TmmFontHelper.changeFont(lblMovieName, 1.33, Font.BOLD); panelMovieTitle.add(lblMovieName); JPanel panelRatingTagline = new JPanel(); panelMovieHeader.add(panelRatingTagline, BorderLayout.CENTER); panelRatingTagline.setLayout( new FormLayout( new ColumnSpec[] { FormFactory.DEFAULT_COLSPEC, FormFactory.DEFAULT_COLSPEC, FormFactory.DEFAULT_COLSPEC, FormFactory.UNRELATED_GAP_COLSPEC, ColumnSpec.decode("25px:grow"), }, new RowSpec[] { FormFactory.LINE_GAP_ROWSPEC, RowSpec.decode("24px"), FormFactory.DEFAULT_ROWSPEC, })); lblRating = new JLabel(""); panelRatingTagline.add(lblRating, "2, 2, left, center"); lblVoteCount = new JLabel(""); panelRatingTagline.add(lblVoteCount, "3, 2, left, center"); panelRatingStars = new StarRater(10, 1); panelRatingTagline.add(panelRatingStars, "1, 2, left, top"); panelRatingStars.setEnabled(false); lblTop250 = new JLabel(""); panelRatingTagline.add(lblTop250, "5, 2, left, default"); lblTagline = new JLabel(); panelRatingTagline.add(lblTagline, "1, 3, 5, 1, default, center"); panelMovieLogos = new JPanel(); panelMovieHeader.add(panelMovieLogos, BorderLayout.EAST); lblCertificationImage = new JLabel(); panelMovieLogos.add(lblCertificationImage); JLayeredPane layeredPaneImages = new JLayeredPane(); panelTop.add(layeredPaneImages, "1, 2, 4, 1, fill, fill"); layeredPaneImages.setLayout( new FormLayout( new ColumnSpec[] { ColumnSpec.decode("max(10px;default)"), ColumnSpec.decode("left:120px:grow"), ColumnSpec.decode("default:grow(10)"), }, new RowSpec[] { RowSpec.decode("max(10px;default)"), RowSpec.decode("top:180px:grow"), RowSpec.decode("fill:80px:grow(3)"), })); lblMovieBackground = new ImageLabel(false, true); lblMovieBackground.setAlternativeText(BUNDLE.getString("image.notfound.fanart")); // $NON-NLS-1$ lblMovieBackground.enableLightbox(); layeredPaneImages.add(lblMovieBackground, "1, 1, 3, 3, fill, fill"); lblMoviePoster = new ImageLabel(); lblMoviePoster.setAlternativeText(BUNDLE.getString("image.notfound.poster")); // $NON-NLS-1$ lblMoviePoster.enableLightbox(); layeredPaneImages.setLayer(lblMoviePoster, 1); layeredPaneImages.add(lblMoviePoster, "2, 2, fill, fill"); lblWatchedImage = new JLabel(); lblWatchedImage.setOpaque(false); layeredPaneImages.setLayer(lblWatchedImage, 2); layeredPaneImages.add(lblWatchedImage, "2, 2, left, top"); JPanel panelGenres = new MovieGenresPanel(movieSelectionModel); layeredPaneImages.setLayer(panelGenres, 2); layeredPaneImages.add(panelGenres, "2, 2, 2, 2, right, bottom"); JPanel panelLogos = new JPanel(); panelLogos.setOpaque(false); layeredPaneImages.setLayer(panelLogos, 2); layeredPaneImages.add(panelLogos, "2, 2, 2, 2, right, top"); panelLogos.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); lblMediaLogoResolution = new JLabel(""); panelLogos.add(lblMediaLogoResolution); lblMediaLogoVideoCodec = new JLabel(""); panelLogos.add(lblMediaLogoVideoCodec); lblMediaLogoAudio = new JLabel(""); panelLogos.add(lblMediaLogoAudio); JPanel panelBottom = new JPanel(); panelBottom.setLayout( new FormLayout( new ColumnSpec[] { ColumnSpec.decode("300px:grow"), }, new RowSpec[] { FormFactory.LINE_GAP_ROWSPEC, RowSpec.decode("fill:min:grow"), })); tabbedPaneMovieDetails = new JTabbedPane(JTabbedPane.TOP); panelBottom.add(tabbedPaneMovieDetails, "1, 2, fill, fill"); splitPaneVertical.setBottomComponent(panelBottom); panelDetails = new MovieDetailsPanel(movieSelectionModel); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.details"), null, panelDetails, null); // $NON-NLS-1$ panelOverview = new JPanel(); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.plot"), null, panelOverview, null); // $NON-NLS-1$ panelOverview.setLayout( new FormLayout( new ColumnSpec[] { ColumnSpec.decode("200px:grow"), }, new RowSpec[] { FormFactory.LINE_GAP_ROWSPEC, RowSpec.decode("fill:default:grow"), })); // panelMovieDetails.add(tabbedPaneMovieDetails, "2, 3, fill, fill"); JScrollPane scrollPaneOverview = new JScrollPane(); scrollPaneOverview.setBorder(null); panelOverview.add(scrollPaneOverview, "1, 2, fill, fill"); tpOverview = new JTextPane(); tpOverview.setOpaque(false); tpOverview.setEditable(false); scrollPaneOverview.setViewportView(tpOverview); panelMovieCrew = new MovieCrewPanel(movieSelectionModel); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.crew"), null, panelMovieCrew, null); // $NON-NLS-1$ MovieActorPanel panelMovieActors = new MovieActorPanel(movieSelectionModel); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.cast"), null, panelMovieActors, null); // $NON-NLS-1$ panelMediaInformation = new MovieMediaInformationPanel(movieSelectionModel); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.mediainformation"), null, panelMediaInformation, null); //$NON-NLS-1$ panelMediaFiles = new MovieMediaFilesPanel(movieSelectionModel); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.mediafiles"), null, panelMediaFiles, null); // $NON-NLS-1$ final List<MediaFile> mediaFiles = new ArrayList<MediaFile>(); final ImagePanel panelArtwork = new ImagePanel(mediaFiles); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.artwork"), null, panelArtwork, null); // $NON-NLS-1$ panelMovieTrailer = new MovieTrailerPanel(movieSelectionModel); tabbedPaneMovieDetails.addTab( BUNDLE.getString("metatag.trailer"), null, panelMovieTrailer, null); // $NON-NLS-1$ // beansbinding init initDataBindings(); // manual coded binding PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent propertyChangeEvent) { String property = propertyChangeEvent.getPropertyName(); Object source = propertyChangeEvent.getSource(); // react on selection of a movie and change of a movie if (source instanceof MovieSelectionModel || (source instanceof Movie && MEDIA_FILES.equals(property))) { Movie movie = null; if (source instanceof MovieSelectionModel) { movie = ((MovieSelectionModel) source).getSelectedMovie(); } if (source instanceof Movie) { movie = (Movie) source; } if (movie != null) { if (movie.getTop250() > 0) { lblTop250.setText("Top 250: #" + movie.getTop250()); } else { lblTop250.setText(""); } lblMovieBackground.setImagePath(movie.getArtworkFilename(MediaFileType.FANART)); lblMoviePoster.setImagePath(movie.getArtworkFilename(MediaFileType.POSTER)); synchronized (mediaFiles) { mediaFiles.clear(); for (MediaFile mediafile : movie.getMediaFiles()) { if (mediafile.isGraphic()) { mediaFiles.add(mediafile); } } panelArtwork.rebuildPanel(); } } } if ((source.getClass() == Movie.class && FANART.equals(property))) { Movie movie = (Movie) source; lblMovieBackground.clearImage(); lblMovieBackground.setImagePath(movie.getArtworkFilename(MediaFileType.FANART)); } if ((source.getClass() == Movie.class && POSTER.equals(property))) { Movie movie = (Movie) source; lblMoviePoster.clearImage(); lblMoviePoster.setImagePath(movie.getArtworkFilename(MediaFileType.POSTER)); } if ((source.getClass() == Movie.class && TOP250.equals(property))) { Movie movie = (Movie) source; if (movie.getTop250() > 0) { lblTop250.setText( BUNDLE.getString("metatag.top250") + ": #" + movie.getTop250()); // $NON-NLS-1$ } else { lblTop250.setText(""); } } } }; movieSelectionModel.addPropertyChangeListener(propertyChangeListener); }