Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.utils.ui.workbench / src / org / simantics / utils / ui / workbench / dialogs / ColorDialog.java
1 package org.simantics.utils.ui.workbench.dialogs;\r
2 \r
3 import java.io.IOException;\r
4 import java.util.Deque;\r
5 import java.util.LinkedList;\r
6 \r
7 import org.eclipse.core.runtime.preferences.InstanceScope;\r
8 import org.eclipse.jface.layout.GridLayoutFactory;\r
9 import org.eclipse.jface.preference.IPersistentPreferenceStore;\r
10 import org.eclipse.jface.preference.IPreferenceStore;\r
11 import org.eclipse.swt.SWT;\r
12 import org.eclipse.swt.graphics.Point;\r
13 import org.eclipse.swt.widgets.Button;\r
14 import org.eclipse.swt.widgets.Composite;\r
15 import org.eclipse.swt.widgets.Control;\r
16 import org.eclipse.swt.widgets.Display;\r
17 import org.eclipse.swt.widgets.Group;\r
18 import org.eclipse.swt.widgets.Shell;\r
19 import org.eclipse.ui.IMemento;\r
20 import org.eclipse.ui.preferences.ScopedPreferenceStore;\r
21 import org.simantics.utils.ui.ExceptionUtils;\r
22 import org.simantics.utils.ui.color.Color;\r
23 import org.simantics.utils.ui.workbench.StringMemento;\r
24 \r
25 /**\r
26  * ColorDialog that keeps track used colors.\r
27  * \r
28  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
29  *\r
30  */\r
31 public class ColorDialog extends org.simantics.utils.ui.color.ColorDialog{\r
32         \r
33         public ColorDialog(Shell parentShell) {\r
34                 super(parentShell);\r
35         }\r
36 \r
37     \r
38     protected Control createDialogArea(Composite parent) {\r
39         initRecent();\r
40         Composite composite = (Composite)super.createDialogArea(parent);\r
41                 Group recentGroup = new Group(composite, SWT.NONE);\r
42                 recentGroup.setText("Recent colors");\r
43                 GridLayoutFactory.fillDefaults().numColumns(8).spacing(2, 2).margins(4, 4).applyTo(recentGroup);\r
44                 int i = 0;\r
45                 for (Color c : recentColors) {\r
46                         i++;\r
47                         createColorButton(recentGroup, c);\r
48                 }\r
49                 org.eclipse.swt.graphics.Color c = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);\r
50                 Color color = new Color(c.getRGB());\r
51                 for ( ; i < MAX_RECENT_COLORS; i++) {\r
52                         Button button = createColorButton(recentGroup, color);\r
53                         button.setEnabled(false);\r
54                 }\r
55                 return composite;\r
56     }\r
57     \r
58     @Override\r
59     protected Point getInitialSize() {\r
60         return new Point(400, 450);\r
61     }\r
62     \r
63         private static final int MAX_RECENT_COLORS = 8;\r
64         \r
65         public static final String  RECENT_COLORS = "RECENT_COLORS";\r
66 \r
67     private static final String TAG_COLORS                = "color";\r
68     private static final String R_ATTR_NAME               = "r";\r
69     private static final String G_ATTR_NAME               = "g";\r
70     private static final String B_ATTR_NAME               = "b";\r
71     \r
72     private static final String PLUGIN_ID = "org.simantics.utils.ui.workbench";\r
73     \r
74     protected Deque<Color> recentColors;\r
75     \r
76     private void initRecent() {\r
77          IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, PLUGIN_ID);\r
78          String recentString = store.getString(RECENT_COLORS);\r
79          recentColors = decodeColors(recentString);\r
80     }\r
81     \r
82     private void storeRecent() {\r
83         Color color = getColor();\r
84         recentColors.remove(color);\r
85         recentColors.addFirst(color);\r
86         while(recentColors.size() > MAX_RECENT_COLORS)\r
87                 recentColors.removeLast();\r
88         \r
89         IPersistentPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, PLUGIN_ID);\r
90         store.putValue(RECENT_COLORS, encodeColors(recentColors));\r
91         \r
92         if (store.needsSaving())\r
93                 try { \r
94                         store.save();\r
95                 } catch (IOException e) {\r
96                         ExceptionUtils.logError(e);\r
97                 }\r
98     }\r
99     \r
100     @Override\r
101         protected void okPressed() {\r
102                 storeRecent();\r
103                 super.okPressed();\r
104         }\r
105     \r
106     public static Deque<Color> decodeColors(String recentColorsPref) {\r
107         Deque<Color> result = new LinkedList<Color>();\r
108         try {\r
109             StringMemento sm = new StringMemento(recentColorsPref);\r
110             for (IMemento m : sm.getChildren(TAG_COLORS)) {\r
111                 try {\r
112                         int r = m.getInteger(R_ATTR_NAME);\r
113                         int g = m.getInteger(G_ATTR_NAME);\r
114                         int b = m.getInteger(B_ATTR_NAME);\r
115                         Color c = new Color(r, g, b);\r
116                         result.add(c);\r
117                 } catch (Exception e) {\r
118                         \r
119                 }\r
120                 \r
121             }\r
122         } catch (IllegalArgumentException e) {\r
123         }\r
124         return result;\r
125     }\r
126     \r
127     public static String encodeColors(Deque<Color> recentColors) {\r
128         StringMemento sm = new StringMemento();\r
129         for (Color c : recentColors) {\r
130             IMemento m = sm.createChild(TAG_COLORS);\r
131             m.putInteger(R_ATTR_NAME, c.getR());\r
132             m.putInteger(G_ATTR_NAME, c.getG());\r
133             m.putInteger(B_ATTR_NAME, c.getB());\r
134         }\r
135         return sm.toString();\r
136     }\r
137 }\r